Merge "Clean up TypedArray docs & formatting, remove coercion warnings"
diff --git a/CleanSpec.mk b/CleanSpec.mk
index d660224..bd3227f 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -225,6 +225,8 @@
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/RsFountainFbo_intermediates)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/src/telecomm/java/com/android/internal/telecomm)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/com/android/internal/widget/ILockSettingsObserver.java)
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/SystemUI_intermediates/)
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/Keyguard_intermediates/)
# ******************************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST ABOVE THIS BANNER
diff --git a/api/current.txt b/api/current.txt
index 0eb90e3..761a7bb 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -502,6 +502,8 @@
field public static final int drawablePadding = 16843121; // 0x1010171
field public static final int drawableRight = 16843120; // 0x1010170
field public static final int drawableStart = 16843666; // 0x1010392
+ field public static final int drawableTint = 16843990; // 0x10104d6
+ field public static final int drawableTintMode = 16843991; // 0x10104d7
field public static final int drawableTop = 16843117; // 0x101016d
field public static final int drawingCacheQuality = 16842984; // 0x10100e8
field public static final int dropDownAnchor = 16843363; // 0x1010263
@@ -11699,6 +11701,8 @@
method public android.graphics.drawable.Drawable.ConstantState getConstantState();
method public android.graphics.drawable.Drawable getCurrent();
method public android.graphics.Rect getDirtyBounds();
+ method public boolean getDither();
+ method public boolean getFilterBitmap();
method public int getIntrinsicHeight();
method public int getIntrinsicWidth();
method public final int getLevel();
@@ -24196,6 +24200,13 @@
field public static final int TYPE_KEEP_TOGETHER = 1; // 0x1
}
+ public static final class ContactsContract.Authorization {
+ ctor public ContactsContract.Authorization();
+ field public static final java.lang.String AUTHORIZATION_METHOD = "authorize";
+ field public static final java.lang.String KEY_AUTHORIZED_URI = "authorized_uri";
+ field public static final java.lang.String KEY_URI_TO_AUTHORIZE = "uri_to_authorize";
+ }
+
protected static abstract interface ContactsContract.BaseSyncColumns {
field public static final java.lang.String SYNC1 = "sync1";
field public static final java.lang.String SYNC2 = "sync2";
@@ -24827,6 +24838,16 @@
field public static final android.net.Uri CONTENT_URI;
}
+ public static final class ContactsContract.ProviderStatus {
+ field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/provider_status";
+ field public static final android.net.Uri CONTENT_URI;
+ field public static final java.lang.String STATUS = "status";
+ field public static final int STATUS_CHANGING_LOCALE = 3; // 0x3
+ field public static final int STATUS_NORMAL = 0; // 0x0
+ field public static final int STATUS_NO_ACCOUNTS_NO_CONTACTS = 4; // 0x4
+ field public static final int STATUS_UPGRADING = 1; // 0x1
+ }
+
public static final class ContactsContract.QuickContact {
ctor public ContactsContract.QuickContact();
method public static void showQuickContact(android.content.Context, android.view.View, android.net.Uri, int, java.lang.String[]);
@@ -28645,6 +28666,7 @@
method public static java.lang.String formatNumber(java.lang.String, java.lang.String);
method public static java.lang.String formatNumber(java.lang.String, java.lang.String, java.lang.String);
method public static java.lang.String formatNumberToE164(java.lang.String, java.lang.String);
+ method public static java.lang.String formatNumberToRFC3966(java.lang.String, java.lang.String);
method public static deprecated int getFormatTypeForLocale(java.util.Locale);
method public static java.lang.String getNumberFromIntent(android.content.Intent, android.content.Context);
method public static java.lang.String getStrippedReversed(java.lang.String);
@@ -28792,6 +28814,7 @@
field public static final int MMS_ERROR_HTTP_FAILURE = 4; // 0x4
field public static final int MMS_ERROR_INVALID_APN = 2; // 0x2
field public static final int MMS_ERROR_IO_ERROR = 5; // 0x5
+ field public static final int MMS_ERROR_NO_DATA_NETWORK = 8; // 0x8
field public static final int MMS_ERROR_RETRY = 6; // 0x6
field public static final int MMS_ERROR_UNABLE_CONNECT_MMS = 3; // 0x3
field public static final int MMS_ERROR_UNSPECIFIED = 1; // 0x1
@@ -28884,6 +28907,7 @@
}
public class SubscriptionManager {
+ method public void addOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener);
method public static android.telephony.SubscriptionManager from(android.content.Context);
method public android.telephony.SubscriptionInfo getActiveSubscriptionInfo(int);
method public int getActiveSubscriptionInfoCount();
@@ -28891,8 +28915,7 @@
method public android.telephony.SubscriptionInfo getActiveSubscriptionInfoForSimSlotIndex(int);
method public java.util.List<android.telephony.SubscriptionInfo> getActiveSubscriptionInfoList();
method public boolean isNetworkRoaming(int);
- method public void registerOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener);
- method public void unregisterOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener);
+ method public void removeOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener);
}
public static class SubscriptionManager.OnSubscriptionsChangedListener {
@@ -33590,6 +33613,7 @@
method public boolean dispatchKeyShortcutEvent(android.view.KeyEvent);
method public boolean dispatchNestedFling(float, float, boolean);
method public boolean dispatchNestedPreFling(float, float);
+ method public boolean dispatchNestedPrePerformAccessibilityAction(int, android.os.Bundle);
method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
method public boolean dispatchNestedScroll(int, int, int, int, int[]);
method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
@@ -33625,6 +33649,7 @@
method public android.view.animation.Animation getAnimation();
method public android.os.IBinder getApplicationWindowToken();
method public android.graphics.drawable.Drawable getBackground();
+ method public int getBackgroundColor();
method public android.content.res.ColorStateList getBackgroundTintList();
method public android.graphics.PorterDuff.Mode getBackgroundTintMode();
method public int getBaseline();
@@ -34402,6 +34427,7 @@
method protected abstract void onLayout(boolean, int, int, int, int);
method public boolean onNestedFling(android.view.View, float, float, boolean);
method public boolean onNestedPreFling(android.view.View, float, float);
+ method public boolean onNestedPrePerformAccessibilityAction(android.view.View, int, android.os.Bundle);
method public void onNestedPreScroll(android.view.View, int, int, int[]);
method public void onNestedScroll(android.view.View, int, int, int, int);
method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
@@ -34550,6 +34576,7 @@
method public abstract void notifySubtreeAccessibilityStateChanged(android.view.View, android.view.View, int);
method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
method public abstract boolean onNestedPreFling(android.view.View, float, float);
+ method public abstract boolean onNestedPrePerformAccessibilityAction(android.view.View, int, android.os.Bundle);
method public abstract void onNestedPreScroll(android.view.View, int, int, int[]);
method public abstract void onNestedScroll(android.view.View, int, int, int, int);
method public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int);
@@ -38204,9 +38231,11 @@
ctor public PopupMenu(android.content.Context, android.view.View, int, int, int);
method public void dismiss();
method public android.view.View.OnTouchListener getDragToOpenListener();
+ method public int getGravity();
method public android.view.Menu getMenu();
method public android.view.MenuInflater getMenuInflater();
method public void inflate(int);
+ method public void setGravity(int);
method public void setOnDismissListener(android.widget.PopupMenu.OnDismissListener);
method public void setOnMenuItemClickListener(android.widget.PopupMenu.OnMenuItemClickListener);
method public void show();
@@ -38239,6 +38268,7 @@
method public int getInputMethodMode();
method public int getMaxAvailableHeight(android.view.View);
method public int getMaxAvailableHeight(android.view.View, int);
+ method public boolean getOverlapAnchor();
method public int getSoftInputMode();
method public int getWidth();
method public boolean isAboveAnchor();
@@ -38261,6 +38291,7 @@
method public void setInputMethodMode(int);
method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener);
method public void setOutsideTouchable(boolean);
+ method public void setOverlapAnchor(boolean);
method public void setSoftInputMode(int);
method public void setSplitTouchEnabled(boolean);
method public void setTouchInterceptor(android.view.View.OnTouchListener);
@@ -39007,6 +39038,8 @@
method public boolean extractText(android.view.inputmethod.ExtractedTextRequest, android.view.inputmethod.ExtractedText);
method public final int getAutoLinkMask();
method public int getCompoundDrawablePadding();
+ method public android.content.res.ColorStateList getCompoundDrawableTintList();
+ method public android.graphics.PorterDuff.Mode getCompoundDrawableTintMode();
method public android.graphics.drawable.Drawable[] getCompoundDrawables();
method public android.graphics.drawable.Drawable[] getCompoundDrawablesRelative();
method public int getCompoundPaddingBottom();
@@ -39106,6 +39139,8 @@
method public void setAllCaps(boolean);
method public final void setAutoLinkMask(int);
method public void setCompoundDrawablePadding(int);
+ method public void setCompoundDrawableTintList(android.content.res.ColorStateList);
+ method public void setCompoundDrawableTintMode(android.graphics.PorterDuff.Mode);
method public void setCompoundDrawables(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
method public void setCompoundDrawablesRelative(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
method public void setCompoundDrawablesRelativeWithIntrinsicBounds(int, int, int, int);
diff --git a/core/java/android/alsa/AlsaCardsParser.java b/core/java/android/alsa/AlsaCardsParser.java
index 8b44881..8f9c56c 100644
--- a/core/java/android/alsa/AlsaCardsParser.java
+++ b/core/java/android/alsa/AlsaCardsParser.java
@@ -22,46 +22,58 @@
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
-import java.util.Vector;
+import java.util.ArrayList;
/**
* @hide Retrieves information from an ALSA "cards" file.
*/
public class AlsaCardsParser {
private static final String TAG = "AlsaCardsParser";
+ protected static final boolean DEBUG = true;
- private static LineTokenizer tokenizer_ = new LineTokenizer(" :[]");
+ private static LineTokenizer mTokenizer = new LineTokenizer(" :[]");
+
+ private ArrayList<AlsaCardRecord> mCardRecords = new ArrayList<AlsaCardRecord>();
public class AlsaCardRecord {
+ private static final String TAG = "AlsaCardRecord";
+ private static final String kUsbCardKeyStr = "at usb-";
+
public int mCardNum = -1;
public String mField1 = "";
public String mCardName = "";
public String mCardDescription = "";
+ public boolean mIsUsb = false;
public AlsaCardRecord() {}
public boolean parse(String line, int lineIndex) {
int tokenIndex = 0;
int delimIndex = 0;
+
if (lineIndex == 0) {
// line # (skip)
- tokenIndex = tokenizer_.nextToken(line, tokenIndex);
- delimIndex = tokenizer_.nextDelimiter(line, tokenIndex);
+ tokenIndex = mTokenizer.nextToken(line, tokenIndex);
+ delimIndex = mTokenizer.nextDelimiter(line, tokenIndex);
+
+ // mCardNum
+ mCardNum = Integer.parseInt(line.substring(tokenIndex, delimIndex));
// mField1
- tokenIndex = tokenizer_.nextToken(line, delimIndex);
- delimIndex = tokenizer_.nextDelimiter(line, tokenIndex);
+ tokenIndex = mTokenizer.nextToken(line, delimIndex);
+ delimIndex = mTokenizer.nextDelimiter(line, tokenIndex);
mField1 = line.substring(tokenIndex, delimIndex);
// mCardName
- tokenIndex = tokenizer_.nextToken(line, delimIndex);
- // delimIndex = tokenizer_.nextDelimiter(line, tokenIndex);
+ tokenIndex = mTokenizer.nextToken(line, delimIndex);
mCardName = line.substring(tokenIndex);
+
// done
} else if (lineIndex == 1) {
- tokenIndex = tokenizer_.nextToken(line, 0);
+ tokenIndex = mTokenizer.nextToken(line, 0);
if (tokenIndex != -1) {
mCardDescription = line.substring(tokenIndex);
+ mIsUsb = mCardDescription.contains(kUsbCardKeyStr);
}
}
@@ -73,44 +85,128 @@
}
}
- private Vector<AlsaCardRecord> cardRecords_ = new Vector<AlsaCardRecord>();
+ public AlsaCardsParser() {}
public void scan() {
- cardRecords_.clear();
- final String cardsFilePath = "/proc/asound/cards";
- File cardsFile = new File(cardsFilePath);
- try {
- FileReader reader = new FileReader(cardsFile);
- BufferedReader bufferedReader = new BufferedReader(reader);
- String line = "";
- while ((line = bufferedReader.readLine()) != null) {
- AlsaCardRecord cardRecord = new AlsaCardRecord();
- cardRecord.parse(line, 0);
- cardRecord.parse(line = bufferedReader.readLine(), 1);
- cardRecords_.add(cardRecord);
- }
- reader.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
+ if (DEBUG) {
+ Slog.i(TAG, "AlsaCardsParser.scan()");
+ }
+ mCardRecords = new ArrayList<AlsaCardRecord>();
- public AlsaCardRecord getCardRecordAt(int index) {
- return cardRecords_.get(index);
- }
+ final String cardsFilePath = "/proc/asound/cards";
+ File cardsFile = new File(cardsFilePath);
+ try {
+ FileReader reader = new FileReader(cardsFile);
+ BufferedReader bufferedReader = new BufferedReader(reader);
+ String line = "";
+ while ((line = bufferedReader.readLine()) != null) {
+ AlsaCardRecord cardRecord = new AlsaCardRecord();
+ if (DEBUG) {
+ Slog.i(TAG, " " + line);
+ }
+ cardRecord.parse(line, 0);
- public int getNumCardRecords() {
- return cardRecords_.size();
- }
+ line = bufferedReader.readLine();
+ if (DEBUG) {
+ Slog.i(TAG, " " + line);
+ }
+ cardRecord.parse(line, 1);
- public void Log() {
- int numCardRecs = getNumCardRecords();
- for (int index = 0; index < numCardRecs; ++index) {
- Slog.w(TAG, "usb:" + getCardRecordAt(index).textFormat());
- }
+ mCardRecords.add(cardRecord);
+ }
+ reader.close();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
}
- public AlsaCardsParser() {}
+ public ArrayList<AlsaCardRecord> getScanRecords() {
+ return mCardRecords;
+ }
+
+ public AlsaCardRecord getCardRecordAt(int index) {
+ return mCardRecords.get(index);
+ }
+
+ public AlsaCardRecord getCardRecordFor(int cardNum) {
+ for (AlsaCardRecord rec : mCardRecords) {
+ if (rec.mCardNum == cardNum) {
+ return rec;
+ }
+ }
+
+ return null;
+ }
+
+ public int getNumCardRecords() {
+ return mCardRecords.size();
+ }
+
+ public boolean isCardUsb(int cardNum) {
+ for (AlsaCardRecord rec : mCardRecords) {
+ if (rec.mCardNum == cardNum) {
+ return rec.mIsUsb;
+ }
+ }
+
+ return false;
+ }
+
+ // return -1 if none found
+ public int getDefaultUsbCard() {
+ // Choose the most-recently added EXTERNAL card
+ // or return the first added EXTERNAL card?
+ for (AlsaCardRecord rec : mCardRecords) {
+ if (rec.mIsUsb) {
+ return rec.mCardNum;
+ }
+ }
+
+ return -1;
+ }
+
+ public int getDefaultCard() {
+ // return an external card if possible
+ int card = getDefaultUsbCard();
+
+ if (card < 0 && getNumCardRecords() > 0) {
+ // otherwise return the (internal) card with the highest number
+ card = getCardRecordAt(getNumCardRecords() - 1).mCardNum;
+ }
+ return card;
+ }
+
+ static public boolean hasCardNumber(ArrayList<AlsaCardRecord> recs, int cardNum) {
+ for (AlsaCardRecord cardRec : recs) {
+ if (cardRec.mCardNum == cardNum) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public ArrayList<AlsaCardRecord> getNewCardRecords(ArrayList<AlsaCardRecord> prevScanRecs) {
+ ArrayList<AlsaCardRecord> newRecs = new ArrayList<AlsaCardRecord>();
+ for (AlsaCardRecord rec : mCardRecords) {
+ // now scan to see if this card number is in the previous scan list
+ if (!hasCardNumber(prevScanRecs, rec.mCardNum)) {
+ newRecs.add(rec);
+ }
+ }
+ return newRecs;
+ }
+
+ //
+ // Logging
+ //
+ public void Log(String heading) {
+ if (DEBUG) {
+ Slog.i(TAG, heading);
+ for (AlsaCardRecord cardRec : mCardRecords) {
+ Slog.i(TAG, cardRec.textFormat());
+ }
+ }
+ }
}
diff --git a/core/java/android/alsa/AlsaDevicesParser.java b/core/java/android/alsa/AlsaDevicesParser.java
index 82cc1ae..3581cb6 100644
--- a/core/java/android/alsa/AlsaDevicesParser.java
+++ b/core/java/android/alsa/AlsaDevicesParser.java
@@ -21,7 +21,7 @@
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
-import java.util.Vector;
+import java.util.ArrayList;
/**
* @hide
@@ -29,6 +29,7 @@
*/
public class AlsaDevicesParser {
private static final String TAG = "AlsaDevicesParser";
+ protected static final boolean DEBUG = false;
private static final int kIndex_CardDeviceField = 5;
private static final int kStartIndex_CardNum = 6;
@@ -58,8 +59,7 @@
int mDeviceType = kDeviceType_Unknown;
int mDeviceDir = kDeviceDir_Unknown;
- public AlsaDeviceRecord() {
- }
+ public AlsaDeviceRecord() {}
public boolean parse(String line) {
// "0123456789012345678901234567890"
@@ -176,38 +176,27 @@
}
}
- private Vector<AlsaDeviceRecord>
- deviceRecords_ = new Vector<AlsaDeviceRecord>();
+ private ArrayList<AlsaDeviceRecord> mDeviceRecords = new ArrayList<AlsaDeviceRecord>();
- private boolean isLineDeviceRecord(String line) {
- return line.charAt(kIndex_CardDeviceField) == '[';
+ public AlsaDevicesParser() {}
+
+ //
+ // Access
+ //
+ public int getDefaultDeviceNum(int card) {
+ // TODO - This (obviously) isn't sufficient. Revisit.
+ return 0;
}
- public AlsaDevicesParser() {
- }
-
- public int getNumDeviceRecords() {
- return deviceRecords_.size();
- }
-
- public AlsaDeviceRecord getDeviceRecordAt(int index) {
- return deviceRecords_.get(index);
- }
-
- public void Log() {
- int numDevRecs = getNumDeviceRecords();
- for (int index = 0; index < numDevRecs; ++index) {
- Slog.w(TAG, "usb:" + getDeviceRecordAt(index).textFormat());
- }
- }
-
- public boolean hasPlaybackDevices() {
+ //
+ // Predicates
+ //
+ public boolean hasPlaybackDevices() {
return mHasPlaybackDevices;
}
public boolean hasPlaybackDevices(int card) {
- for (int index = 0; index < deviceRecords_.size(); index++) {
- AlsaDeviceRecord deviceRecord = deviceRecords_.get(index);
+ for (AlsaDeviceRecord deviceRecord : mDeviceRecords) {
if (deviceRecord.mCardNum == card &&
deviceRecord.mDeviceType == AlsaDeviceRecord.kDeviceType_Audio &&
deviceRecord.mDeviceDir == AlsaDeviceRecord.kDeviceDir_Playback) {
@@ -222,8 +211,7 @@
}
public boolean hasCaptureDevices(int card) {
- for (int index = 0; index < deviceRecords_.size(); index++) {
- AlsaDeviceRecord deviceRecord = deviceRecords_.get(index);
+ for (AlsaDeviceRecord deviceRecord : mDeviceRecords) {
if (deviceRecord.mCardNum == card &&
deviceRecord.mDeviceType == AlsaDeviceRecord.kDeviceType_Audio &&
deviceRecord.mDeviceDir == AlsaDeviceRecord.kDeviceDir_Capture) {
@@ -238,8 +226,7 @@
}
public boolean hasMIDIDevices(int card) {
- for (int index = 0; index < deviceRecords_.size(); index++) {
- AlsaDeviceRecord deviceRecord = deviceRecords_.get(index);
+ for (AlsaDeviceRecord deviceRecord : mDeviceRecords) {
if (deviceRecord.mCardNum == card &&
deviceRecord.mDeviceType == AlsaDeviceRecord.kDeviceType_MIDI) {
return true;
@@ -248,8 +235,15 @@
return false;
}
+ //
+ // Process
+ //
+ private boolean isLineDeviceRecord(String line) {
+ return line.charAt(kIndex_CardDeviceField) == '[';
+ }
+
public void scan() {
- deviceRecords_.clear();
+ mDeviceRecords.clear();
final String devicesFilePath = "/proc/asound/devices";
File devicesFile = new File(devicesFilePath);
@@ -261,7 +255,7 @@
if (isLineDeviceRecord(line)) {
AlsaDeviceRecord deviceRecord = new AlsaDeviceRecord();
deviceRecord.parse(line);
- deviceRecords_.add(deviceRecord);
+ mDeviceRecords.add(deviceRecord);
}
}
reader.close();
@@ -271,5 +265,17 @@
e.printStackTrace();
}
}
+
+ //
+ // Loging
+ //
+ public void Log(String heading) {
+ if (DEBUG) {
+ Slog.i(TAG, heading);
+ for (AlsaDeviceRecord deviceRecord : mDeviceRecords) {
+ Slog.i(TAG, deviceRecord.textFormat());
+ }
+ }
+ }
} // class AlsaDevicesParser
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index e8d08b8..0423478 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -466,8 +466,9 @@
String resultData = data.readString();
Bundle resultExtras = data.readBundle();
boolean resultAbort = data.readInt() != 0;
+ int intentFlags = data.readInt();
if (who != null) {
- finishReceiver(who, resultCode, resultData, resultExtras, resultAbort);
+ finishReceiver(who, resultCode, resultData, resultExtras, resultAbort, intentFlags);
}
reply.writeNoException();
return true;
@@ -2848,7 +2849,8 @@
data.recycle();
reply.recycle();
}
- public void finishReceiver(IBinder who, int resultCode, String resultData, Bundle map, boolean abortBroadcast) throws RemoteException
+ public void finishReceiver(IBinder who, int resultCode, String resultData, Bundle map,
+ boolean abortBroadcast, int flags) throws RemoteException
{
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
@@ -2858,6 +2860,7 @@
data.writeString(resultData);
data.writeBundle(map);
data.writeInt(abortBroadcast ? 1 : 0);
+ data.writeInt(flags);
mRemote.transact(FINISH_RECEIVER_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
reply.readException();
data.recycle();
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index a5cdcfd..6f0bc3a 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -367,7 +367,7 @@
public ReceiverData(Intent intent, int resultCode, String resultData, Bundle resultExtras,
boolean ordered, boolean sticky, IBinder token, int sendingUser) {
super(resultCode, resultData, resultExtras, TYPE_COMPONENT, ordered, sticky,
- token, sendingUser);
+ token, sendingUser, intent.getFlags());
this.intent = intent;
}
@@ -1079,8 +1079,7 @@
WindowManagerGlobal.getInstance().dumpGfxInfo(fd);
}
- @Override
- public void dumpDbInfo(FileDescriptor fd, String[] args) {
+ private void dumpDatabaseInfo(FileDescriptor fd, String[] args) {
PrintWriter pw = new FastPrintWriter(new FileOutputStream(fd));
PrintWriterPrinter printer = new PrintWriterPrinter(pw);
SQLiteDebug.dump(printer, args);
@@ -1088,6 +1087,22 @@
}
@Override
+ public void dumpDbInfo(final FileDescriptor fd, final String[] args) {
+ if (mSystemThread) {
+ // Ensure this invocation is asynchronous to prevent
+ // writer waiting due to buffer cannot be consumed.
+ AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
+ @Override
+ public void run() {
+ dumpDatabaseInfo(fd, args);
+ }
+ });
+ } else {
+ dumpDatabaseInfo(fd, args);
+ }
+ }
+
+ @Override
public void unstableProviderDied(IBinder provider) {
sendMessage(H.UNSTABLE_PROVIDER_DIED, provider);
}
@@ -4507,6 +4522,10 @@
if ((data.appInfo.flags&ApplicationInfo.FLAG_LARGE_HEAP) != 0) {
dalvik.system.VMRuntime.getRuntime().clearGrowthLimit();
+ } else {
+ // Small heap, clamp to the current growth limit and let the heap release
+ // pages after the growth limit to the non growth limit capacity. b/18387825
+ dalvik.system.VMRuntime.getRuntime().clampGrowthLimit();
}
// Allow disk access during application and provider setup. This could
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index eadf5e9..e9df8c6 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -2436,7 +2436,7 @@
int res = -1;
try {
res = mount.mkdirs(getPackageName(), dir.getAbsolutePath());
- } catch (RemoteException e) {
+ } catch (Exception ignored) {
}
if (res != 0) {
Log.w(TAG, "Failed to ensure directory: " + dir);
diff --git a/core/java/android/app/DatePickerDialog.java b/core/java/android/app/DatePickerDialog.java
index f79d32b..3fbbdff 100644
--- a/core/java/android/app/DatePickerDialog.java
+++ b/core/java/android/app/DatePickerDialog.java
@@ -131,6 +131,9 @@
switch (which) {
case BUTTON_POSITIVE:
if (mDateSetListener != null) {
+ // Clearing focus forces the dialog to commit any pending
+ // changes, e.g. typed text in a NumberPicker.
+ mDatePicker.clearFocus();
mDateSetListener.onDateSet(mDatePicker, mDatePicker.getYear(),
mDatePicker.getMonth(), mDatePicker.getDayOfMonth());
}
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index e505d69..d9fc2cf 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -106,7 +106,8 @@
String resultData, Bundle map, String requiredPermission,
int appOp, boolean serialized, boolean sticky, int userId) throws RemoteException;
public void unbroadcastIntent(IApplicationThread caller, Intent intent, int userId) throws RemoteException;
- public void finishReceiver(IBinder who, int resultCode, String resultData, Bundle map, boolean abortBroadcast) throws RemoteException;
+ public void finishReceiver(IBinder who, int resultCode, String resultData, Bundle map,
+ boolean abortBroadcast, int flags) throws RemoteException;
public void attachApplication(IApplicationThread app) throws RemoteException;
public void activityResumed(IBinder token) throws RemoteException;
public void activityIdle(IBinder token, Configuration config,
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index ece2a33..b01f87e 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -801,7 +801,7 @@
if (extras != null) {
extras.setAllowFds(false);
}
- mgr.finishReceiver(this, resultCode, data, extras, false);
+ mgr.finishReceiver(this, resultCode, data, extras, false, intent.getFlags());
} catch (RemoteException e) {
Slog.w(ActivityThread.TAG, "Couldn't finish broadcast to unregistered receiver");
}
@@ -826,8 +826,8 @@
public Args(Intent intent, int resultCode, String resultData, Bundle resultExtras,
boolean ordered, boolean sticky, int sendingUser) {
super(resultCode, resultData, resultExtras,
- mRegistered ? TYPE_REGISTERED : TYPE_UNREGISTERED,
- ordered, sticky, mIIntentReceiver.asBinder(), sendingUser);
+ mRegistered ? TYPE_REGISTERED : TYPE_UNREGISTERED, ordered,
+ sticky, mIIntentReceiver.asBinder(), sendingUser, intent.getFlags());
mCurIntent = intent;
mOrdered = ordered;
}
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index a40b29a..d7c4467 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -540,11 +540,6 @@
private final Context mContext;
- /**
- * The package associated with this seach manager.
- */
- private String mAssociatedPackage;
-
// package private since they are used by the inner class SearchManagerCallback
/* package */ final Handler mHandler;
/* package */ OnDismissListener mDismissListener = null;
@@ -742,10 +737,6 @@
public void triggerSearch(String query,
ComponentName launchActivity,
Bundle appSearchData) {
- if (!mAssociatedPackage.equals(launchActivity.getPackageName())) {
- throw new IllegalArgumentException("invoking app search on a different package " +
- "not associated with this search manager");
- }
if (query == null || TextUtils.getTrimmedLength(query) == 0) {
Log.w(TAG, "triggerSearch called with empty query, ignoring.");
return;
diff --git a/core/java/android/app/backup/BackupTransport.java b/core/java/android/app/backup/BackupTransport.java
index 70bb5e4..e853540 100644
--- a/core/java/android/app/backup/BackupTransport.java
+++ b/core/java/android/app/backup/BackupTransport.java
@@ -213,8 +213,9 @@
/**
* Send one application's key/value data update to the backup destination. The
- * transport may send the data immediately, or may buffer it. After this is called,
- * {@link #finishBackup} will be called to ensure the data is sent and recorded successfully.
+ * transport may send the data immediately, or may buffer it. If this method returns
+ * {@link #TRANSPORT_OK}, {@link #finishBackup} will then be called to ensure the data
+ * is sent and recorded successfully.
*
* @param packageInfo The identity of the application whose data is being backed up.
* This specifically includes the signature list for the package.
@@ -226,6 +227,8 @@
* is to provide a guarantee that no stale data exists in the restore set when the
* device begins providing incremental backups.
* @return one of {@link BackupTransport#TRANSPORT_OK} (OK so far),
+ * {@link BackupTransport#TRANSPORT_PACKAGE_REJECTED} (to suppress backup of this
+ * specific package, but allow others to proceed),
* {@link BackupTransport#TRANSPORT_ERROR} (on network error or other failure), or
* {@link BackupTransport#TRANSPORT_NOT_INITIALIZED} (if the backend dataset has
* become lost due to inactivity purge or some other reason and needs re-initializing)
diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java
index 1ff476e..022e225 100644
--- a/core/java/android/appwidget/AppWidgetHostView.java
+++ b/core/java/android/appwidget/AppWidgetHostView.java
@@ -588,9 +588,10 @@
return tv;
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(AppWidgetHostView.class.getName());
}
diff --git a/core/java/android/content/BroadcastReceiver.java b/core/java/android/content/BroadcastReceiver.java
index 9a32fdf..af74e73 100644
--- a/core/java/android/content/BroadcastReceiver.java
+++ b/core/java/android/content/BroadcastReceiver.java
@@ -238,6 +238,7 @@
final boolean mInitialStickyHint;
final IBinder mToken;
final int mSendingUser;
+ final int mFlags;
int mResultCode;
String mResultData;
@@ -246,8 +247,8 @@
boolean mFinished;
/** @hide */
- public PendingResult(int resultCode, String resultData, Bundle resultExtras,
- int type, boolean ordered, boolean sticky, IBinder token, int userId) {
+ public PendingResult(int resultCode, String resultData, Bundle resultExtras, int type,
+ boolean ordered, boolean sticky, IBinder token, int userId, int flags) {
mResultCode = resultCode;
mResultData = resultData;
mResultExtras = resultExtras;
@@ -256,6 +257,7 @@
mInitialStickyHint = sticky;
mToken = token;
mSendingUser = userId;
+ mFlags = flags;
}
/**
@@ -417,11 +419,11 @@
}
if (mOrderedHint) {
am.finishReceiver(mToken, mResultCode, mResultData, mResultExtras,
- mAbortBroadcast);
+ mAbortBroadcast, mFlags);
} else {
// This broadcast was sent to a component; it is not ordered,
// but we still need to tell the activity manager we are done.
- am.finishReceiver(mToken, 0, null, null, false);
+ am.finishReceiver(mToken, 0, null, null, false, mFlags);
}
} catch (RemoteException ex) {
}
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index f487f01..1b621d1 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -315,16 +315,15 @@
* supported by this camera device.</p>
* <p>This key lists the valid modes for {@link CaptureRequest#COLOR_CORRECTION_ABERRATION_MODE android.colorCorrection.aberrationMode}. If no
* aberration correction modes are available for a device, this list will solely include
- * OFF mode.</p>
- * <p>For FULL capability device ({@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} <code>==</code> FULL), OFF is
- * always included.</p>
+ * OFF mode. All camera devices will support either OFF or FAST mode.</p>
+ * <p>Camera devices that support the MANUAL_POST_PROCESSING capability will always list
+ * OFF mode. This includes all FULL level devices.</p>
* <p>LEGACY devices will always only support FAST mode.</p>
* <p><b>Range of valid values:</b><br>
* Any value listed in {@link CaptureRequest#COLOR_CORRECTION_ABERRATION_MODE android.colorCorrection.aberrationMode}</p>
* <p>This key is available on all devices.</p>
*
* @see CaptureRequest#COLOR_CORRECTION_ABERRATION_MODE
- * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
*/
@PublicKey
public static final Key<int[]> COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES =
diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java
index 9e90d01..67b480f 100644
--- a/core/java/android/hardware/camera2/CameraDevice.java
+++ b/core/java/android/hardware/camera2/CameraDevice.java
@@ -183,7 +183,7 @@
* Then obtain the Surface with
* {@link android.renderscript.Allocation#getSurface}.</li>
*
- * <li>For access to raw, uncompressed JPEG data in the application: Create an
+ * <li>For access to RAW, uncompressed YUV, or compressed JPEG data in the application: Create an
* {@link android.media.ImageReader} object with one of the supported output formats given by
* {@link StreamConfigurationMap#getOutputFormats()}, setting its size to one of the
* corresponding supported sizes by passing the chosen output format into
diff --git a/core/java/android/hardware/usb/UsbDevice.java b/core/java/android/hardware/usb/UsbDevice.java
index d90e06e..1a42319 100644
--- a/core/java/android/hardware/usb/UsbDevice.java
+++ b/core/java/android/hardware/usb/UsbDevice.java
@@ -40,6 +40,7 @@
public class UsbDevice implements Parcelable {
private static final String TAG = "UsbDevice";
+ private static final boolean DEBUG = false;
private final String mName;
private final String mManufacturerName;
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 865e4a5..1a51808 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -935,10 +935,8 @@
return -1;
}
- NetworkCallback networkCallback = removeRequestForFeature(netCap);
- if (networkCallback != null) {
+ if (removeRequestForFeature(netCap)) {
Log.d(TAG, "stopUsingNetworkFeature for " + networkType + ", " + feature);
- unregisterNetworkCallback(networkCallback);
}
return 1;
}
@@ -1105,6 +1103,14 @@
int expireSequenceNumber;
Network currentNetwork;
int delay = -1;
+
+ private void clearDnsBinding() {
+ if (currentNetwork != null) {
+ currentNetwork = null;
+ setProcessDefaultNetworkForHostResolution(null);
+ }
+ }
+
NetworkCallback networkCallback = new NetworkCallback() {
@Override
public void onAvailable(Network network) {
@@ -1114,10 +1120,7 @@
}
@Override
public void onLost(Network network) {
- if (network.equals(currentNetwork)) {
- currentNetwork = null;
- setProcessDefaultNetworkForHostResolution(null);
- }
+ if (network.equals(currentNetwork)) clearDnsBinding();
Log.d(TAG, "startUsingNetworkFeature lost Network:" + network);
}
};
@@ -1146,10 +1149,7 @@
LegacyRequest l = sLegacyRequests.get(netCap);
if (l == null) return;
ourSeqNum = l.expireSequenceNumber;
- if (l.expireSequenceNumber == sequenceNum) {
- unregisterNetworkCallback(l.networkCallback);
- sLegacyRequests.remove(netCap);
- }
+ if (l.expireSequenceNumber == sequenceNum) removeRequestForFeature(netCap);
}
Log.d(TAG, "expireRequest with " + ourSeqNum + ", " + sequenceNum);
}
@@ -1180,12 +1180,15 @@
}
}
- private NetworkCallback removeRequestForFeature(NetworkCapabilities netCap) {
+ private boolean removeRequestForFeature(NetworkCapabilities netCap) {
+ final LegacyRequest l;
synchronized (sLegacyRequests) {
- LegacyRequest l = sLegacyRequests.remove(netCap);
- if (l == null) return null;
- return l.networkCallback;
+ l = sLegacyRequests.remove(netCap);
}
+ if (l == null) return false;
+ unregisterNetworkCallback(l.networkCallback);
+ l.clearDnsBinding();
+ return true;
}
/**
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 5fd697a..c0dca0e 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -604,6 +604,7 @@
public static final byte CMD_CURRENT_TIME = 5;
public static final byte CMD_OVERFLOW = 6;
public static final byte CMD_RESET = 7;
+ public static final byte CMD_SHUTDOWN = 8;
public byte cmd = CMD_NULL;
@@ -3529,6 +3530,11 @@
pw.println(DateFormat.format("yyyy-MM-dd-HH-mm-ss",
rec.currentTime).toString());
}
+ } else if (rec.cmd == HistoryItem.CMD_SHUTDOWN) {
+ if (checkin) {
+ pw.print(":");
+ }
+ pw.println("SHUTDOWN");
} else if (rec.cmd == HistoryItem.CMD_OVERFLOW) {
if (checkin) {
pw.print(":");
@@ -3849,7 +3855,8 @@
if (histStart >= 0 && !printed) {
if (rec.cmd == HistoryItem.CMD_CURRENT_TIME
|| rec.cmd == HistoryItem.CMD_RESET
- || rec.cmd == HistoryItem.CMD_START) {
+ || rec.cmd == HistoryItem.CMD_START
+ || rec.cmd == HistoryItem.CMD_SHUTDOWN) {
printed = true;
hprinter.printNextItem(pw, rec, baseTime, checkin,
(flags&DUMP_VERBOSE) != 0);
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index b209690..23ddd03 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -91,7 +91,7 @@
/** The name of the hardware (from the kernel command line or /proc). */
public static final String HARDWARE = getString("ro.hardware");
- /** A hardware serial number, if available. Alphanumeric only, case-insensitive. */
+ /** A hardware serial number, if available. Alphanumeric only, case-insensitive. */
public static final String SERIAL = getString("ro.serialno");
/**
@@ -159,7 +159,7 @@
/**
* The user-visible SDK version of the framework in its raw String
* representation; use {@link #SDK_INT} instead.
- *
+ *
* @deprecated Use {@link #SDK_INT} to easily get this as an integer.
*/
@Deprecated
@@ -207,25 +207,25 @@
* not yet turned into an official release.
*/
public static final int CUR_DEVELOPMENT = 10000;
-
+
/**
* October 2008: The original, first, version of Android. Yay!
*/
public static final int BASE = 1;
-
+
/**
* February 2009: First Android update, officially called 1.1.
*/
public static final int BASE_1_1 = 2;
-
+
/**
* May 2009: Android 1.5.
*/
public static final int CUPCAKE = 3;
-
+
/**
* September 2009: Android 1.6.
- *
+ *
* <p>Applications targeting this or a later release will get these
* new changes in behavior:</p>
* <ul>
@@ -247,10 +247,10 @@
* </ul>
*/
public static final int DONUT = 4;
-
+
/**
* November 2009: Android 2.0
- *
+ *
* <p>Applications targeting this or a later release will get these
* new changes in behavior:</p>
* <ul>
@@ -267,22 +267,22 @@
* </ul>
*/
public static final int ECLAIR = 5;
-
+
/**
* December 2009: Android 2.0.1
*/
public static final int ECLAIR_0_1 = 6;
-
+
/**
* January 2010: Android 2.1
*/
public static final int ECLAIR_MR1 = 7;
-
+
/**
* June 2010: Android 2.2
*/
public static final int FROYO = 8;
-
+
/**
* November 2010: Android 2.3
*
@@ -294,7 +294,7 @@
* </ul>
*/
public static final int GINGERBREAD = 9;
-
+
/**
* February 2011: Android 2.3.3.
*/
@@ -339,12 +339,12 @@
* </ul>
*/
public static final int HONEYCOMB = 11;
-
+
/**
* May 2011: Android 3.1.
*/
public static final int HONEYCOMB_MR1 = 12;
-
+
/**
* June 2011: Android 3.2.
*
@@ -598,7 +598,7 @@
*/
public static final int LOLLIPOP_MR1 = 22;
}
-
+
/** The type of build, like "user" or "eng". */
public static final String TYPE = getString("ro.build.type");
@@ -653,6 +653,7 @@
public static boolean isFingerprintConsistent() {
final String system = SystemProperties.get("ro.build.fingerprint");
final String vendor = SystemProperties.get("ro.vendor.build.fingerprint");
+ final String bootimage = SystemProperties.get("ro.bootimage.build.fingerprint");
if (TextUtils.isEmpty(system)) {
Slog.e(TAG, "Required ro.build.fingerprint is empty!");
@@ -667,6 +668,14 @@
}
}
+ if (!TextUtils.isEmpty(bootimage)) {
+ if (!Objects.equals(vendor, bootimage)) {
+ Slog.e(TAG, "Mismatched fingerprints; system and vendor reported " + system
+ + " but bootimage reported " + bootimage);
+ return false;
+ }
+ }
+
return true;
}
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index ffbed94..5e1df01 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -56,6 +56,7 @@
/**
* Specifies if a user is disallowed from changing Wi-Fi
* access points. The default value is <code>false</code>.
+ * <p/>This restriction has no effect in a managed profile.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -87,8 +88,10 @@
public static final String DISALLOW_UNINSTALL_APPS = "no_uninstall_apps";
/**
- * Specifies if a user is disallowed from toggling location sharing.
+ * Specifies if a user is disallowed from turning on location sharing.
* The default value is <code>false</code>.
+ * <p/>In a managed profile, location sharing always reflects the primary user's setting, but
+ * can be overridden and forced off by setting this restriction to true in the managed profile.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -112,6 +115,7 @@
/**
* Specifies if a user is disallowed from configuring bluetooth.
* The default value is <code>false</code>.
+ * <p/>This restriction has no effect in a managed profile.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -144,8 +148,10 @@
public static final String DISALLOW_CONFIG_CREDENTIALS = "no_config_credentials";
/**
- * Specifies if a user is disallowed from removing itself and other
- * users. The default value is <code>false</code>.
+ * When set on the primary user this specifies if the user can remove other users.
+ * When set on a secondary user, this specifies if the user can remove itself.
+ * This restriction has no effect on managed profiles.
+ * The default value is <code>false</code>.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -168,6 +174,7 @@
/**
* Specifies if a user is disallowed from configuring VPN.
* The default value is <code>false</code>.
+ * This restriction has no effect in a managed profile.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -192,6 +199,8 @@
* Specifies if a user is disallowed from factory resetting
* from Settings. This can only be set by device owners and profile owners on the primary user.
* The default value is <code>false</code>.
+ * <p/>This restriction has no effect on secondary users and managed profiles since only the
+ * primary user can factory reset the device.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -204,6 +213,8 @@
* Specifies if a user is disallowed from adding new users and
* profiles. This can only be set by device owners and profile owners on the primary user.
* The default value is <code>false</code>.
+ * <p/>This restriction has no effect on secondary users and managed profiles since only the
+ * primary user can add other users.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -227,6 +238,8 @@
* Specifies if a user is disallowed from configuring cell
* broadcasts. This can only be set by device owners and profile owners on the primary user.
* The default value is <code>false</code>.
+ * <p/>This restriction has no effect on secondary users and managed profiles since only the
+ * primary user can configure cell broadcasts.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -239,6 +252,8 @@
* Specifies if a user is disallowed from configuring mobile
* networks. This can only be set by device owners and profile owners on the primary user.
* The default value is <code>false</code>.
+ * <p/>This restriction has no effect on secondary users and managed profiles since only the
+ * primary user can configure mobile networks.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -307,6 +322,8 @@
* Specifies that the user is not allowed to make outgoing
* phone calls. Emergency calls are still permitted.
* The default value is <code>false</code>.
+ * <p/>This restriction has no effect on managed profiles since call intents are normally
+ * forwarded to the primary user.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
diff --git a/core/java/android/preference/Preference.java b/core/java/android/preference/Preference.java
index 56d5617..0224c73 100644
--- a/core/java/android/preference/Preference.java
+++ b/core/java/android/preference/Preference.java
@@ -215,7 +215,7 @@
final TypedArray a = context.obtainStyledAttributes(
attrs, com.android.internal.R.styleable.Preference, defStyleAttr, defStyleRes);
- for (int i = a.getIndexCount(); i >= 0; i--) {
+ for (int i = a.getIndexCount() - 1; i >= 0; i--) {
int attr = a.getIndex(i);
switch (attr) {
case com.android.internal.R.styleable.Preference_icon:
diff --git a/core/java/android/preference/PreferenceManager.java b/core/java/android/preference/PreferenceManager.java
index ad940c6..0a0e625 100644
--- a/core/java/android/preference/PreferenceManager.java
+++ b/core/java/android/preference/PreferenceManager.java
@@ -156,7 +156,7 @@
* should be used ANY time a preference will be displayed, since some preference
* types need an Activity for managed queries.
*/
- private PreferenceManager(Context context) {
+ /*package*/ PreferenceManager(Context context) {
init(context);
}
diff --git a/core/java/android/provider/Contacts.java b/core/java/android/provider/Contacts.java
index d4c5cfb..3aa526d 100644
--- a/core/java/android/provider/Contacts.java
+++ b/core/java/android/provider/Contacts.java
@@ -2077,12 +2077,12 @@
/**
* Intents related to the Contacts app UI.
- * @deprecated see {@link android.provider.ContactsContract}
+ * @deprecated Do not use. This is not supported.
*/
@Deprecated
public static final class UI {
/**
- * @deprecated see {@link android.provider.ContactsContract}
+ * @deprecated Do not use. This is not supported.
*/
@Deprecated
public UI() {
@@ -2090,76 +2090,77 @@
/**
* The action for the default contacts list tab.
- * @deprecated see {@link android.provider.ContactsContract}
+ * @deprecated Do not use. This is not supported.
*/
@Deprecated
- public static final String LIST_DEFAULT = ContactsContract.Intents.UI.LIST_DEFAULT;
+ public static final String LIST_DEFAULT
+ = "com.android.contacts.action.LIST_DEFAULT";
/**
* The action for the contacts list tab.
- * @deprecated see {@link android.provider.ContactsContract}
+ * @deprecated Do not use. This is not supported.
*/
@Deprecated
public static final String LIST_GROUP_ACTION =
- ContactsContract.Intents.UI.LIST_GROUP_ACTION;
+ "com.android.contacts.action.LIST_GROUP";
/**
* When in LIST_GROUP_ACTION mode, this is the group to display.
- * @deprecated see {@link android.provider.ContactsContract}
+ * @deprecated Do not use. This is not supported.
*/
@Deprecated
public static final String GROUP_NAME_EXTRA_KEY =
- ContactsContract.Intents.UI.GROUP_NAME_EXTRA_KEY;
+ "com.android.contacts.extra.GROUP";
/**
* The action for the all contacts list tab.
- * @deprecated see {@link android.provider.ContactsContract}
+ * @deprecated Do not use. This is not supported.
*/
@Deprecated
public static final String LIST_ALL_CONTACTS_ACTION =
- ContactsContract.Intents.UI.LIST_ALL_CONTACTS_ACTION;
+ "com.android.contacts.action.LIST_ALL_CONTACTS";
/**
* The action for the contacts with phone numbers list tab.
- * @deprecated see {@link android.provider.ContactsContract}
+ * @deprecated Do not use. This is not supported.
*/
@Deprecated
public static final String LIST_CONTACTS_WITH_PHONES_ACTION =
- ContactsContract.Intents.UI.LIST_CONTACTS_WITH_PHONES_ACTION;
+ "com.android.contacts.action.LIST_CONTACTS_WITH_PHONES";
/**
* The action for the starred contacts list tab.
- * @deprecated see {@link android.provider.ContactsContract}
+ * @deprecated Do not use. This is not supported.
*/
@Deprecated
public static final String LIST_STARRED_ACTION =
- ContactsContract.Intents.UI.LIST_STARRED_ACTION;
+ "com.android.contacts.action.LIST_STARRED";
/**
* The action for the frequent contacts list tab.
- * @deprecated see {@link android.provider.ContactsContract}
+ * @deprecated Do not use. This is not supported.
*/
@Deprecated
public static final String LIST_FREQUENT_ACTION =
- ContactsContract.Intents.UI.LIST_FREQUENT_ACTION;
+ "com.android.contacts.action.LIST_FREQUENT";
/**
* The action for the "strequent" contacts list tab. It first lists the starred
* contacts in alphabetical order and then the frequent contacts in descending
* order of the number of times they have been contacted.
- * @deprecated see {@link android.provider.ContactsContract}
+ * @deprecated Do not use. This is not supported.
*/
@Deprecated
public static final String LIST_STREQUENT_ACTION =
- ContactsContract.Intents.UI.LIST_STREQUENT_ACTION;
+ "com.android.contacts.action.LIST_STREQUENT";
/**
* A key for to be used as an intent extra to set the activity
* title to a custom String value.
- * @deprecated see {@link android.provider.ContactsContract}
+ * @deprecated Do not use. This is not supported.
*/
@Deprecated
public static final String TITLE_EXTRA_KEY =
- ContactsContract.Intents.UI.TITLE_EXTRA_KEY;
+ "com.android.contacts.extra.TITLE_EXTRA";
/**
* Activity Action: Display a filtered list of contacts
@@ -2168,20 +2169,20 @@
* filtering
* <p>
* Output: Nothing.
- * @deprecated see {@link android.provider.ContactsContract}
+ * @deprecated Do not use. This is not supported.
*/
@Deprecated
public static final String FILTER_CONTACTS_ACTION =
- ContactsContract.Intents.UI.FILTER_CONTACTS_ACTION;
+ "com.android.contacts.action.FILTER_CONTACTS";
/**
* Used as an int extra field in {@link #FILTER_CONTACTS_ACTION}
* intents to supply the text on which to filter.
- * @deprecated see {@link android.provider.ContactsContract}
+ * @deprecated Do not use. This is not supported.
*/
@Deprecated
public static final String FILTER_TEXT_EXTRA_KEY =
- ContactsContract.Intents.UI.FILTER_TEXT_EXTRA_KEY;
+ "com.android.contacts.extra.FILTER_TEXT";
}
/**
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index 18a9eb1..0666a24 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -197,12 +197,15 @@
* API for obtaining a pre-authorized version of a URI that normally requires special
* permission (beyond READ_CONTACTS) to read. The caller obtaining the pre-authorized URI
* must already have the necessary permissions to access the URI; otherwise a
- * {@link SecurityException} will be thrown.
+ * {@link SecurityException} will be thrown. Unlike {@link Context#grantUriPermission},
+ * this can be used to grant permissions that aren't explicitly required for the URI inside
+ * AndroidManifest.xml. For example, permissions that are only required when reading URIs
+ * that refer to the user's profile.
* </p>
* <p>
* The authorized URI returned in the bundle contains an expiring token that allows the
* caller to execute the query without having the special permissions that would normally
- * be required.
+ * be required. The token expires in five minutes.
* </p>
* <p>
* This API does not access disk, and should be safe to invoke from the UI thread.
@@ -226,7 +229,6 @@
* }
* </pre>
* </p>
- * @hide
*/
public static final class Authorization {
/**
@@ -7839,9 +7841,7 @@
}
/**
- * Private API for inquiring about the general status of the provider.
- *
- * @hide
+ * API for inquiring about the general status of the provider.
*/
public static final class ProviderStatus {
@@ -7854,8 +7854,6 @@
/**
* The content:// style URI for this table. Requests to this URI can be
* performed on the UI thread because they are always unblocking.
- *
- * @hide
*/
public static final Uri CONTENT_URI =
Uri.withAppendedPath(AUTHORITY_URI, "provider_status");
@@ -7863,64 +7861,35 @@
/**
* The MIME-type of {@link #CONTENT_URI} providing a directory of
* settings.
- *
- * @hide
*/
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/provider_status";
/**
* An integer representing the current status of the provider.
- *
- * @hide
*/
public static final String STATUS = "status";
/**
* Default status of the provider.
- *
- * @hide
*/
public static final int STATUS_NORMAL = 0;
/**
* The status used when the provider is in the process of upgrading. Contacts
* are temporarily unaccessible.
- *
- * @hide
*/
public static final int STATUS_UPGRADING = 1;
/**
- * The status used if the provider was in the process of upgrading but ran
- * out of storage. The DATA1 column will contain the estimated amount of
- * storage required (in bytes). Update status to STATUS_NORMAL to force
- * the provider to retry the upgrade.
- *
- * @hide
- */
- public static final int STATUS_UPGRADE_OUT_OF_MEMORY = 2;
-
- /**
* The status used during a locale change.
- *
- * @hide
*/
public static final int STATUS_CHANGING_LOCALE = 3;
/**
* The status that indicates that there are no accounts and no contacts
* on the device.
- *
- * @hide
*/
public static final int STATUS_NO_ACCOUNTS_NO_CONTACTS = 4;
-
- /**
- * Additional data associated with the status.
- *
- * @hide
- */
- public static final String DATA1 = "data1";
}
/**
@@ -8538,102 +8507,6 @@
public static final String EXTRA_EXCLUDE_MIMES = "exclude_mimes";
/**
- * Intents related to the Contacts app UI.
- *
- * @hide
- */
- public static final class UI {
- /**
- * The action for the default contacts list tab.
- */
- public static final String LIST_DEFAULT =
- "com.android.contacts.action.LIST_DEFAULT";
-
- /**
- * The action for the contacts list tab.
- */
- public static final String LIST_GROUP_ACTION =
- "com.android.contacts.action.LIST_GROUP";
-
- /**
- * When in LIST_GROUP_ACTION mode, this is the group to display.
- */
- public static final String GROUP_NAME_EXTRA_KEY = "com.android.contacts.extra.GROUP";
-
- /**
- * The action for the all contacts list tab.
- */
- public static final String LIST_ALL_CONTACTS_ACTION =
- "com.android.contacts.action.LIST_ALL_CONTACTS";
-
- /**
- * The action for the contacts with phone numbers list tab.
- */
- public static final String LIST_CONTACTS_WITH_PHONES_ACTION =
- "com.android.contacts.action.LIST_CONTACTS_WITH_PHONES";
-
- /**
- * The action for the starred contacts list tab.
- */
- public static final String LIST_STARRED_ACTION =
- "com.android.contacts.action.LIST_STARRED";
-
- /**
- * The action for the frequent contacts list tab.
- */
- public static final String LIST_FREQUENT_ACTION =
- "com.android.contacts.action.LIST_FREQUENT";
-
- /**
- * The action for the "Join Contact" picker.
- */
- public static final String PICK_JOIN_CONTACT_ACTION =
- "com.android.contacts.action.JOIN_CONTACT";
-
- /**
- * The action for the "strequent" contacts list tab. It first lists the starred
- * contacts in alphabetical order and then the frequent contacts in descending
- * order of the number of times they have been contacted.
- */
- public static final String LIST_STREQUENT_ACTION =
- "com.android.contacts.action.LIST_STREQUENT";
-
- /**
- * A key for to be used as an intent extra to set the activity
- * title to a custom String value.
- */
- public static final String TITLE_EXTRA_KEY =
- "com.android.contacts.extra.TITLE_EXTRA";
-
- /**
- * Activity Action: Display a filtered list of contacts
- * <p>
- * Input: Extra field {@link #FILTER_TEXT_EXTRA_KEY} is the text to use for
- * filtering
- * <p>
- * Output: Nothing.
- */
- public static final String FILTER_CONTACTS_ACTION =
- "com.android.contacts.action.FILTER_CONTACTS";
-
- /**
- * Used as an int extra field in {@link #FILTER_CONTACTS_ACTION}
- * intents to supply the text on which to filter.
- */
- public static final String FILTER_TEXT_EXTRA_KEY =
- "com.android.contacts.extra.FILTER_TEXT";
-
- /**
- * Used with JOIN_CONTACT action to set the target for aggregation. This action type
- * uses contact ids instead of contact uris for the sake of backwards compatibility.
- * <p>
- * Type: LONG
- */
- public static final String TARGET_CONTACT_ID_EXTRA_KEY
- = "com.android.contacts.action.CONTACT_ID";
- }
-
- /**
* Convenience class that contains string constants used
* to create contact {@link android.content.Intent Intents}.
*/
diff --git a/core/java/android/util/NtpTrustedTime.java b/core/java/android/util/NtpTrustedTime.java
index 602a68c..b18cc3b 100644
--- a/core/java/android/util/NtpTrustedTime.java
+++ b/core/java/android/util/NtpTrustedTime.java
@@ -22,6 +22,7 @@
import android.net.SntpClient;
import android.os.SystemClock;
import android.provider.Settings;
+import android.text.TextUtils;
/**
* {@link TrustedTime} that connects with a remote NTP server as its trusted
@@ -73,7 +74,7 @@
@Override
public boolean forceRefresh() {
- if (mServer == null) {
+ if (TextUtils.isEmpty(mServer)) {
// missing server, so no trusted time available
return false;
}
diff --git a/core/java/android/util/StateSet.java b/core/java/android/util/StateSet.java
index 2623638..83dfc47 100644
--- a/core/java/android/util/StateSet.java
+++ b/core/java/android/util/StateSet.java
@@ -36,7 +36,88 @@
*/
public class StateSet {
- /** @hide */ public StateSet() {}
+ /**
+ * The order here is very important to
+ * {@link android.view.View#getDrawableState()}
+ */
+ private static final int[][] VIEW_STATE_SETS;
+
+ /** @hide */
+ public static final int VIEW_STATE_WINDOW_FOCUSED = 1;
+ /** @hide */
+ public static final int VIEW_STATE_SELECTED = 1 << 1;
+ /** @hide */
+ public static final int VIEW_STATE_FOCUSED = 1 << 2;
+ /** @hide */
+ public static final int VIEW_STATE_ENABLED = 1 << 3;
+ /** @hide */
+ public static final int VIEW_STATE_PRESSED = 1 << 4;
+ /** @hide */
+ public static final int VIEW_STATE_ACTIVATED = 1 << 5;
+ /** @hide */
+ public static final int VIEW_STATE_ACCELERATED = 1 << 6;
+ /** @hide */
+ public static final int VIEW_STATE_HOVERED = 1 << 7;
+ /** @hide */
+ public static final int VIEW_STATE_DRAG_CAN_ACCEPT = 1 << 8;
+ /** @hide */
+ public static final int VIEW_STATE_DRAG_HOVERED = 1 << 9;
+
+ static final int[] VIEW_STATE_IDS = new int[] {
+ R.attr.state_window_focused, VIEW_STATE_WINDOW_FOCUSED,
+ R.attr.state_selected, VIEW_STATE_SELECTED,
+ R.attr.state_focused, VIEW_STATE_FOCUSED,
+ R.attr.state_enabled, VIEW_STATE_ENABLED,
+ R.attr.state_pressed, VIEW_STATE_PRESSED,
+ R.attr.state_activated, VIEW_STATE_ACTIVATED,
+ R.attr.state_accelerated, VIEW_STATE_ACCELERATED,
+ R.attr.state_hovered, VIEW_STATE_HOVERED,
+ R.attr.state_drag_can_accept, VIEW_STATE_DRAG_CAN_ACCEPT,
+ R.attr.state_drag_hovered, VIEW_STATE_DRAG_HOVERED
+ };
+
+ static {
+ if ((VIEW_STATE_IDS.length / 2) != R.styleable.ViewDrawableStates.length) {
+ throw new IllegalStateException(
+ "VIEW_STATE_IDs array length does not match ViewDrawableStates style array");
+ }
+
+ final int[] orderedIds = new int[VIEW_STATE_IDS.length];
+ for (int i = 0; i < R.styleable.ViewDrawableStates.length; i++) {
+ final int viewState = R.styleable.ViewDrawableStates[i];
+ for (int j = 0; j < VIEW_STATE_IDS.length; j += 2) {
+ if (VIEW_STATE_IDS[j] == viewState) {
+ orderedIds[i * 2] = viewState;
+ orderedIds[i * 2 + 1] = VIEW_STATE_IDS[j + 1];
+ }
+ }
+ }
+
+ final int NUM_BITS = VIEW_STATE_IDS.length / 2;
+ VIEW_STATE_SETS = new int[1 << NUM_BITS][];
+ for (int i = 0; i < VIEW_STATE_SETS.length; i++) {
+ final int numBits = Integer.bitCount(i);
+ final int[] set = new int[numBits];
+ int pos = 0;
+ for (int j = 0; j < orderedIds.length; j += 2) {
+ if ((i & orderedIds[j + 1]) != 0) {
+ set[pos++] = orderedIds[j];
+ }
+ }
+ VIEW_STATE_SETS[i] = set;
+ }
+ }
+
+ /** @hide */
+ public static int[] get(int mask) {
+ if (mask >= VIEW_STATE_SETS.length) {
+ throw new IllegalArgumentException("Invalid state set mask");
+ }
+ return VIEW_STATE_SETS[mask];
+ }
+
+ /** @hide */
+ public StateSet() {}
public static final int[] WILD_CARD = new int[0];
public static final int[] NOTHING = new int[] { 0 };
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 12c0510..f486e0e 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -66,6 +66,7 @@
import android.util.Pools.SynchronizedPool;
import android.util.Property;
import android.util.SparseArray;
+import android.util.StateSet;
import android.util.SuperNotCalledException;
import android.util.TypedValue;
import android.view.ContextMenu.ContextMenuInfo;
@@ -1438,140 +1439,87 @@
*/
protected static final int[] PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
- /**
- * The order here is very important to {@link #getDrawableState()}
- */
- private static final int[][] VIEW_STATE_SETS;
-
- static final int VIEW_STATE_WINDOW_FOCUSED = 1;
- static final int VIEW_STATE_SELECTED = 1 << 1;
- static final int VIEW_STATE_FOCUSED = 1 << 2;
- static final int VIEW_STATE_ENABLED = 1 << 3;
- static final int VIEW_STATE_PRESSED = 1 << 4;
- static final int VIEW_STATE_ACTIVATED = 1 << 5;
- static final int VIEW_STATE_ACCELERATED = 1 << 6;
- static final int VIEW_STATE_HOVERED = 1 << 7;
- static final int VIEW_STATE_DRAG_CAN_ACCEPT = 1 << 8;
- static final int VIEW_STATE_DRAG_HOVERED = 1 << 9;
-
- static final int[] VIEW_STATE_IDS = new int[] {
- R.attr.state_window_focused, VIEW_STATE_WINDOW_FOCUSED,
- R.attr.state_selected, VIEW_STATE_SELECTED,
- R.attr.state_focused, VIEW_STATE_FOCUSED,
- R.attr.state_enabled, VIEW_STATE_ENABLED,
- R.attr.state_pressed, VIEW_STATE_PRESSED,
- R.attr.state_activated, VIEW_STATE_ACTIVATED,
- R.attr.state_accelerated, VIEW_STATE_ACCELERATED,
- R.attr.state_hovered, VIEW_STATE_HOVERED,
- R.attr.state_drag_can_accept, VIEW_STATE_DRAG_CAN_ACCEPT,
- R.attr.state_drag_hovered, VIEW_STATE_DRAG_HOVERED
- };
-
static {
- if ((VIEW_STATE_IDS.length/2) != R.styleable.ViewDrawableStates.length) {
- throw new IllegalStateException(
- "VIEW_STATE_IDs array length does not match ViewDrawableStates style array");
- }
- int[] orderedIds = new int[VIEW_STATE_IDS.length];
- for (int i = 0; i < R.styleable.ViewDrawableStates.length; i++) {
- int viewState = R.styleable.ViewDrawableStates[i];
- for (int j = 0; j<VIEW_STATE_IDS.length; j += 2) {
- if (VIEW_STATE_IDS[j] == viewState) {
- orderedIds[i * 2] = viewState;
- orderedIds[i * 2 + 1] = VIEW_STATE_IDS[j + 1];
- }
- }
- }
- final int NUM_BITS = VIEW_STATE_IDS.length / 2;
- VIEW_STATE_SETS = new int[1 << NUM_BITS][];
- for (int i = 0; i < VIEW_STATE_SETS.length; i++) {
- int numBits = Integer.bitCount(i);
- int[] set = new int[numBits];
- int pos = 0;
- for (int j = 0; j < orderedIds.length; j += 2) {
- if ((i & orderedIds[j+1]) != 0) {
- set[pos++] = orderedIds[j];
- }
- }
- VIEW_STATE_SETS[i] = set;
- }
+ EMPTY_STATE_SET = StateSet.get(0);
- EMPTY_STATE_SET = VIEW_STATE_SETS[0];
- WINDOW_FOCUSED_STATE_SET = VIEW_STATE_SETS[VIEW_STATE_WINDOW_FOCUSED];
- SELECTED_STATE_SET = VIEW_STATE_SETS[VIEW_STATE_SELECTED];
- SELECTED_WINDOW_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_WINDOW_FOCUSED | VIEW_STATE_SELECTED];
- FOCUSED_STATE_SET = VIEW_STATE_SETS[VIEW_STATE_FOCUSED];
- FOCUSED_WINDOW_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_WINDOW_FOCUSED | VIEW_STATE_FOCUSED];
- FOCUSED_SELECTED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_SELECTED | VIEW_STATE_FOCUSED];
- FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_WINDOW_FOCUSED | VIEW_STATE_SELECTED
- | VIEW_STATE_FOCUSED];
- ENABLED_STATE_SET = VIEW_STATE_SETS[VIEW_STATE_ENABLED];
- ENABLED_WINDOW_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_WINDOW_FOCUSED | VIEW_STATE_ENABLED];
- ENABLED_SELECTED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_SELECTED | VIEW_STATE_ENABLED];
- ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_WINDOW_FOCUSED | VIEW_STATE_SELECTED
- | VIEW_STATE_ENABLED];
- ENABLED_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_FOCUSED | VIEW_STATE_ENABLED];
- ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_WINDOW_FOCUSED | VIEW_STATE_FOCUSED
- | VIEW_STATE_ENABLED];
- ENABLED_FOCUSED_SELECTED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_SELECTED | VIEW_STATE_FOCUSED
- | VIEW_STATE_ENABLED];
- ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_WINDOW_FOCUSED | VIEW_STATE_SELECTED
- | VIEW_STATE_FOCUSED| VIEW_STATE_ENABLED];
+ WINDOW_FOCUSED_STATE_SET = StateSet.get(StateSet.VIEW_STATE_WINDOW_FOCUSED);
- PRESSED_STATE_SET = VIEW_STATE_SETS[VIEW_STATE_PRESSED];
- PRESSED_WINDOW_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_WINDOW_FOCUSED | VIEW_STATE_PRESSED];
- PRESSED_SELECTED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_SELECTED | VIEW_STATE_PRESSED];
- PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_WINDOW_FOCUSED | VIEW_STATE_SELECTED
- | VIEW_STATE_PRESSED];
- PRESSED_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_FOCUSED | VIEW_STATE_PRESSED];
- PRESSED_FOCUSED_WINDOW_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_WINDOW_FOCUSED | VIEW_STATE_FOCUSED
- | VIEW_STATE_PRESSED];
- PRESSED_FOCUSED_SELECTED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_SELECTED | VIEW_STATE_FOCUSED
- | VIEW_STATE_PRESSED];
- PRESSED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_WINDOW_FOCUSED | VIEW_STATE_SELECTED
- | VIEW_STATE_FOCUSED | VIEW_STATE_PRESSED];
- PRESSED_ENABLED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_ENABLED | VIEW_STATE_PRESSED];
- PRESSED_ENABLED_WINDOW_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_WINDOW_FOCUSED | VIEW_STATE_ENABLED
- | VIEW_STATE_PRESSED];
- PRESSED_ENABLED_SELECTED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_SELECTED | VIEW_STATE_ENABLED
- | VIEW_STATE_PRESSED];
- PRESSED_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_WINDOW_FOCUSED | VIEW_STATE_SELECTED
- | VIEW_STATE_ENABLED | VIEW_STATE_PRESSED];
- PRESSED_ENABLED_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_FOCUSED | VIEW_STATE_ENABLED
- | VIEW_STATE_PRESSED];
- PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_WINDOW_FOCUSED | VIEW_STATE_FOCUSED
- | VIEW_STATE_ENABLED | VIEW_STATE_PRESSED];
- PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_SELECTED | VIEW_STATE_FOCUSED
- | VIEW_STATE_ENABLED | VIEW_STATE_PRESSED];
- PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET = VIEW_STATE_SETS[
- VIEW_STATE_WINDOW_FOCUSED | VIEW_STATE_SELECTED
- | VIEW_STATE_FOCUSED| VIEW_STATE_ENABLED
- | VIEW_STATE_PRESSED];
+ SELECTED_STATE_SET = StateSet.get(StateSet.VIEW_STATE_SELECTED);
+ SELECTED_WINDOW_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_WINDOW_FOCUSED | StateSet.VIEW_STATE_SELECTED);
+
+ FOCUSED_STATE_SET = StateSet.get(StateSet.VIEW_STATE_FOCUSED);
+ FOCUSED_WINDOW_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_WINDOW_FOCUSED | StateSet.VIEW_STATE_FOCUSED);
+ FOCUSED_SELECTED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_SELECTED | StateSet.VIEW_STATE_FOCUSED);
+ FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_WINDOW_FOCUSED | StateSet.VIEW_STATE_SELECTED
+ | StateSet.VIEW_STATE_FOCUSED);
+
+ ENABLED_STATE_SET = StateSet.get(StateSet.VIEW_STATE_ENABLED);
+ ENABLED_WINDOW_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_WINDOW_FOCUSED | StateSet.VIEW_STATE_ENABLED);
+ ENABLED_SELECTED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_SELECTED | StateSet.VIEW_STATE_ENABLED);
+ ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_WINDOW_FOCUSED | StateSet.VIEW_STATE_SELECTED
+ | StateSet.VIEW_STATE_ENABLED);
+ ENABLED_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_FOCUSED | StateSet.VIEW_STATE_ENABLED);
+ ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_WINDOW_FOCUSED | StateSet.VIEW_STATE_FOCUSED
+ | StateSet.VIEW_STATE_ENABLED);
+ ENABLED_FOCUSED_SELECTED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_SELECTED | StateSet.VIEW_STATE_FOCUSED
+ | StateSet.VIEW_STATE_ENABLED);
+ ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_WINDOW_FOCUSED | StateSet.VIEW_STATE_SELECTED
+ | StateSet.VIEW_STATE_FOCUSED| StateSet.VIEW_STATE_ENABLED);
+
+ PRESSED_STATE_SET = StateSet.get(StateSet.VIEW_STATE_PRESSED);
+ PRESSED_WINDOW_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_WINDOW_FOCUSED | StateSet.VIEW_STATE_PRESSED);
+ PRESSED_SELECTED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_SELECTED | StateSet.VIEW_STATE_PRESSED);
+ PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_WINDOW_FOCUSED | StateSet.VIEW_STATE_SELECTED
+ | StateSet.VIEW_STATE_PRESSED);
+ PRESSED_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_FOCUSED | StateSet.VIEW_STATE_PRESSED);
+ PRESSED_FOCUSED_WINDOW_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_WINDOW_FOCUSED | StateSet.VIEW_STATE_FOCUSED
+ | StateSet.VIEW_STATE_PRESSED);
+ PRESSED_FOCUSED_SELECTED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_SELECTED | StateSet.VIEW_STATE_FOCUSED
+ | StateSet.VIEW_STATE_PRESSED);
+ PRESSED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_WINDOW_FOCUSED | StateSet.VIEW_STATE_SELECTED
+ | StateSet.VIEW_STATE_FOCUSED | StateSet.VIEW_STATE_PRESSED);
+ PRESSED_ENABLED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_ENABLED | StateSet.VIEW_STATE_PRESSED);
+ PRESSED_ENABLED_WINDOW_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_WINDOW_FOCUSED | StateSet.VIEW_STATE_ENABLED
+ | StateSet.VIEW_STATE_PRESSED);
+ PRESSED_ENABLED_SELECTED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_SELECTED | StateSet.VIEW_STATE_ENABLED
+ | StateSet.VIEW_STATE_PRESSED);
+ PRESSED_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_WINDOW_FOCUSED | StateSet.VIEW_STATE_SELECTED
+ | StateSet.VIEW_STATE_ENABLED | StateSet.VIEW_STATE_PRESSED);
+ PRESSED_ENABLED_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_FOCUSED | StateSet.VIEW_STATE_ENABLED
+ | StateSet.VIEW_STATE_PRESSED);
+ PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_WINDOW_FOCUSED | StateSet.VIEW_STATE_FOCUSED
+ | StateSet.VIEW_STATE_ENABLED | StateSet.VIEW_STATE_PRESSED);
+ PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_SELECTED | StateSet.VIEW_STATE_FOCUSED
+ | StateSet.VIEW_STATE_ENABLED | StateSet.VIEW_STATE_PRESSED);
+ PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET = StateSet.get(
+ StateSet.VIEW_STATE_WINDOW_FOCUSED | StateSet.VIEW_STATE_SELECTED
+ | StateSet.VIEW_STATE_FOCUSED| StateSet.VIEW_STATE_ENABLED
+ | StateSet.VIEW_STATE_PRESSED);
}
/**
@@ -5270,8 +5218,10 @@
* @see #sendAccessibilityEvent(int)
*
* Note: Called from the default {@link AccessibilityDelegate}.
+ *
+ * @hide
*/
- void sendAccessibilityEventInternal(int eventType) {
+ public void sendAccessibilityEventInternal(int eventType) {
if (AccessibilityManager.getInstance(mContext).isEnabled()) {
sendAccessibilityEventUnchecked(AccessibilityEvent.obtain(eventType));
}
@@ -5304,8 +5254,10 @@
* @see #sendAccessibilityEventUnchecked(AccessibilityEvent)
*
* Note: Called from the default {@link AccessibilityDelegate}.
+ *
+ * @hide
*/
- void sendAccessibilityEventUncheckedInternal(AccessibilityEvent event) {
+ public void sendAccessibilityEventUncheckedInternal(AccessibilityEvent event) {
if (!isShown()) {
return;
}
@@ -5355,8 +5307,10 @@
* @see #dispatchPopulateAccessibilityEvent(AccessibilityEvent)
*
* Note: Called from the default {@link AccessibilityDelegate}.
+ *
+ * @hide
*/
- boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
+ public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
onPopulateAccessibilityEvent(event);
return false;
}
@@ -5404,8 +5358,10 @@
* @see #onPopulateAccessibilityEvent(AccessibilityEvent)
*
* Note: Called from the default {@link AccessibilityDelegate}.
+ *
+ * @hide
*/
- void onPopulateAccessibilityEventInternal(AccessibilityEvent event) {
+ public void onPopulateAccessibilityEventInternal(AccessibilityEvent event) {
}
/**
@@ -5446,8 +5402,10 @@
* @see #onInitializeAccessibilityEvent(AccessibilityEvent)
*
* Note: Called from the default {@link AccessibilityDelegate}.
+ *
+ * @hide
*/
- void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
event.setSource(this);
event.setClassName(View.class.getName());
event.setPackageName(getContext().getPackageName());
@@ -5502,8 +5460,10 @@
/**
* @see #createAccessibilityNodeInfo()
+ *
+ * @hide
*/
- AccessibilityNodeInfo createAccessibilityNodeInfoInternal() {
+ public AccessibilityNodeInfo createAccessibilityNodeInfoInternal() {
AccessibilityNodeProvider provider = getAccessibilityNodeProvider();
if (provider != null) {
return provider.createAccessibilityNodeInfo(View.NO_ID);
@@ -5602,8 +5562,10 @@
* @see #onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)
*
* Note: Called from the default {@link AccessibilityDelegate}.
+ *
+ * @hide
*/
- void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
Rect bounds = mAttachInfo.mTmpInvalRect;
getDrawingRect(bounds);
@@ -8159,6 +8121,34 @@
}
/**
+ * Report an accessibility action to this view's parents for delegated processing.
+ *
+ * <p>Implementations of {@link #performAccessibilityAction(int, Bundle)} may internally
+ * call this method to delegate an accessibility action to a supporting parent. If the parent
+ * returns true from its
+ * {@link ViewParent#onNestedPrePerformAccessibilityAction(View, int, android.os.Bundle)}
+ * method this method will return true to signify that the action was consumed.</p>
+ *
+ * <p>This method is useful for implementing nested scrolling child views. If
+ * {@link #isNestedScrollingEnabled()} returns true and the action is a scrolling action
+ * a custom view implementation may invoke this method to allow a parent to consume the
+ * scroll first. If this method returns true the custom view should skip its own scrolling
+ * behavior.</p>
+ *
+ * @param action Accessibility action to delegate
+ * @param arguments Optional action arguments
+ * @return true if the action was consumed by a parent
+ */
+ public boolean dispatchNestedPrePerformAccessibilityAction(int action, Bundle arguments) {
+ for (ViewParent p = getParent(); p != null; p = p.getParent()) {
+ if (p.onNestedPrePerformAccessibilityAction(this, action, arguments)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
* Performs the specified accessibility action on the view. For
* possible accessibility actions look at {@link AccessibilityNodeInfo}.
* <p>
@@ -8168,6 +8158,11 @@
* is responsible for handling this call.
* </p>
*
+ * <p>The default implementation will delegate
+ * {@link AccessibilityNodeInfo#ACTION_SCROLL_BACKWARD} and
+ * {@link AccessibilityNodeInfo#ACTION_SCROLL_FORWARD} to nested scrolling parents if
+ * {@link #isNestedScrollingEnabled() nested scrolling is enabled} on this view.</p>
+ *
* @param action The action to perform.
* @param arguments Optional action arguments.
* @return Whether the action was performed.
@@ -8185,9 +8180,17 @@
*
* Note: Called from the default {@link AccessibilityDelegate}.
*
- * @hide Until we've refactored all accessibility delegation methods.
+ * @hide
*/
public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
+ if (isNestedScrollingEnabled()
+ && (action == AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD
+ || action == AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)) {
+ if (dispatchNestedPrePerformAccessibilityAction(action, arguments)) {
+ return true;
+ }
+ }
+
switch (action) {
case AccessibilityNodeInfo.ACTION_CLICK: {
if (isClickable()) {
@@ -16162,26 +16165,30 @@
int privateFlags = mPrivateFlags;
int viewStateIndex = 0;
- if ((privateFlags & PFLAG_PRESSED) != 0) viewStateIndex |= VIEW_STATE_PRESSED;
- if ((mViewFlags & ENABLED_MASK) == ENABLED) viewStateIndex |= VIEW_STATE_ENABLED;
- if (isFocused()) viewStateIndex |= VIEW_STATE_FOCUSED;
- if ((privateFlags & PFLAG_SELECTED) != 0) viewStateIndex |= VIEW_STATE_SELECTED;
- if (hasWindowFocus()) viewStateIndex |= VIEW_STATE_WINDOW_FOCUSED;
- if ((privateFlags & PFLAG_ACTIVATED) != 0) viewStateIndex |= VIEW_STATE_ACTIVATED;
+ if ((privateFlags & PFLAG_PRESSED) != 0) viewStateIndex |= StateSet.VIEW_STATE_PRESSED;
+ if ((mViewFlags & ENABLED_MASK) == ENABLED) viewStateIndex |= StateSet.VIEW_STATE_ENABLED;
+ if (isFocused()) viewStateIndex |= StateSet.VIEW_STATE_FOCUSED;
+ if ((privateFlags & PFLAG_SELECTED) != 0) viewStateIndex |= StateSet.VIEW_STATE_SELECTED;
+ if (hasWindowFocus()) viewStateIndex |= StateSet.VIEW_STATE_WINDOW_FOCUSED;
+ if ((privateFlags & PFLAG_ACTIVATED) != 0) viewStateIndex |= StateSet.VIEW_STATE_ACTIVATED;
if (mAttachInfo != null && mAttachInfo.mHardwareAccelerationRequested &&
HardwareRenderer.isAvailable()) {
// This is set if HW acceleration is requested, even if the current
// process doesn't allow it. This is just to allow app preview
// windows to better match their app.
- viewStateIndex |= VIEW_STATE_ACCELERATED;
+ viewStateIndex |= StateSet.VIEW_STATE_ACCELERATED;
}
- if ((privateFlags & PFLAG_HOVERED) != 0) viewStateIndex |= VIEW_STATE_HOVERED;
+ if ((privateFlags & PFLAG_HOVERED) != 0) viewStateIndex |= StateSet.VIEW_STATE_HOVERED;
final int privateFlags2 = mPrivateFlags2;
- if ((privateFlags2 & PFLAG2_DRAG_CAN_ACCEPT) != 0) viewStateIndex |= VIEW_STATE_DRAG_CAN_ACCEPT;
- if ((privateFlags2 & PFLAG2_DRAG_HOVERED) != 0) viewStateIndex |= VIEW_STATE_DRAG_HOVERED;
+ if ((privateFlags2 & PFLAG2_DRAG_CAN_ACCEPT) != 0) {
+ viewStateIndex |= StateSet.VIEW_STATE_DRAG_CAN_ACCEPT;
+ }
+ if ((privateFlags2 & PFLAG2_DRAG_HOVERED) != 0) {
+ viewStateIndex |= StateSet.VIEW_STATE_DRAG_HOVERED;
+ }
- drawableState = VIEW_STATE_SETS[viewStateIndex];
+ drawableState = StateSet.get(viewStateIndex);
//noinspection ConstantIfStatement
if (false) {
@@ -16269,6 +16276,19 @@
}
/**
+ * If the view has a ColorDrawable background, returns the color of that
+ * drawable.
+ *
+ * @return The color of the ColorDrawable background, if set, otherwise 0.
+ */
+ public int getBackgroundColor() {
+ if (mBackground instanceof ColorDrawable) {
+ return ((ColorDrawable) mBackground).getColor();
+ }
+ return 0;
+ }
+
+ /**
* Set the background to a given resource. The resource should refer to
* a Drawable object or 0 to remove the background.
* @param resid The identifier of the resource.
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 10af0c3..d03e098 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -32,6 +32,7 @@
import android.graphics.RectF;
import android.graphics.Region;
import android.os.Build;
+import android.os.Bundle;
import android.os.Parcelable;
import android.os.SystemClock;
import android.util.AttributeSet;
@@ -773,8 +774,10 @@
* @see #onRequestSendAccessibilityEvent(View, AccessibilityEvent)
*
* Note: Called from the default {@link View.AccessibilityDelegate}.
+ *
+ * @hide
*/
- boolean onRequestSendAccessibilityEventInternal(View child, AccessibilityEvent event) {
+ public boolean onRequestSendAccessibilityEventInternal(View child, AccessibilityEvent event) {
return true;
}
@@ -2845,8 +2848,9 @@
}
}
+ /** @hide */
@Override
- boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
+ public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
boolean handled = false;
if (includeForAccessibility()) {
handled = super.dispatchPopulateAccessibilityEventInternal(event);
@@ -2873,8 +2877,9 @@
return false;
}
+ /** @hide */
@Override
- void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfoInternal(info);
if (mAttachInfo != null) {
final ArrayList<View> childrenForAccessibility = mAttachInfo.mTempArrayList;
@@ -2889,8 +2894,9 @@
}
}
+ /** @hide */
@Override
- void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
super.onInitializeAccessibilityEventInternal(event);
event.setClassName(ViewGroup.class.getName());
}
@@ -2923,6 +2929,22 @@
/**
* {@inheritDoc}
+ *
+ * <p>Subclasses should always call <code>super.onNestedPrePerformAccessibilityAction</code></p>
+ *
+ * @param target The target view dispatching this action
+ * @param action Action being performed; see
+ * {@link android.view.accessibility.AccessibilityNodeInfo}
+ * @param args Optional action arguments
+ * @return false by default. Subclasses should return true if they handle the event.
+ */
+ @Override
+ public boolean onNestedPrePerformAccessibilityAction(View target, int action, Bundle args) {
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
*/
@Override
void dispatchDetachedFromWindow() {
diff --git a/core/java/android/view/ViewParent.java b/core/java/android/view/ViewParent.java
index 87a37f4..035871d 100644
--- a/core/java/android/view/ViewParent.java
+++ b/core/java/android/view/ViewParent.java
@@ -17,6 +17,7 @@
package android.view;
import android.graphics.Rect;
+import android.os.Bundle;
import android.view.accessibility.AccessibilityEvent;
/**
@@ -551,4 +552,23 @@
* @return true if this parent consumed the fling ahead of the target view
*/
public boolean onNestedPreFling(View target, float velocityX, float velocityY);
+
+ /**
+ * React to an accessibility action delegated by a target descendant view before the target
+ * processes it.
+ *
+ * <p>This method may be called by a target descendant view if the target wishes to give
+ * a view in its parent chain a chance to react to the event before normal processing occurs.
+ * Most commonly this will be a scroll event such as
+ * {@link android.view.accessibility.AccessibilityNodeInfo#ACTION_SCROLL_FORWARD}.
+ * A ViewParent that supports acting as a nested scrolling parent should override this
+ * method and act accordingly to implement scrolling via accesibility systems.</p>
+ *
+ * @param target The target view dispatching this action
+ * @param action Action being performed; see
+ * {@link android.view.accessibility.AccessibilityNodeInfo}
+ * @param arguments Optional action arguments
+ * @return true if the action was consumed by this ViewParent
+ */
+ public boolean onNestedPrePerformAccessibilityAction(View target, int action, Bundle arguments);
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 34c27d7..87d9a58 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -560,39 +560,43 @@
case WindowManagerGlobal.ADD_BAD_APP_TOKEN:
case WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN:
throw new WindowManager.BadTokenException(
- "Unable to add window -- token " + attrs.token
- + " is not valid; is your activity running?");
+ "Unable to add window -- token " + attrs.token
+ + " is not valid; is your activity running?");
case WindowManagerGlobal.ADD_NOT_APP_TOKEN:
throw new WindowManager.BadTokenException(
- "Unable to add window -- token " + attrs.token
- + " is not for an application");
+ "Unable to add window -- token " + attrs.token
+ + " is not for an application");
case WindowManagerGlobal.ADD_APP_EXITING:
throw new WindowManager.BadTokenException(
- "Unable to add window -- app for token " + attrs.token
- + " is exiting");
+ "Unable to add window -- app for token " + attrs.token
+ + " is exiting");
case WindowManagerGlobal.ADD_DUPLICATE_ADD:
throw new WindowManager.BadTokenException(
- "Unable to add window -- window " + mWindow
- + " has already been added");
+ "Unable to add window -- window " + mWindow
+ + " has already been added");
case WindowManagerGlobal.ADD_STARTING_NOT_NEEDED:
// Silently ignore -- we would have just removed it
// right away, anyway.
return;
case WindowManagerGlobal.ADD_MULTIPLE_SINGLETON:
throw new WindowManager.BadTokenException(
- "Unable to add window " + mWindow +
- " -- another window of this type already exists");
+ "Unable to add window " + mWindow +
+ " -- another window of this type already exists");
case WindowManagerGlobal.ADD_PERMISSION_DENIED:
throw new WindowManager.BadTokenException(
- "Unable to add window " + mWindow +
- " -- permission denied for this window type");
+ "Unable to add window " + mWindow +
+ " -- permission denied for this window type");
case WindowManagerGlobal.ADD_INVALID_DISPLAY:
throw new WindowManager.InvalidDisplayException(
- "Unable to add window " + mWindow +
- " -- the specified display can not be found");
+ "Unable to add window " + mWindow +
+ " -- the specified display can not be found");
+ case WindowManagerGlobal.ADD_INVALID_TYPE:
+ throw new WindowManager.InvalidDisplayException(
+ "Unable to add window " + mWindow
+ + " -- the specified window type is not valid");
}
throw new RuntimeException(
- "Unable to add window -- unknown error code " + res);
+ "Unable to add window -- unknown error code " + res);
}
if (view instanceof RootViewSurfaceTaker) {
@@ -6413,6 +6417,11 @@
return false;
}
+ @Override
+ public boolean onNestedPrePerformAccessibilityAction(View target, int action, Bundle args) {
+ return false;
+ }
+
void changeCanvasOpacity(boolean opaque) {
Log.d(TAG, "changeCanvasOpacity: opaque=" + opaque);
if (mAttachInfo.mHardwareRenderer != null) {
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index 55c6cb89..3f2f3a5 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -156,7 +156,10 @@
public static final String NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME =
"android:navigation:background";
- /** The default features enabled */
+ /**
+ * The default features enabled.
+ * @deprecated use {@link #getDefaultFeatures(android.content.Context)} instead.
+ */
@Deprecated
@SuppressWarnings({"PointlessBitwiseExpression"})
protected static final int DEFAULT_FEATURES = (1 << FEATURE_OPTIONS_PANEL) |
@@ -1087,6 +1090,10 @@
/**
* Sets the window elevation.
+ * <p>
+ * Changes to this property take effect immediately and will cause the
+ * window surface to be recreated. This is an expensive operation and as a
+ * result, this property should not be animated.
*
* @param elevation The window elevation.
* @see View#setElevation(float)
diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java
index 0d3727b..ed17e3f 100644
--- a/core/java/android/view/WindowManagerGlobal.java
+++ b/core/java/android/view/WindowManagerGlobal.java
@@ -103,6 +103,7 @@
public static final int ADD_MULTIPLE_SINGLETON = -7;
public static final int ADD_PERMISSION_DENIED = -8;
public static final int ADD_INVALID_DISPLAY = -9;
+ public static final int ADD_INVALID_TYPE = -10;
private static WindowManagerGlobal sDefaultWindowManager;
private static IWindowManager sWindowManagerService;
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 3694863..792382d 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -1662,11 +1662,12 @@
* the portion of the HTML document that needs to be drawn. These
* optimizations are transparent to the developers. However, under certain
* circumstances, an App developer may want to disable them:
- * 1. When an app uses {@link #onDraw} to do own drawing and accesses portions
- * of the page that is way outside the visible portion of the page.
- * 2. When an app uses {@link #capturePicture} to capture a very large HTML document.
- * Note that capturePicture is a deprecated API.
- *
+ * <ol>
+ * <li>When an app uses {@link #onDraw} to do own drawing and accesses portions
+ * of the page that is way outside the visible portion of the page.</li>
+ * <li>When an app uses {@link #capturePicture} to capture a very large HTML document.
+ * Note that capturePicture is a deprecated API.</li>
+ * </ol>
* Enabling drawing the entire HTML document has a significant performance
* cost. This method should be called before any WebViews are created.
*/
@@ -2070,7 +2071,7 @@
}
public boolean super_performAccessibilityAction(int action, Bundle arguments) {
- return WebView.super.performAccessibilityAction(action, arguments);
+ return WebView.super.performAccessibilityActionInternal(action, arguments);
}
public boolean super_performLongClick() {
@@ -2378,22 +2379,25 @@
return mProvider.getViewDelegate().shouldDelayChildPressedState();
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(WebView.class.getName());
mProvider.getViewDelegate().onInitializeAccessibilityNodeInfo(info);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(WebView.class.getName());
mProvider.getViewDelegate().onInitializeAccessibilityEvent(event);
}
+ /** @hide */
@Override
- public boolean performAccessibilityAction(int action, Bundle arguments) {
+ public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
return mProvider.getViewDelegate().performAccessibilityAction(action, arguments);
}
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 1e269a3..7ea3265 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -1466,8 +1466,9 @@
onScrollChanged(0, 0, 0, 0); // dummy values, View's implementation does not use these.
}
+ /** @hide */
@Override
- public void sendAccessibilityEvent(int eventType) {
+ public void sendAccessibilityEventInternal(int eventType) {
// Since this class calls onScrollChanged even if the mFirstPosition and the
// child count have not changed we will avoid sending duplicate accessibility
// events.
@@ -1482,18 +1483,20 @@
mLastAccessibilityScrollEventToIndex = lastVisiblePosition;
}
}
- super.sendAccessibilityEvent(eventType);
+ super.sendAccessibilityEventInternal(eventType);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(AbsListView.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(AbsListView.class.getName());
if (isEnabled()) {
if (canScrollUp()) {
@@ -1522,9 +1525,10 @@
}
}
+ /** @hide */
@Override
- public boolean performAccessibilityAction(int action, Bundle arguments) {
- if (super.performAccessibilityAction(action, arguments)) {
+ public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
+ if (super.performAccessibilityActionInternal(action, arguments)) {
return true;
}
switch (action) {
diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java
index a3ce808..1f7be63 100644
--- a/core/java/android/widget/AbsSeekBar.java
+++ b/core/java/android/widget/AbsSeekBar.java
@@ -715,15 +715,17 @@
return super.onKeyDown(keyCode, event);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(AbsSeekBar.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(AbsSeekBar.class.getName());
if (isEnabled()) {
@@ -737,9 +739,10 @@
}
}
+ /** @hide */
@Override
- public boolean performAccessibilityAction(int action, Bundle arguments) {
- if (super.performAccessibilityAction(action, arguments)) {
+ public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
+ if (super.performAccessibilityActionInternal(action, arguments)) {
return true;
}
if (!isEnabled()) {
diff --git a/core/java/android/widget/AbsSpinner.java b/core/java/android/widget/AbsSpinner.java
index 6a4ad75..e13ddd1 100644
--- a/core/java/android/widget/AbsSpinner.java
+++ b/core/java/android/widget/AbsSpinner.java
@@ -471,15 +471,17 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(AbsSpinner.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(AbsSpinner.class.getName());
}
}
diff --git a/core/java/android/widget/ActionMenuPresenter.java b/core/java/android/widget/ActionMenuPresenter.java
index 18f15a0..94827dd 100644
--- a/core/java/android/widget/ActionMenuPresenter.java
+++ b/core/java/android/widget/ActionMenuPresenter.java
@@ -645,9 +645,10 @@
return false;
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setCanOpenPopup(true);
}
diff --git a/core/java/android/widget/ActionMenuView.java b/core/java/android/widget/ActionMenuView.java
index 0a8a01f..e5b6995 100644
--- a/core/java/android/widget/ActionMenuView.java
+++ b/core/java/android/widget/ActionMenuView.java
@@ -700,7 +700,8 @@
return result;
}
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ /** @hide */
+ public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
return false;
}
diff --git a/core/java/android/widget/AdapterView.java b/core/java/android/widget/AdapterView.java
index 5e2394c..428b6ce 100644
--- a/core/java/android/widget/AdapterView.java
+++ b/core/java/android/widget/AdapterView.java
@@ -929,8 +929,9 @@
}
}
+ /** @hide */
@Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
View selectedView = getSelectedView();
if (selectedView != null && selectedView.getVisibility() == VISIBLE
&& selectedView.dispatchPopulateAccessibilityEvent(event)) {
@@ -939,9 +940,10 @@
return false;
}
+ /** @hide */
@Override
- public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) {
- if (super.onRequestSendAccessibilityEvent(child, event)) {
+ public boolean onRequestSendAccessibilityEventInternal(View child, AccessibilityEvent event) {
+ if (super.onRequestSendAccessibilityEventInternal(child, event)) {
// Add a record for ourselves as well.
AccessibilityEvent record = AccessibilityEvent.obtain();
onInitializeAccessibilityEvent(record);
@@ -953,9 +955,10 @@
return false;
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(AdapterView.class.getName());
info.setScrollable(isScrollableForAccessibility());
View selectedView = getSelectedView();
@@ -964,9 +967,10 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(AdapterView.class.getName());
event.setScrollable(isScrollableForAccessibility());
View selectedView = getSelectedView();
diff --git a/core/java/android/widget/AdapterViewAnimator.java b/core/java/android/widget/AdapterViewAnimator.java
index 1bc2f4b..96eb0e2 100644
--- a/core/java/android/widget/AdapterViewAnimator.java
+++ b/core/java/android/widget/AdapterViewAnimator.java
@@ -1084,15 +1084,17 @@
public void fyiWillBeAdvancedByHostKThx() {
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(AdapterViewAnimator.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(AdapterViewAnimator.class.getName());
}
}
diff --git a/core/java/android/widget/AdapterViewFlipper.java b/core/java/android/widget/AdapterViewFlipper.java
index 285dee8..a7ba617 100644
--- a/core/java/android/widget/AdapterViewFlipper.java
+++ b/core/java/android/widget/AdapterViewFlipper.java
@@ -304,15 +304,17 @@
updateRunning(false);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(AdapterViewFlipper.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(AdapterViewFlipper.class.getName());
}
}
diff --git a/core/java/android/widget/Button.java b/core/java/android/widget/Button.java
index 1663620..90d77f9 100644
--- a/core/java/android/widget/Button.java
+++ b/core/java/android/widget/Button.java
@@ -111,15 +111,17 @@
super(context, attrs, defStyleAttr, defStyleRes);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(Button.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(Button.class.getName());
}
}
diff --git a/core/java/android/widget/CalendarView.java b/core/java/android/widget/CalendarView.java
index ed59ea6..d58da8f 100644
--- a/core/java/android/widget/CalendarView.java
+++ b/core/java/android/widget/CalendarView.java
@@ -501,13 +501,15 @@
mDelegate.onConfigurationChanged(newConfig);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
event.setClassName(CalendarView.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
info.setClassName(CalendarView.class.getName());
}
diff --git a/core/java/android/widget/CheckBox.java b/core/java/android/widget/CheckBox.java
index 71438c9..b1fb338 100644
--- a/core/java/android/widget/CheckBox.java
+++ b/core/java/android/widget/CheckBox.java
@@ -72,15 +72,17 @@
super(context, attrs, defStyleAttr, defStyleRes);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(CheckBox.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(CheckBox.class.getName());
}
}
diff --git a/core/java/android/widget/CheckedTextView.java b/core/java/android/widget/CheckedTextView.java
index 69969a9..477862b 100644
--- a/core/java/android/widget/CheckedTextView.java
+++ b/core/java/android/widget/CheckedTextView.java
@@ -435,16 +435,18 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(CheckedTextView.class.getName());
event.setChecked(mChecked);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(CheckedTextView.class.getName());
info.setCheckable(true);
info.setChecked(mChecked);
diff --git a/core/java/android/widget/Chronometer.java b/core/java/android/widget/Chronometer.java
index f94789d..05fc6a1 100644
--- a/core/java/android/widget/Chronometer.java
+++ b/core/java/android/widget/Chronometer.java
@@ -281,15 +281,17 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(Chronometer.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(Chronometer.class.getName());
}
}
diff --git a/core/java/android/widget/CompoundButton.java b/core/java/android/widget/CompoundButton.java
index 447ccc2..41a3915 100644
--- a/core/java/android/widget/CompoundButton.java
+++ b/core/java/android/widget/CompoundButton.java
@@ -324,16 +324,18 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(CompoundButton.class.getName());
event.setChecked(mChecked);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(CompoundButton.class.getName());
info.setCheckable(true);
info.setChecked(mChecked);
diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java
index 0ca08e1..0f0cd2e 100644
--- a/core/java/android/widget/DatePicker.java
+++ b/core/java/android/widget/DatePicker.java
@@ -283,26 +283,30 @@
return mDelegate.isEnabled();
}
+ /** @hide */
@Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
return mDelegate.dispatchPopulateAccessibilityEvent(event);
}
+ /** @hide */
@Override
- public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
- super.onPopulateAccessibilityEvent(event);
+ public void onPopulateAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onPopulateAccessibilityEventInternal(event);
mDelegate.onPopulateAccessibilityEvent(event);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
mDelegate.onInitializeAccessibilityEvent(event);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
mDelegate.onInitializeAccessibilityNodeInfo(info);
}
diff --git a/core/java/android/widget/DatePickerCalendarDelegate.java b/core/java/android/widget/DatePickerCalendarDelegate.java
index e75643ab..a3b834e5 100644
--- a/core/java/android/widget/DatePickerCalendarDelegate.java
+++ b/core/java/android/widget/DatePickerCalendarDelegate.java
@@ -145,8 +145,8 @@
// Use Theme attributes if possible
final int dayOfWeekTextAppearanceResId = a.getResourceId(
- R.styleable.DatePicker_dayOfWeekTextAppearance, -1);
- if (dayOfWeekTextAppearanceResId != -1) {
+ R.styleable.DatePicker_dayOfWeekTextAppearance, 0);
+ if (dayOfWeekTextAppearanceResId != 0) {
mDayOfWeekView.setTextAppearance(context, dayOfWeekTextAppearanceResId);
}
@@ -157,8 +157,8 @@
final int headerSelectedTextColor = a.getColor(
R.styleable.DatePicker_headerSelectedTextColor, defaultHighlightColor);
final int monthTextAppearanceResId = a.getResourceId(
- R.styleable.DatePicker_headerMonthTextAppearance, -1);
- if (monthTextAppearanceResId != -1) {
+ R.styleable.DatePicker_headerMonthTextAppearance, 0);
+ if (monthTextAppearanceResId != 0) {
mHeaderMonthTextView.setTextAppearance(context, monthTextAppearanceResId);
}
mHeaderMonthTextView.setTextColor(ColorStateList.addFirstIfMissing(
@@ -166,18 +166,18 @@
headerSelectedTextColor));
final int dayOfMonthTextAppearanceResId = a.getResourceId(
- R.styleable.DatePicker_headerDayOfMonthTextAppearance, -1);
- if (dayOfMonthTextAppearanceResId != -1) {
+ R.styleable.DatePicker_headerDayOfMonthTextAppearance, 0);
+ if (dayOfMonthTextAppearanceResId != 0) {
mHeaderDayOfMonthTextView.setTextAppearance(context, dayOfMonthTextAppearanceResId);
}
mHeaderDayOfMonthTextView.setTextColor(ColorStateList.addFirstIfMissing(
mHeaderDayOfMonthTextView.getTextColors(), R.attr.state_selected,
headerSelectedTextColor));
- final int yearTextAppearanceResId = a.getResourceId(
- R.styleable.DatePicker_headerYearTextAppearance, -1);
- if (yearTextAppearanceResId != -1) {
- mHeaderYearTextView.setTextAppearance(context, yearTextAppearanceResId);
+ final int headerYearTextAppearanceResId = a.getResourceId(
+ R.styleable.DatePicker_headerYearTextAppearance, 0);
+ if (headerYearTextAppearanceResId != 0) {
+ mHeaderYearTextView.setTextAppearance(context, headerYearTextAppearanceResId);
}
mHeaderYearTextView.setTextColor(ColorStateList.addFirstIfMissing(
mHeaderYearTextView.getTextColors(), R.attr.state_selected,
@@ -193,16 +193,23 @@
mYearPickerView = new YearPickerView(mContext);
mYearPickerView.init(this);
- final int yearSelectedCircleColor = a.getColor(R.styleable.DatePicker_yearListSelectorColor,
- defaultHighlightColor);
- mYearPickerView.setYearSelectedCircleColor(yearSelectedCircleColor);
+ final ColorStateList yearBackgroundColor = a.getColorStateList(
+ R.styleable.DatePicker_yearListSelectorColor);
+ mYearPickerView.setYearBackgroundColor(yearBackgroundColor);
+
+ final int yearTextAppearanceResId = a.getResourceId(
+ R.styleable.DatePicker_yearListItemTextAppearance, 0);
+ if (yearTextAppearanceResId != 0) {
+ mYearPickerView.setYearTextAppearance(yearTextAppearanceResId);
+ }
final ColorStateList calendarTextColor = a.getColorStateList(
R.styleable.DatePicker_calendarTextColor);
- final int calendarSelectedTextColor = a.getColor(
- R.styleable.DatePicker_calendarSelectedTextColor, defaultHighlightColor);
- mDayPickerView.setCalendarTextColor(ColorStateList.addFirstIfMissing(
- calendarTextColor, R.attr.state_selected, calendarSelectedTextColor));
+ mDayPickerView.setCalendarTextColor(calendarTextColor);
+
+ final ColorStateList calendarDayBackgroundColor = a.getColorStateList(
+ R.styleable.DatePicker_calendarDayBackgroundColor);
+ mDayPickerView.setCalendarDayBackgroundColor(calendarDayBackgroundColor);
mDayPickerDescription = res.getString(R.string.day_picker_description);
mSelectDay = res.getString(R.string.select_day);
diff --git a/core/java/android/widget/DayPickerView.java b/core/java/android/widget/DayPickerView.java
index 7db3fb9..65af45d 100644
--- a/core/java/android/widget/DayPickerView.java
+++ b/core/java/android/widget/DayPickerView.java
@@ -305,6 +305,10 @@
mAdapter.setCalendarTextColor(colors);
}
+ void setCalendarDayBackgroundColor(ColorStateList dayBackgroundColor) {
+ mAdapter.setCalendarDayBackgroundColor(dayBackgroundColor);
+ }
+
void setCalendarTextAppearance(int resId) {
mAdapter.setCalendarTextAppearance(resId);
}
@@ -459,9 +463,10 @@
mYearFormat = new SimpleDateFormat("yyyy", Locale.getDefault());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setItemCount(-1);
}
@@ -476,22 +481,26 @@
/**
* Necessary for accessibility, to ensure we support "scrolling" forward and backward
* in the month list.
+ *
+ * @hide
*/
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD);
info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_BACKWARD);
}
/**
* When scroll forward/backward events are received, announce the newly scrolled-to month.
+ *
+ * @hide
*/
@Override
- public boolean performAccessibilityAction(int action, Bundle arguments) {
+ public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
if (action != AccessibilityNodeInfo.ACTION_SCROLL_FORWARD &&
action != AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD) {
- return super.performAccessibilityAction(action, arguments);
+ return super.performAccessibilityActionInternal(action, arguments);
}
// Figure out what month is showing.
diff --git a/core/java/android/widget/DigitalClock.java b/core/java/android/widget/DigitalClock.java
index b6c1e5b9..372bdb3 100644
--- a/core/java/android/widget/DigitalClock.java
+++ b/core/java/android/widget/DigitalClock.java
@@ -115,16 +115,18 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
//noinspection deprecation
event.setClassName(DigitalClock.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
//noinspection deprecation
info.setClassName(DigitalClock.class.getName());
}
diff --git a/core/java/android/widget/EditText.java b/core/java/android/widget/EditText.java
index a8ff562..f54beb5 100644
--- a/core/java/android/widget/EditText.java
+++ b/core/java/android/widget/EditText.java
@@ -122,20 +122,23 @@
super.setEllipsize(ellipsis);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(EditText.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(EditText.class.getName());
}
+ /** @hide */
@Override
- public boolean performAccessibilityAction(int action, Bundle arguments) {
+ public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
switch (action) {
case AccessibilityNodeInfo.ACTION_SET_TEXT: {
CharSequence text = (arguments != null) ? arguments.getCharSequence(
@@ -147,7 +150,7 @@
return true;
}
default: {
- return super.performAccessibilityAction(action, arguments);
+ return super.performAccessibilityActionInternal(action, arguments);
}
}
}
diff --git a/core/java/android/widget/ExpandableListView.java b/core/java/android/widget/ExpandableListView.java
index 70089e0..675dc9bb 100644
--- a/core/java/android/widget/ExpandableListView.java
+++ b/core/java/android/widget/ExpandableListView.java
@@ -1341,15 +1341,17 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(ExpandableListView.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(ExpandableListView.class.getName());
}
}
diff --git a/core/java/android/widget/FrameLayout.java b/core/java/android/widget/FrameLayout.java
index d974c29..f208fff 100644
--- a/core/java/android/widget/FrameLayout.java
+++ b/core/java/android/widget/FrameLayout.java
@@ -704,15 +704,17 @@
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(FrameLayout.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(FrameLayout.class.getName());
}
diff --git a/core/java/android/widget/Gallery.java b/core/java/android/widget/Gallery.java
index f7c839f..3c428b0 100644
--- a/core/java/android/widget/Gallery.java
+++ b/core/java/android/widget/Gallery.java
@@ -1373,15 +1373,17 @@
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(Gallery.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(Gallery.class.getName());
info.setScrollable(mItemCount > 1);
if (isEnabled()) {
@@ -1394,9 +1396,10 @@
}
}
+ /** @hide */
@Override
- public boolean performAccessibilityAction(int action, Bundle arguments) {
- if (super.performAccessibilityAction(action, arguments)) {
+ public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
+ if (super.performAccessibilityActionInternal(action, arguments)) {
return true;
}
switch (action) {
diff --git a/core/java/android/widget/GridLayout.java b/core/java/android/widget/GridLayout.java
index 161ae7e..cc925ebc 100644
--- a/core/java/android/widget/GridLayout.java
+++ b/core/java/android/widget/GridLayout.java
@@ -1190,15 +1190,17 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(GridLayout.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(GridLayout.class.getName());
}
diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java
index efd6fc0..f7ce57b 100644
--- a/core/java/android/widget/GridView.java
+++ b/core/java/android/widget/GridView.java
@@ -2341,15 +2341,17 @@
return result;
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(GridView.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(GridView.class.getName());
final int columnsCount = getNumColumns();
diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java
index 371b480..c6c979e 100644
--- a/core/java/android/widget/HorizontalScrollView.java
+++ b/core/java/android/widget/HorizontalScrollView.java
@@ -774,9 +774,10 @@
outRects.add(bounds);
}
+ /** @hide */
@Override
- public boolean performAccessibilityAction(int action, Bundle arguments) {
- if (super.performAccessibilityAction(action, arguments)) {
+ public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
+ if (super.performAccessibilityActionInternal(action, arguments)) {
return true;
}
switch (action) {
@@ -806,9 +807,10 @@
return false;
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(HorizontalScrollView.class.getName());
final int scrollRange = getScrollRange();
if (scrollRange > 0) {
@@ -822,9 +824,10 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(HorizontalScrollView.class.getName());
event.setScrollable(getScrollRange() > 0);
event.setScrollX(mScrollX);
diff --git a/core/java/android/widget/ImageButton.java b/core/java/android/widget/ImageButton.java
index 3a20628..3b6825d 100644
--- a/core/java/android/widget/ImageButton.java
+++ b/core/java/android/widget/ImageButton.java
@@ -92,15 +92,17 @@
return false;
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(ImageButton.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(ImageButton.class.getName());
}
}
diff --git a/core/java/android/widget/ImageSwitcher.java b/core/java/android/widget/ImageSwitcher.java
index c048970..0910eb0 100644
--- a/core/java/android/widget/ImageSwitcher.java
+++ b/core/java/android/widget/ImageSwitcher.java
@@ -56,15 +56,17 @@
showNext();
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(ImageSwitcher.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(ImageSwitcher.class.getName());
}
}
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index c68bfca..fbad314 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -239,9 +239,10 @@
return (getBackground() != null && getBackground().getCurrent() != null);
}
+ /** @hide */
@Override
- public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
- super.onPopulateAccessibilityEvent(event);
+ public void onPopulateAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onPopulateAccessibilityEventInternal(event);
CharSequence contentDescription = getContentDescription();
if (!TextUtils.isEmpty(contentDescription)) {
event.getText().add(contentDescription);
@@ -1418,15 +1419,17 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(ImageView.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(ImageView.class.getName());
}
}
diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java
index 6476cdc..28e50c4 100644
--- a/core/java/android/widget/LinearLayout.java
+++ b/core/java/android/widget/LinearLayout.java
@@ -1806,15 +1806,17 @@
return p instanceof LinearLayout.LayoutParams;
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(LinearLayout.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(LinearLayout.class.getName());
}
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index ba6f061..df0d1fd 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -3878,15 +3878,17 @@
return false;
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(ListView.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(ListView.class.getName());
final int rowsCount = getCount();
diff --git a/core/java/android/widget/MediaController.java b/core/java/android/widget/MediaController.java
index f1aaa4d..4cafe72 100644
--- a/core/java/android/widget/MediaController.java
+++ b/core/java/android/widget/MediaController.java
@@ -625,15 +625,17 @@
super.setEnabled(enabled);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(MediaController.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(MediaController.class.getName());
}
diff --git a/core/java/android/widget/MultiAutoCompleteTextView.java b/core/java/android/widget/MultiAutoCompleteTextView.java
index cbd01b0..6954eea 100644
--- a/core/java/android/widget/MultiAutoCompleteTextView.java
+++ b/core/java/android/widget/MultiAutoCompleteTextView.java
@@ -202,15 +202,17 @@
editable.replace(start, end, mTokenizer.terminateToken(text));
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(MultiAutoCompleteTextView.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(MultiAutoCompleteTextView.class.getName());
}
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index ee17b78..16dc26d 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -1558,9 +1558,10 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(NumberPicker.class.getName());
event.setScrollable(true);
event.setScrollY((mMinValue + mValue) * mSelectorElementHeight);
diff --git a/core/java/android/widget/PopupMenu.java b/core/java/android/widget/PopupMenu.java
index 2708398..06ac1c3 100644
--- a/core/java/android/widget/PopupMenu.java
+++ b/core/java/android/widget/PopupMenu.java
@@ -115,6 +115,29 @@
}
/**
+ * Sets the gravity used to align the popup window to its anchor view.
+ * <p>
+ * If the popup is showing, calling this method will take effect only
+ * the next time the popup is shown.
+ *
+ * @param gravity the gravity used to align the popup window
+ *
+ * @see #getGravity()
+ */
+ public void setGravity(int gravity) {
+ mPopup.setGravity(gravity);
+ }
+
+ /**
+ * @return the gravity used to align the popup window to its anchor view
+ *
+ * @see #setGravity(int)
+ */
+ public int getGravity() {
+ return mPopup.getGravity();
+ }
+
+ /**
* Returns an {@link OnTouchListener} that can be added to the anchor view
* to implement drag-to-open behavior.
* <p>
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java
index 5419ab6c..f5cd915 100644
--- a/core/java/android/widget/PopupWindow.java
+++ b/core/java/android/widget/PopupWindow.java
@@ -18,11 +18,9 @@
import com.android.internal.R;
-import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
-import android.graphics.Insets;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
@@ -195,7 +193,7 @@
*/
public PopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
mContext = context;
- mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
+ mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
final TypedArray a = context.obtainStyledAttributes(
attrs, R.styleable.PopupWindow, defStyleAttr, defStyleRes);
@@ -871,6 +869,34 @@
}
/**
+ * Sets whether the popup window should overlap its anchor view when
+ * displayed as a drop-down.
+ * <p>
+ * If the popup is showing, calling this method will take effect only
+ * the next time the popup is shown.
+ *
+ * @param overlapAnchor Whether the popup should overlap its anchor.
+ *
+ * @see #getOverlapAnchor()
+ * @see #isShowing()
+ */
+ public void setOverlapAnchor(boolean overlapAnchor) {
+ mOverlapAnchor = overlapAnchor;
+ }
+
+ /**
+ * Returns whether the popup window should overlap its anchor view when
+ * displayed as a drop-down.
+ *
+ * @return Whether the popup should overlap its anchor.
+ *
+ * @see #setOverlapAnchor(boolean)
+ */
+ public boolean getOverlapAnchor() {
+ return mOverlapAnchor;
+ }
+
+ /**
* <p>Indicate whether this popup window is showing on screen.</p>
*
* @return true if the popup is showing, false otherwise
@@ -934,11 +960,12 @@
}
/**
- * <p>Display the content view in a popup window anchored to the bottom-left
+ * Display the content view in a popup window anchored to the bottom-left
* corner of the anchor view. If there is not enough room on screen to show
* the popup in its entirety, this method tries to find a parent scroll
- * view to scroll. If no parent scroll view can be scrolled, the bottom-left
- * corner of the popup is pinned at the top left corner of the anchor view.</p>
+ * view to scroll. If no parent scroll view can be scrolled, the
+ * bottom-left corner of the popup is pinned at the top left corner of the
+ * anchor view.
*
* @param anchor the view on which to pin the popup window
*
@@ -949,14 +976,15 @@
}
/**
- * <p>Display the content view in a popup window anchored to the bottom-left
+ * Display the content view in a popup window anchored to the bottom-left
* corner of the anchor view offset by the specified x and y coordinates.
- * If there is not enough room on screen to show
- * the popup in its entirety, this method tries to find a parent scroll
- * view to scroll. If no parent scroll view can be scrolled, the bottom-left
- * corner of the popup is pinned at the top left corner of the anchor view.</p>
- * <p>If the view later scrolls to move <code>anchor</code> to a different
- * location, the popup will be moved correspondingly.</p>
+ * If there is not enough room on screen to show the popup in its entirety,
+ * this method tries to find a parent scroll view to scroll. If no parent
+ * scroll view can be scrolled, the bottom-left corner of the popup is
+ * pinned at the top left corner of the anchor view.
+ * <p>
+ * If the view later scrolls to move <code>anchor</code> to a different
+ * location, the popup will be moved correspondingly.
*
* @param anchor the view on which to pin the popup window
* @param xoff A horizontal offset from the anchor in pixels
@@ -969,14 +997,17 @@
}
/**
- * <p>Display the content view in a popup window anchored to the bottom-left
- * corner of the anchor view offset by the specified x and y coordinates.
- * If there is not enough room on screen to show
- * the popup in its entirety, this method tries to find a parent scroll
- * view to scroll. If no parent scroll view can be scrolled, the bottom-left
- * corner of the popup is pinned at the top left corner of the anchor view.</p>
- * <p>If the view later scrolls to move <code>anchor</code> to a different
- * location, the popup will be moved correspondingly.</p>
+ * Displays the content view in a popup window anchored to the corner of
+ * another view. The window is positioned according to the specified
+ * gravity and offset by the specified x and y coordinates.
+ * <p>
+ * If there is not enough room on screen to show the popup in its entirety,
+ * this method tries to find a parent scroll view to scroll. If no parent
+ * view can be scrolled, the specified vertical gravity will be ignored and
+ * the popup will anchor itself such that it is visible.
+ * <p>
+ * If the view later scrolls to move <code>anchor</code> to a different
+ * location, the popup will be moved correspondingly.
*
* @param anchor the view on which to pin the popup window
* @param xoff A horizontal offset from the anchor in pixels
@@ -1571,7 +1602,7 @@
* @param height the new height, can be -1 to ignore
*/
public void update(View anchor, int width, int height) {
- update(anchor, false, 0, 0, true, width, height, mAnchoredGravity);
+ update(anchor, false, 0, 0, true, width, height);
}
/**
@@ -1590,30 +1621,26 @@
* @param height the new height, can be -1 to ignore
*/
public void update(View anchor, int xoff, int yoff, int width, int height) {
- update(anchor, true, xoff, yoff, true, width, height, mAnchoredGravity);
+ update(anchor, true, xoff, yoff, true, width, height);
}
private void update(View anchor, boolean updateLocation, int xoff, int yoff,
- boolean updateDimension, int width, int height, int gravity) {
+ boolean updateDimension, int width, int height) {
if (!isShowing() || mContentView == null) {
return;
}
- WeakReference<View> oldAnchor = mAnchor;
- final boolean needsUpdate = updateLocation
- && (mAnchorXoff != xoff || mAnchorYoff != yoff);
+ final WeakReference<View> oldAnchor = mAnchor;
+ final boolean needsUpdate = updateLocation && (mAnchorXoff != xoff || mAnchorYoff != yoff);
if (oldAnchor == null || oldAnchor.get() != anchor || (needsUpdate && !mIsDropdown)) {
- registerForScrollChanged(anchor, xoff, yoff, gravity);
+ registerForScrollChanged(anchor, xoff, yoff, mAnchoredGravity);
} else if (needsUpdate) {
// No need to register again if this is a DropDown, showAsDropDown already did.
mAnchorXoff = xoff;
mAnchorYoff = yoff;
- mAnchoredGravity = gravity;
}
- WindowManager.LayoutParams p = (WindowManager.LayoutParams) mPopupView.getLayoutParams();
-
if (updateDimension) {
if (width == -1) {
width = mPopupWidth;
@@ -1627,11 +1654,12 @@
}
}
- int x = p.x;
- int y = p.y;
-
+ final WindowManager.LayoutParams p =
+ (WindowManager.LayoutParams) mPopupView.getLayoutParams();
+ final int x = p.x;
+ final int y = p.y;
if (updateLocation) {
- updateAboveAnchor(findDropDownPosition(anchor, p, xoff, yoff, gravity));
+ updateAboveAnchor(findDropDownPosition(anchor, p, xoff, yoff, mAnchoredGravity));
} else {
updateAboveAnchor(findDropDownPosition(anchor, p, mAnchorXoff, mAnchorYoff,
mAnchoredGravity));
@@ -1748,13 +1776,14 @@
}
}
+ /** @hide */
@Override
- public void sendAccessibilityEvent(int eventType) {
+ public void sendAccessibilityEventInternal(int eventType) {
// clinets are interested in the content not the container, make it event source
if (mContentView != null) {
mContentView.sendAccessibilityEvent(eventType);
} else {
- super.sendAccessibilityEvent(eventType);
+ super.sendAccessibilityEventInternal(eventType);
}
}
}
diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java
index de1bbc7..d32cb10 100644
--- a/core/java/android/widget/ProgressBar.java
+++ b/core/java/android/widget/ProgressBar.java
@@ -1825,17 +1825,19 @@
mAttached = false;
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(ProgressBar.class.getName());
event.setItemCount(mMax);
event.setCurrentItemIndex(mProgress);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(ProgressBar.class.getName());
}
diff --git a/core/java/android/widget/QuickContactBadge.java b/core/java/android/widget/QuickContactBadge.java
index 23fa402..d0e8081 100644
--- a/core/java/android/widget/QuickContactBadge.java
+++ b/core/java/android/widget/QuickContactBadge.java
@@ -304,15 +304,17 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(QuickContactBadge.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(QuickContactBadge.class.getName());
}
diff --git a/core/java/android/widget/RadioButton.java b/core/java/android/widget/RadioButton.java
index afc4830..82280b4 100644
--- a/core/java/android/widget/RadioButton.java
+++ b/core/java/android/widget/RadioButton.java
@@ -79,15 +79,17 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(RadioButton.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(RadioButton.class.getName());
}
}
diff --git a/core/java/android/widget/RadioGroup.java b/core/java/android/widget/RadioGroup.java
index 78d05b0..c0f60eb 100644
--- a/core/java/android/widget/RadioGroup.java
+++ b/core/java/android/widget/RadioGroup.java
@@ -240,15 +240,17 @@
return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(RadioGroup.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(RadioGroup.class.getName());
}
diff --git a/core/java/android/widget/RatingBar.java b/core/java/android/widget/RatingBar.java
index 82b490e..2d0649d 100644
--- a/core/java/android/widget/RatingBar.java
+++ b/core/java/android/widget/RatingBar.java
@@ -331,15 +331,17 @@
super.setMax(max);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(RatingBar.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(RatingBar.class.getName());
}
}
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index 5b604cd..fe91d8e 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -1104,8 +1104,9 @@
return new LayoutParams(p);
}
+ /** @hide */
@Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
if (mTopToBottomLeftToRightSet == null) {
mTopToBottomLeftToRightSet = new TreeSet<View>(new TopToBottomLeftToRightComparator());
}
@@ -1127,15 +1128,17 @@
return false;
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(RelativeLayout.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(RelativeLayout.class.getName());
}
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index a90b392..1098419 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -809,9 +809,10 @@
awakenScrollBars();
}
+ /** @hide */
@Override
- public boolean performAccessibilityAction(int action, Bundle arguments) {
- if (super.performAccessibilityAction(action, arguments)) {
+ public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
+ if (super.performAccessibilityActionInternal(action, arguments)) {
return true;
}
if (!isEnabled()) {
@@ -838,9 +839,10 @@
return false;
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(ScrollView.class.getName());
if (isEnabled()) {
final int scrollRange = getScrollRange();
@@ -856,9 +858,10 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(ScrollView.class.getName());
final boolean scrollable = getScrollRange() > 0;
event.setScrollable(scrollable);
diff --git a/core/java/android/widget/SearchView.java b/core/java/android/widget/SearchView.java
index 4ee6418..a1f361a 100644
--- a/core/java/android/widget/SearchView.java
+++ b/core/java/android/widget/SearchView.java
@@ -1325,15 +1325,17 @@
setIconified(false);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(SearchView.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(SearchView.class.getName());
}
diff --git a/core/java/android/widget/SeekBar.java b/core/java/android/widget/SeekBar.java
index dc7c04c..aa5c055 100644
--- a/core/java/android/widget/SeekBar.java
+++ b/core/java/android/widget/SeekBar.java
@@ -124,15 +124,17 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(SeekBar.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(SeekBar.class.getName());
}
}
diff --git a/core/java/android/widget/SimpleMonthAdapter.java b/core/java/android/widget/SimpleMonthAdapter.java
index 24ebb2c..c807d56 100644
--- a/core/java/android/widget/SimpleMonthAdapter.java
+++ b/core/java/android/widget/SimpleMonthAdapter.java
@@ -39,6 +39,7 @@
private Calendar mSelectedDay = Calendar.getInstance();
private ColorStateList mCalendarTextColors = ColorStateList.valueOf(Color.BLACK);
+ private ColorStateList mCalendarDayBackgroundColor = ColorStateList.valueOf(Color.MAGENTA);
private OnDaySelectedListener mOnDaySelectedListener;
private int mFirstDayOfWeek;
@@ -88,6 +89,10 @@
mCalendarTextColors = colors;
}
+ void setCalendarDayBackgroundColor(ColorStateList dayBackgroundColor) {
+ mCalendarDayBackgroundColor = dayBackgroundColor;
+ }
+
/**
* Sets the text color, size, style, hint color, and highlight color from
* the specified TextAppearance resource. This is mostly copied from
@@ -144,9 +149,11 @@
v.setClickable(true);
v.setOnDayClickListener(mOnDayClickListener);
- if (mCalendarTextColors != null) {
- v.setTextColor(mCalendarTextColors);
- }
+ v.setMonthTextColor(mCalendarTextColors);
+ v.setDayOfWeekTextColor(mCalendarTextColors);
+ v.setDayTextColor(mCalendarTextColors);
+
+ v.setDayBackgroundColor(mCalendarDayBackgroundColor);
}
final int minMonth = mMinDate.get(Calendar.MONTH);
diff --git a/core/java/android/widget/SimpleMonthView.java b/core/java/android/widget/SimpleMonthView.java
index d2a37ac..58ad515 100644
--- a/core/java/android/widget/SimpleMonthView.java
+++ b/core/java/android/widget/SimpleMonthView.java
@@ -27,12 +27,13 @@
import android.graphics.Rect;
import android.graphics.Typeface;
import android.os.Bundle;
+import android.text.TextPaint;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.text.format.Time;
import android.util.AttributeSet;
import android.util.IntArray;
-import android.util.MathUtils;
+import android.util.StateSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
@@ -44,7 +45,6 @@
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Formatter;
-import java.util.List;
import java.util.Locale;
/**
@@ -52,8 +52,7 @@
* within the specified month.
*/
class SimpleMonthView extends View {
- private static final int DEFAULT_HEIGHT = 32;
- private static final int MIN_HEIGHT = 10;
+ private static final int MIN_ROW_HEIGHT = 10;
private static final int DEFAULT_SELECTED_DAY = -1;
private static final int DEFAULT_WEEK_START = Calendar.SUNDAY;
@@ -61,18 +60,21 @@
private static final int DEFAULT_NUM_ROWS = 6;
private static final int MAX_NUM_ROWS = 6;
- private static final int SELECTED_CIRCLE_ALPHA = 60;
-
- private static final int DAY_SEPARATOR_WIDTH = 1;
-
private final Formatter mFormatter;
private final StringBuilder mStringBuilder;
- private final int mMiniDayNumberTextSize;
- private final int mMonthLabelTextSize;
- private final int mMonthDayLabelTextSize;
- private final int mMonthHeaderSize;
- private final int mDaySelectedCircleSize;
+ private final int mMonthTextSize;
+ private final int mDayOfWeekTextSize;
+ private final int mDayTextSize;
+
+ /** Height of the header containing the month and day of week labels. */
+ private final int mMonthHeaderHeight;
+
+ private final TextPaint mMonthPaint = new TextPaint();
+ private final TextPaint mDayOfWeekPaint = new TextPaint();
+ private final TextPaint mDayPaint = new TextPaint();
+
+ private final Paint mDayBackgroundPaint = new Paint();
/** Single-letter (when available) formatter for the day of week label. */
private SimpleDateFormat mDayFormatter = new SimpleDateFormat("EEEEE", Locale.getDefault());
@@ -81,14 +83,7 @@
private int mPadding = 0;
private String mDayOfWeekTypeface;
- private String mMonthTitleTypeface;
-
- private Paint mDayNumberPaint;
- private Paint mDayNumberDisabledPaint;
- private Paint mDayNumberSelectedPaint;
-
- private Paint mMonthTitlePaint;
- private Paint mMonthDayLabelPaint;
+ private String mMonthTypeface;
private int mMonth;
private int mYear;
@@ -97,13 +92,13 @@
private int mWidth;
// The height this view should draw at in pixels, set by height param
- private int mRowHeight = DEFAULT_HEIGHT;
+ private final int mRowHeight;
// If this view contains the today
private boolean mHasToday = false;
// Which day is selected [0-6] or -1 if no day is selected
- private int mSelectedDay = -1;
+ private int mActivatedDay = -1;
// Which day is today [0-6] or -1 if no day is today
private int mToday = DEFAULT_SELECTED_DAY;
@@ -142,6 +137,8 @@
private int mDisabledTextColor;
private int mSelectedDayColor;
+ private ColorStateList mDayTextColor;
+
public SimpleMonthView(Context context) {
this(context, null);
}
@@ -159,22 +156,21 @@
final Resources res = context.getResources();
mDayOfWeekTypeface = res.getString(R.string.day_of_week_label_typeface);
- mMonthTitleTypeface = res.getString(R.string.sans_serif);
+ mMonthTypeface = res.getString(R.string.sans_serif);
mStringBuilder = new StringBuilder(50);
mFormatter = new Formatter(mStringBuilder, Locale.getDefault());
- mMiniDayNumberTextSize = res.getDimensionPixelSize(R.dimen.datepicker_day_number_size);
- mMonthLabelTextSize = res.getDimensionPixelSize(R.dimen.datepicker_month_label_size);
- mMonthDayLabelTextSize = res.getDimensionPixelSize(
+ mDayTextSize = res.getDimensionPixelSize(R.dimen.datepicker_day_number_size);
+ mMonthTextSize = res.getDimensionPixelSize(R.dimen.datepicker_month_label_size);
+ mDayOfWeekTextSize = res.getDimensionPixelSize(
R.dimen.datepicker_month_day_label_text_size);
- mMonthHeaderSize = res.getDimensionPixelOffset(
+ mMonthHeaderHeight = res.getDimensionPixelOffset(
R.dimen.datepicker_month_list_item_header_height);
- mDaySelectedCircleSize = res.getDimensionPixelSize(
- R.dimen.datepicker_day_number_select_circle_radius);
- mRowHeight = (res.getDimensionPixelOffset(R.dimen.datepicker_view_animator_height)
- - mMonthHeaderSize) / MAX_NUM_ROWS;
+ mRowHeight = Math.max(MIN_ROW_HEIGHT,
+ (res.getDimensionPixelOffset(R.dimen.datepicker_view_animator_height)
+ - mMonthHeaderHeight) / MAX_NUM_ROWS);
// Set up accessibility components.
mTouchHelper = new MonthViewTouchHelper(this);
@@ -182,8 +178,32 @@
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
mLockAccessibilityDelegate = true;
- // Sets up any standard paints that will be used
- initView();
+ initPaints();
+ }
+
+ /**
+ * Sets up the text and style properties for painting.
+ */
+ private void initPaints() {
+ mMonthPaint.setAntiAlias(true);
+ mMonthPaint.setTextSize(mMonthTextSize);
+ mMonthPaint.setTypeface(Typeface.create(mMonthTypeface, Typeface.BOLD));
+ mMonthPaint.setTextAlign(Align.CENTER);
+ mMonthPaint.setStyle(Style.FILL);
+
+ mDayOfWeekPaint.setAntiAlias(true);
+ mDayOfWeekPaint.setTextSize(mDayOfWeekTextSize);
+ mDayOfWeekPaint.setTypeface(Typeface.create(mDayOfWeekTypeface, Typeface.BOLD));
+ mDayOfWeekPaint.setTextAlign(Align.CENTER);
+ mDayOfWeekPaint.setStyle(Style.FILL);
+
+ mDayBackgroundPaint.setAntiAlias(true);
+ mDayBackgroundPaint.setStyle(Style.FILL);
+
+ mDayPaint.setAntiAlias(true);
+ mDayPaint.setTextSize(mDayTextSize);
+ mDayPaint.setTextAlign(Align.CENTER);
+ mDayPaint.setStyle(Style.FILL);
}
@Override
@@ -193,22 +213,28 @@
mDayFormatter = new SimpleDateFormat("EEEEE", newConfig.locale);
}
- void setTextColor(ColorStateList colors) {
- final Resources res = getContext().getResources();
+ void setMonthTextColor(ColorStateList monthTextColor) {
+ final int enabledColor = monthTextColor.getColorForState(ENABLED_STATE_SET, 0);
+ mMonthPaint.setColor(enabledColor);
+ invalidate();
+ }
- mNormalTextColor = colors.getColorForState(ENABLED_STATE_SET,
- res.getColor(R.color.datepicker_default_normal_text_color_holo_light));
- mMonthTitlePaint.setColor(mNormalTextColor);
- mMonthDayLabelPaint.setColor(mNormalTextColor);
+ void setDayOfWeekTextColor(ColorStateList dayOfWeekTextColor) {
+ final int enabledColor = dayOfWeekTextColor.getColorForState(ENABLED_STATE_SET, 0);
+ mDayOfWeekPaint.setColor(enabledColor);
+ invalidate();
+ }
- mDisabledTextColor = colors.getColorForState(EMPTY_STATE_SET,
- res.getColor(R.color.datepicker_default_disabled_text_color_holo_light));
- mDayNumberDisabledPaint.setColor(mDisabledTextColor);
+ void setDayTextColor(ColorStateList dayTextColor) {
+ mDayTextColor = dayTextColor;
+ invalidate();
+ }
- mSelectedDayColor = colors.getColorForState(ENABLED_SELECTED_STATE_SET,
- res.getColor(R.color.holo_blue_light));
- mDayNumberSelectedPaint.setColor(mSelectedDayColor);
- mDayNumberSelectedPaint.setAlpha(SELECTED_CIRCLE_ALPHA);
+ void setDayBackgroundColor(ColorStateList dayBackgroundColor) {
+ final int activatedColor = dayBackgroundColor.getColorForState(
+ StateSet.get(StateSet.VIEW_STATE_ENABLED | StateSet.VIEW_STATE_ACTIVATED), 0);
+ mDayBackgroundPaint.setColor(activatedColor);
+ invalidate();
}
@Override
@@ -246,52 +272,6 @@
return true;
}
- /**
- * Sets up the text and style properties for painting.
- */
- private void initView() {
- mMonthTitlePaint = new Paint();
- mMonthTitlePaint.setAntiAlias(true);
- mMonthTitlePaint.setColor(mNormalTextColor);
- mMonthTitlePaint.setTextSize(mMonthLabelTextSize);
- mMonthTitlePaint.setTypeface(Typeface.create(mMonthTitleTypeface, Typeface.BOLD));
- mMonthTitlePaint.setTextAlign(Align.CENTER);
- mMonthTitlePaint.setStyle(Style.FILL);
- mMonthTitlePaint.setFakeBoldText(true);
-
- mMonthDayLabelPaint = new Paint();
- mMonthDayLabelPaint.setAntiAlias(true);
- mMonthDayLabelPaint.setColor(mNormalTextColor);
- mMonthDayLabelPaint.setTextSize(mMonthDayLabelTextSize);
- mMonthDayLabelPaint.setTypeface(Typeface.create(mDayOfWeekTypeface, Typeface.NORMAL));
- mMonthDayLabelPaint.setTextAlign(Align.CENTER);
- mMonthDayLabelPaint.setStyle(Style.FILL);
- mMonthDayLabelPaint.setFakeBoldText(true);
-
- mDayNumberSelectedPaint = new Paint();
- mDayNumberSelectedPaint.setAntiAlias(true);
- mDayNumberSelectedPaint.setColor(mSelectedDayColor);
- mDayNumberSelectedPaint.setAlpha(SELECTED_CIRCLE_ALPHA);
- mDayNumberSelectedPaint.setTextAlign(Align.CENTER);
- mDayNumberSelectedPaint.setStyle(Style.FILL);
- mDayNumberSelectedPaint.setFakeBoldText(true);
-
- mDayNumberPaint = new Paint();
- mDayNumberPaint.setAntiAlias(true);
- mDayNumberPaint.setTextSize(mMiniDayNumberTextSize);
- mDayNumberPaint.setTextAlign(Align.CENTER);
- mDayNumberPaint.setStyle(Style.FILL);
- mDayNumberPaint.setFakeBoldText(false);
-
- mDayNumberDisabledPaint = new Paint();
- mDayNumberDisabledPaint.setAntiAlias(true);
- mDayNumberDisabledPaint.setColor(mDisabledTextColor);
- mDayNumberDisabledPaint.setTextSize(mMiniDayNumberTextSize);
- mDayNumberDisabledPaint.setTextAlign(Align.CENTER);
- mDayNumberDisabledPaint.setStyle(Style.FILL);
- mDayNumberDisabledPaint.setFakeBoldText(false);
- }
-
@Override
protected void onDraw(Canvas canvas) {
drawMonthTitle(canvas);
@@ -323,11 +303,7 @@
*/
void setMonthParams(int selectedDay, int month, int year, int weekStart, int enabledDayStart,
int enabledDayEnd) {
- if (mRowHeight < MIN_HEIGHT) {
- mRowHeight = MIN_HEIGHT;
- }
-
- mSelectedDay = selectedDay;
+ mActivatedDay = selectedDay;
if (isValidMonth(month)) {
mMonth = month;
@@ -415,7 +391,7 @@
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), mRowHeight * mNumRows
- + mMonthHeaderSize);
+ + mMonthHeaderHeight);
}
@Override
@@ -437,21 +413,28 @@
private void drawMonthTitle(Canvas canvas) {
final float x = (mWidth + 2 * mPadding) / 2f;
- final float y = (mMonthHeaderSize - mMonthDayLabelTextSize) / 2f;
- canvas.drawText(getMonthAndYearString(), x, y, mMonthTitlePaint);
+
+ // Centered on the upper half of the month header.
+ final float lineHeight = mMonthPaint.ascent() + mMonthPaint.descent();
+ final float y = mMonthHeaderHeight * 0.25f - lineHeight / 2f;
+
+ canvas.drawText(getMonthAndYearString(), x, y, mMonthPaint);
}
private void drawWeekDayLabels(Canvas canvas) {
- final int y = mMonthHeaderSize - (mMonthDayLabelTextSize / 2);
- final int dayWidthHalf = (mWidth - mPadding * 2) / (mNumDays * 2);
+ final float dayWidthHalf = (mWidth - mPadding * 2) / (mNumDays * 2);
+
+ // Centered on the lower half of the month header.
+ final float lineHeight = mDayOfWeekPaint.ascent() + mDayOfWeekPaint.descent();
+ final float y = mMonthHeaderHeight * 0.75f - lineHeight / 2f;
for (int i = 0; i < mNumDays; i++) {
final int calendarDay = (i + mWeekStart) % mNumDays;
mDayLabelCalendar.set(Calendar.DAY_OF_WEEK, calendarDay);
final String dayLabel = mDayFormatter.format(mDayLabelCalendar.getTime());
- final int x = (2 * i + 1) * dayWidthHalf + mPadding;
- canvas.drawText(dayLabel, x, y, mMonthDayLabelPaint);
+ final float x = (2 * i + 1) * dayWidthHalf + mPadding;
+ canvas.drawText(dayLabel, x, y, mDayOfWeekPaint);
}
}
@@ -459,26 +442,40 @@
* Draws the month days.
*/
private void drawDays(Canvas canvas) {
- int y = (((mRowHeight + mMiniDayNumberTextSize) / 2) - DAY_SEPARATOR_WIDTH)
- + mMonthHeaderSize;
- int dayWidthHalf = (mWidth - mPadding * 2) / (mNumDays * 2);
- int j = findDayOffset();
- for (int day = 1; day <= mNumCells; day++) {
- int x = (2 * j + 1) * dayWidthHalf + mPadding;
- if (mSelectedDay == day) {
- canvas.drawCircle(x, y - (mMiniDayNumberTextSize / 3), mDaySelectedCircleSize,
- mDayNumberSelectedPaint);
+ final int dayWidthHalf = (mWidth - mPadding * 2) / (mNumDays * 2);
+
+ // Centered within the row.
+ final float lineHeight = mDayOfWeekPaint.ascent() + mDayOfWeekPaint.descent();
+ float y = mMonthHeaderHeight + (mRowHeight - lineHeight) / 2f;
+
+ for (int day = 1, j = findDayOffset(); day <= mNumCells; day++) {
+ final int x = (2 * j + 1) * dayWidthHalf + mPadding;
+ int stateMask = 0;
+
+ if (day >= mEnabledDayStart && day <= mEnabledDayEnd) {
+ stateMask |= StateSet.VIEW_STATE_ENABLED;
}
- if (mHasToday && mToday == day) {
- mDayNumberPaint.setColor(mSelectedDayColor);
- } else {
- mDayNumberPaint.setColor(mNormalTextColor);
+ if (mActivatedDay == day) {
+ stateMask |= StateSet.VIEW_STATE_ACTIVATED;
+
+ // Adjust the circle to be centered the row.
+ final float rowCenterY = y + lineHeight / 2;
+ canvas.drawCircle(x, rowCenterY, mRowHeight / 2,
+ mDayBackgroundPaint);
}
- final Paint paint = (day < mEnabledDayStart || day > mEnabledDayEnd) ?
- mDayNumberDisabledPaint : mDayNumberPaint;
- canvas.drawText(String.format("%d", day), x, y, paint);
+
+ final int[] stateSet = StateSet.get(stateMask);
+ final int dayTextColor = mDayTextColor.getColorForState(stateSet, 0);
+ mDayPaint.setColor(dayTextColor);
+
+ final boolean isDayToday = mHasToday && mToday == day;
+ mDayPaint.setFakeBoldText(isDayToday);
+
+ canvas.drawText(String.format("%d", day), x, y, mDayPaint);
+
j++;
+
if (j == mNumDays) {
j = 0;
y += mRowHeight;
@@ -504,7 +501,7 @@
return -1;
}
// Selection is (x - start) / (pixels/day) == (x -s) * day / pixels
- int row = (int) (y - mMonthHeaderSize) / mRowHeight;
+ int row = (int) (y - mMonthHeaderHeight) / mRowHeight;
int column = (int) ((x - dayStart) * mNumDays / (mWidth - dayStart - mPadding));
int day = column - findDayOffset() + 1;
@@ -628,7 +625,7 @@
node.setBoundsInParent(mTempRect);
node.addAction(AccessibilityNodeInfo.ACTION_CLICK);
- if (virtualViewId == mSelectedDay) {
+ if (virtualViewId == mActivatedDay) {
node.setSelected(true);
}
@@ -654,7 +651,7 @@
*/
private void getItemBounds(int day, Rect rect) {
final int offsetX = mPadding;
- final int offsetY = mMonthHeaderSize;
+ final int offsetY = mMonthHeaderHeight;
final int cellHeight = mRowHeight;
final int cellWidth = ((mWidth - (2 * mPadding)) / mNumDays);
final int index = ((day - 1) + findDayOffset());
@@ -679,7 +676,7 @@
final CharSequence date = DateFormat.format(DATE_FORMAT,
mTempCalendar.getTimeInMillis());
- if (day == mSelectedDay) {
+ if (day == mActivatedDay) {
return getContext().getString(R.string.item_is_selected, date);
}
diff --git a/core/java/android/widget/SlidingDrawer.java b/core/java/android/widget/SlidingDrawer.java
index ec06c02..e3f4a10 100644
--- a/core/java/android/widget/SlidingDrawer.java
+++ b/core/java/android/widget/SlidingDrawer.java
@@ -837,15 +837,17 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(SlidingDrawer.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(SlidingDrawer.class.getName());
}
diff --git a/core/java/android/widget/Spinner.java b/core/java/android/widget/Spinner.java
index 0d76239..5c93b60 100644
--- a/core/java/android/widget/Spinner.java
+++ b/core/java/android/widget/Spinner.java
@@ -692,15 +692,17 @@
dialog.dismiss();
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(Spinner.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(Spinner.class.getName());
if (mAdapter != null) {
diff --git a/core/java/android/widget/StackView.java b/core/java/android/widget/StackView.java
index 9e168b8..2aa1c09 100644
--- a/core/java/android/widget/StackView.java
+++ b/core/java/android/widget/StackView.java
@@ -1224,15 +1224,17 @@
measureChildren();
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(StackView.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(StackView.class.getName());
info.setScrollable(getChildCount() > 1);
if (isEnabled()) {
@@ -1245,9 +1247,10 @@
}
}
+ /** @hide */
@Override
- public boolean performAccessibilityAction(int action, Bundle arguments) {
- if (super.performAccessibilityAction(action, arguments)) {
+ public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
+ if (super.performAccessibilityActionInternal(action, arguments)) {
return true;
}
if (!isEnabled()) {
diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java
index 7a22224..13d6b42 100644
--- a/core/java/android/widget/Switch.java
+++ b/core/java/android/widget/Switch.java
@@ -665,9 +665,10 @@
}
}
+ /** @hide */
@Override
- public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
- super.onPopulateAccessibilityEvent(event);
+ public void onPopulateAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onPopulateAccessibilityEventInternal(event);
final CharSequence text = isChecked() ? mTextOn : mTextOff;
if (text != null) {
@@ -1180,15 +1181,17 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(Switch.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(Switch.class.getName());
CharSequence switchText = isChecked() ? mTextOn : mTextOff;
if (!TextUtils.isEmpty(switchText)) {
diff --git a/core/java/android/widget/TabHost.java b/core/java/android/widget/TabHost.java
index 89df51a..3c3389a 100644
--- a/core/java/android/widget/TabHost.java
+++ b/core/java/android/widget/TabHost.java
@@ -173,8 +173,9 @@
}
}
+ /** @hide */
@Override
- public void sendAccessibilityEvent(int eventType) {
+ public void sendAccessibilityEventInternal(int eventType) {
/* avoid super class behavior - TabWidget sends the right events */
}
@@ -383,15 +384,17 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(TabHost.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(TabHost.class.getName());
}
diff --git a/core/java/android/widget/TabWidget.java b/core/java/android/widget/TabWidget.java
index 47a5449..bddee91 100644
--- a/core/java/android/widget/TabWidget.java
+++ b/core/java/android/widget/TabWidget.java
@@ -401,8 +401,9 @@
}
}
+ /** @hide */
@Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
onPopulateAccessibilityEvent(event);
// Dispatch only to the selected tab.
if (mSelectedTab != -1) {
@@ -414,28 +415,31 @@
return false;
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(TabWidget.class.getName());
event.setItemCount(getTabCount());
event.setCurrentItemIndex(mSelectedTab);
}
+ /** @hide */
@Override
- public void sendAccessibilityEventUnchecked(AccessibilityEvent event) {
+ public void sendAccessibilityEventUncheckedInternal(AccessibilityEvent event) {
// this class fires events only when tabs are focused or selected
if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED && isFocused()) {
event.recycle();
return;
}
- super.sendAccessibilityEventUnchecked(event);
+ super.sendAccessibilityEventUncheckedInternal(event);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(TabWidget.class.getName());
}
diff --git a/core/java/android/widget/TableLayout.java b/core/java/android/widget/TableLayout.java
index f4b2ce0..a6b78a4 100644
--- a/core/java/android/widget/TableLayout.java
+++ b/core/java/android/widget/TableLayout.java
@@ -666,15 +666,17 @@
return new LayoutParams(p);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(TableLayout.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(TableLayout.class.getName());
}
diff --git a/core/java/android/widget/TableRow.java b/core/java/android/widget/TableRow.java
index fe3631a..c29296a 100644
--- a/core/java/android/widget/TableRow.java
+++ b/core/java/android/widget/TableRow.java
@@ -379,15 +379,17 @@
return new LayoutParams(p);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(TableRow.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(TableRow.class.getName());
}
diff --git a/core/java/android/widget/TextSwitcher.java b/core/java/android/widget/TextSwitcher.java
index 1aefd2b..7c883ba 100644
--- a/core/java/android/widget/TextSwitcher.java
+++ b/core/java/android/widget/TextSwitcher.java
@@ -91,15 +91,17 @@
((TextView)getCurrentView()).setText(text);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(TextSwitcher.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(TextSwitcher.class.getName());
}
}
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index edba9f5..92ca427 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -32,6 +32,7 @@
import android.graphics.Insets;
import android.graphics.Paint;
import android.graphics.Path;
+import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Typeface;
@@ -214,6 +215,8 @@
* @attr ref android.R.styleable#TextView_drawableStart
* @attr ref android.R.styleable#TextView_drawableEnd
* @attr ref android.R.styleable#TextView_drawablePadding
+ * @attr ref android.R.styleable#TextView_drawableTint
+ * @attr ref android.R.styleable#TextView_drawableTintMode
* @attr ref android.R.styleable#TextView_lineSpacingExtra
* @attr ref android.R.styleable#TextView_lineSpacingMultiplier
* @attr ref android.R.styleable#TextView_marqueeRepeatLimit
@@ -298,7 +301,6 @@
private float mShadowRadius, mShadowDx, mShadowDy;
private int mShadowColor;
-
private boolean mPreDrawRegistered;
private boolean mPreDrawListenerDetached;
@@ -312,16 +314,27 @@
private TextUtils.TruncateAt mEllipsize;
static class Drawables {
- final static int DRAWABLE_NONE = -1;
- final static int DRAWABLE_RIGHT = 0;
- final static int DRAWABLE_LEFT = 1;
+ static final int LEFT = 0;
+ static final int TOP = 1;
+ static final int RIGHT = 2;
+ static final int BOTTOM = 3;
+
+ static final int DRAWABLE_NONE = -1;
+ static final int DRAWABLE_RIGHT = 0;
+ static final int DRAWABLE_LEFT = 1;
final Rect mCompoundRect = new Rect();
- Drawable mDrawableTop, mDrawableBottom, mDrawableLeft, mDrawableRight,
- mDrawableStart, mDrawableEnd, mDrawableError, mDrawableTemp;
+ final Drawable[] mShowing = new Drawable[4];
+ ColorStateList mTintList;
+ PorterDuff.Mode mTintMode;
+ boolean mHasTint;
+ boolean mHasTintMode;
+
+ Drawable mDrawableStart, mDrawableEnd, mDrawableError, mDrawableTemp;
Drawable mDrawableLeftInitial, mDrawableRightInitial;
+
boolean mIsRtlCompatibilityMode;
boolean mOverride;
@@ -344,19 +357,19 @@
public void resolveWithLayoutDirection(int layoutDirection) {
// First reset "left" and "right" drawables to their initial values
- mDrawableLeft = mDrawableLeftInitial;
- mDrawableRight = mDrawableRightInitial;
+ mShowing[Drawables.LEFT] = mDrawableLeftInitial;
+ mShowing[Drawables.RIGHT] = mDrawableRightInitial;
if (mIsRtlCompatibilityMode) {
// Use "start" drawable as "left" drawable if the "left" drawable was not defined
- if (mDrawableStart != null && mDrawableLeft == null) {
- mDrawableLeft = mDrawableStart;
+ if (mDrawableStart != null && mShowing[Drawables.LEFT] == null) {
+ mShowing[Drawables.LEFT] = mDrawableStart;
mDrawableSizeLeft = mDrawableSizeStart;
mDrawableHeightLeft = mDrawableHeightStart;
}
// Use "end" drawable as "right" drawable if the "right" drawable was not defined
- if (mDrawableEnd != null && mDrawableRight == null) {
- mDrawableRight = mDrawableEnd;
+ if (mDrawableEnd != null && mShowing[Drawables.RIGHT] == null) {
+ mShowing[Drawables.RIGHT] = mDrawableEnd;
mDrawableSizeRight = mDrawableSizeEnd;
mDrawableHeightRight = mDrawableHeightEnd;
}
@@ -366,11 +379,11 @@
switch(layoutDirection) {
case LAYOUT_DIRECTION_RTL:
if (mOverride) {
- mDrawableRight = mDrawableStart;
+ mShowing[Drawables.RIGHT] = mDrawableStart;
mDrawableSizeRight = mDrawableSizeStart;
mDrawableHeightRight = mDrawableHeightStart;
- mDrawableLeft = mDrawableEnd;
+ mShowing[Drawables.LEFT] = mDrawableEnd;
mDrawableSizeLeft = mDrawableSizeEnd;
mDrawableHeightLeft = mDrawableHeightEnd;
}
@@ -379,11 +392,11 @@
case LAYOUT_DIRECTION_LTR:
default:
if (mOverride) {
- mDrawableLeft = mDrawableStart;
+ mShowing[Drawables.LEFT] = mDrawableStart;
mDrawableSizeLeft = mDrawableSizeStart;
mDrawableHeightLeft = mDrawableHeightStart;
- mDrawableRight = mDrawableEnd;
+ mShowing[Drawables.RIGHT] = mDrawableEnd;
mDrawableSizeRight = mDrawableSizeEnd;
mDrawableHeightRight = mDrawableHeightEnd;
}
@@ -395,17 +408,10 @@
}
private void updateDrawablesLayoutDirection(int layoutDirection) {
- if (mDrawableLeft != null) {
- mDrawableLeft.setLayoutDirection(layoutDirection);
- }
- if (mDrawableRight != null) {
- mDrawableRight.setLayoutDirection(layoutDirection);
- }
- if (mDrawableTop != null) {
- mDrawableTop.setLayoutDirection(layoutDirection);
- }
- if (mDrawableBottom != null) {
- mDrawableBottom.setLayoutDirection(layoutDirection);
+ for (Drawable dr : mShowing) {
+ if (dr != null) {
+ dr.setLayoutDirection(layoutDirection);
+ }
}
}
@@ -415,10 +421,10 @@
}
mDrawableError = dr;
- final Rect compoundRect = mCompoundRect;
- int[] state = tv.getDrawableState();
-
if (mDrawableError != null) {
+ final Rect compoundRect = mCompoundRect;
+ final int[] state = tv.getDrawableState();
+
mDrawableError.setState(state);
mDrawableError.copyBounds(compoundRect);
mDrawableError.setCallback(tv);
@@ -433,12 +439,12 @@
// first restore the initial state if needed
switch (mDrawableSaved) {
case DRAWABLE_LEFT:
- mDrawableLeft = mDrawableTemp;
+ mShowing[Drawables.LEFT] = mDrawableTemp;
mDrawableSizeLeft = mDrawableSizeTemp;
mDrawableHeightLeft = mDrawableHeightTemp;
break;
case DRAWABLE_RIGHT:
- mDrawableRight = mDrawableTemp;
+ mShowing[Drawables.RIGHT] = mDrawableTemp;
mDrawableSizeRight = mDrawableSizeTemp;
mDrawableHeightRight = mDrawableHeightTemp;
break;
@@ -451,11 +457,11 @@
case LAYOUT_DIRECTION_RTL:
mDrawableSaved = DRAWABLE_LEFT;
- mDrawableTemp = mDrawableLeft;
+ mDrawableTemp = mShowing[Drawables.LEFT];
mDrawableSizeTemp = mDrawableSizeLeft;
mDrawableHeightTemp = mDrawableHeightLeft;
- mDrawableLeft = mDrawableError;
+ mShowing[Drawables.LEFT] = mDrawableError;
mDrawableSizeLeft = mDrawableSizeError;
mDrawableHeightLeft = mDrawableHeightError;
break;
@@ -463,11 +469,11 @@
default:
mDrawableSaved = DRAWABLE_RIGHT;
- mDrawableTemp = mDrawableRight;
+ mDrawableTemp = mShowing[Drawables.RIGHT];
mDrawableSizeTemp = mDrawableSizeRight;
mDrawableHeightTemp = mDrawableHeightRight;
- mDrawableRight = mDrawableError;
+ mShowing[Drawables.RIGHT] = mDrawableError;
mDrawableSizeRight = mDrawableSizeError;
mDrawableHeightRight = mDrawableHeightError;
break;
@@ -770,6 +776,8 @@
boolean selectallonfocus = false;
Drawable drawableLeft = null, drawableTop = null, drawableRight = null,
drawableBottom = null, drawableStart = null, drawableEnd = null;
+ ColorStateList drawableTint = null;
+ PorterDuff.Mode drawableTintMode = null;
int drawablePadding = 0;
int ellipsize = -1;
boolean singleLine = false;
@@ -855,6 +863,14 @@
drawableEnd = a.getDrawable(attr);
break;
+ case com.android.internal.R.styleable.TextView_drawableTint:
+ drawableTint = a.getColorStateList(attr);
+ break;
+
+ case com.android.internal.R.styleable.TextView_drawableTintMode:
+ drawableTintMode = Drawable.parseTintMode(a.getInt(attr, -1), drawableTintMode);
+ break;
+
case com.android.internal.R.styleable.TextView_drawablePadding:
drawablePadding = a.getDimensionPixelSize(attr, drawablePadding);
break;
@@ -1238,6 +1254,22 @@
bufferType = BufferType.SPANNABLE;
}
+ // Set up the tint (if needed) before setting the drawables so that it
+ // gets applied correctly.
+ if (drawableTint != null || drawableTintMode != null) {
+ if (mDrawables == null) {
+ mDrawables = new Drawables(context);
+ }
+ if (drawableTint != null) {
+ mDrawables.mTintList = drawableTint;
+ mDrawables.mHasTint = true;
+ }
+ if (drawableTintMode != null) {
+ mDrawables.mTintMode = drawableTintMode;
+ mDrawables.mHasTintMode = true;
+ }
+ }
+
// This call will save the initial left/right drawables
setCompoundDrawablesWithIntrinsicBounds(
drawableLeft, drawableTop, drawableRight, drawableBottom);
@@ -1420,6 +1452,7 @@
}
resetResolvedDrawables();
resolveDrawables();
+ applyCompoundDrawableTint();
}
}
@@ -1778,7 +1811,7 @@
*/
public int getCompoundPaddingTop() {
final Drawables dr = mDrawables;
- if (dr == null || dr.mDrawableTop == null) {
+ if (dr == null || dr.mShowing[Drawables.TOP] == null) {
return mPaddingTop;
} else {
return mPaddingTop + dr.mDrawablePadding + dr.mDrawableSizeTop;
@@ -1791,7 +1824,7 @@
*/
public int getCompoundPaddingBottom() {
final Drawables dr = mDrawables;
- if (dr == null || dr.mDrawableBottom == null) {
+ if (dr == null || dr.mShowing[Drawables.BOTTOM] == null) {
return mPaddingBottom;
} else {
return mPaddingBottom + dr.mDrawablePadding + dr.mDrawableSizeBottom;
@@ -1804,7 +1837,7 @@
*/
public int getCompoundPaddingLeft() {
final Drawables dr = mDrawables;
- if (dr == null || dr.mDrawableLeft == null) {
+ if (dr == null || dr.mShowing[Drawables.LEFT] == null) {
return mPaddingLeft;
} else {
return mPaddingLeft + dr.mDrawablePadding + dr.mDrawableSizeLeft;
@@ -1817,7 +1850,7 @@
*/
public int getCompoundPaddingRight() {
final Drawables dr = mDrawables;
- if (dr == null || dr.mDrawableRight == null) {
+ if (dr == null || dr.mShowing[Drawables.RIGHT] == null) {
return mPaddingRight;
} else {
return mPaddingRight + dr.mDrawablePadding + dr.mDrawableSizeRight;
@@ -2015,14 +2048,12 @@
} else {
// We need to retain the last set padding, so just clear
// out all of the fields in the existing structure.
- if (dr.mDrawableLeft != null) dr.mDrawableLeft.setCallback(null);
- dr.mDrawableLeft = null;
- if (dr.mDrawableTop != null) dr.mDrawableTop.setCallback(null);
- dr.mDrawableTop = null;
- if (dr.mDrawableRight != null) dr.mDrawableRight.setCallback(null);
- dr.mDrawableRight = null;
- if (dr.mDrawableBottom != null) dr.mDrawableBottom.setCallback(null);
- dr.mDrawableBottom = null;
+ for (int i = dr.mShowing.length - 1; i >= 0; i--) {
+ if (dr.mShowing[i] != null) {
+ dr.mShowing[i].setCallback(null);
+ }
+ dr.mShowing[i] = null;
+ }
dr.mDrawableSizeLeft = dr.mDrawableHeightLeft = 0;
dr.mDrawableSizeRight = dr.mDrawableHeightRight = 0;
dr.mDrawableSizeTop = dr.mDrawableWidthTop = 0;
@@ -2036,25 +2067,25 @@
mDrawables.mOverride = false;
- if (dr.mDrawableLeft != left && dr.mDrawableLeft != null) {
- dr.mDrawableLeft.setCallback(null);
+ if (dr.mShowing[Drawables.LEFT] != left && dr.mShowing[Drawables.LEFT] != null) {
+ dr.mShowing[Drawables.LEFT].setCallback(null);
}
- dr.mDrawableLeft = left;
+ dr.mShowing[Drawables.LEFT] = left;
- if (dr.mDrawableTop != top && dr.mDrawableTop != null) {
- dr.mDrawableTop.setCallback(null);
+ if (dr.mShowing[Drawables.TOP] != top && dr.mShowing[Drawables.TOP] != null) {
+ dr.mShowing[Drawables.TOP].setCallback(null);
}
- dr.mDrawableTop = top;
+ dr.mShowing[Drawables.TOP] = top;
- if (dr.mDrawableRight != right && dr.mDrawableRight != null) {
- dr.mDrawableRight.setCallback(null);
+ if (dr.mShowing[Drawables.RIGHT] != right && dr.mShowing[Drawables.RIGHT] != null) {
+ dr.mShowing[Drawables.RIGHT].setCallback(null);
}
- dr.mDrawableRight = right;
+ dr.mShowing[Drawables.RIGHT] = right;
- if (dr.mDrawableBottom != bottom && dr.mDrawableBottom != null) {
- dr.mDrawableBottom.setCallback(null);
+ if (dr.mShowing[Drawables.BOTTOM] != bottom && dr.mShowing[Drawables.BOTTOM] != null) {
+ dr.mShowing[Drawables.BOTTOM].setCallback(null);
}
- dr.mDrawableBottom = bottom;
+ dr.mShowing[Drawables.BOTTOM] = bottom;
final Rect compoundRect = dr.mCompoundRect;
int[] state;
@@ -2110,6 +2141,7 @@
resetResolvedDrawables();
resolveDrawables();
+ applyCompoundDrawableTint();
invalidate();
requestLayout();
}
@@ -2193,10 +2225,14 @@
// We're switching to relative, discard absolute.
if (dr != null) {
- if (dr.mDrawableLeft != null) dr.mDrawableLeft.setCallback(null);
- dr.mDrawableLeft = dr.mDrawableLeftInitial = null;
- if (dr.mDrawableRight != null) dr.mDrawableRight.setCallback(null);
- dr.mDrawableRight = dr.mDrawableRightInitial = null;
+ if (dr.mShowing[Drawables.LEFT] != null) {
+ dr.mShowing[Drawables.LEFT].setCallback(null);
+ }
+ dr.mShowing[Drawables.LEFT] = dr.mDrawableLeftInitial = null;
+ if (dr.mShowing[Drawables.RIGHT] != null) {
+ dr.mShowing[Drawables.RIGHT].setCallback(null);
+ }
+ dr.mShowing[Drawables.RIGHT] = dr.mDrawableRightInitial = null;
dr.mDrawableSizeLeft = dr.mDrawableHeightLeft = 0;
dr.mDrawableSizeRight = dr.mDrawableHeightRight = 0;
}
@@ -2214,12 +2250,18 @@
// out all of the fields in the existing structure.
if (dr.mDrawableStart != null) dr.mDrawableStart.setCallback(null);
dr.mDrawableStart = null;
- if (dr.mDrawableTop != null) dr.mDrawableTop.setCallback(null);
- dr.mDrawableTop = null;
- if (dr.mDrawableEnd != null) dr.mDrawableEnd.setCallback(null);
+ if (dr.mShowing[Drawables.TOP] != null) {
+ dr.mShowing[Drawables.TOP].setCallback(null);
+ }
+ dr.mShowing[Drawables.TOP] = null;
+ if (dr.mDrawableEnd != null) {
+ dr.mDrawableEnd.setCallback(null);
+ }
dr.mDrawableEnd = null;
- if (dr.mDrawableBottom != null) dr.mDrawableBottom.setCallback(null);
- dr.mDrawableBottom = null;
+ if (dr.mShowing[Drawables.BOTTOM] != null) {
+ dr.mShowing[Drawables.BOTTOM].setCallback(null);
+ }
+ dr.mShowing[Drawables.BOTTOM] = null;
dr.mDrawableSizeStart = dr.mDrawableHeightStart = 0;
dr.mDrawableSizeEnd = dr.mDrawableHeightEnd = 0;
dr.mDrawableSizeTop = dr.mDrawableWidthTop = 0;
@@ -2238,20 +2280,20 @@
}
dr.mDrawableStart = start;
- if (dr.mDrawableTop != top && dr.mDrawableTop != null) {
- dr.mDrawableTop.setCallback(null);
+ if (dr.mShowing[Drawables.TOP] != top && dr.mShowing[Drawables.TOP] != null) {
+ dr.mShowing[Drawables.TOP].setCallback(null);
}
- dr.mDrawableTop = top;
+ dr.mShowing[Drawables.TOP] = top;
if (dr.mDrawableEnd != end && dr.mDrawableEnd != null) {
dr.mDrawableEnd.setCallback(null);
}
dr.mDrawableEnd = end;
- if (dr.mDrawableBottom != bottom && dr.mDrawableBottom != null) {
- dr.mDrawableBottom.setCallback(null);
+ if (dr.mShowing[Drawables.BOTTOM] != bottom && dr.mShowing[Drawables.BOTTOM] != null) {
+ dr.mShowing[Drawables.BOTTOM].setCallback(null);
}
- dr.mDrawableBottom = bottom;
+ dr.mShowing[Drawables.BOTTOM] = bottom;
final Rect compoundRect = dr.mCompoundRect;
int[] state;
@@ -2377,9 +2419,7 @@
public Drawable[] getCompoundDrawables() {
final Drawables dr = mDrawables;
if (dr != null) {
- return new Drawable[] {
- dr.mDrawableLeft, dr.mDrawableTop, dr.mDrawableRight, dr.mDrawableBottom
- };
+ return dr.mShowing.clone();
} else {
return new Drawable[] { null, null, null, null };
}
@@ -2398,7 +2438,8 @@
final Drawables dr = mDrawables;
if (dr != null) {
return new Drawable[] {
- dr.mDrawableStart, dr.mDrawableTop, dr.mDrawableEnd, dr.mDrawableBottom
+ dr.mDrawableStart, dr.mShowing[Drawables.TOP],
+ dr.mDrawableEnd, dr.mShowing[Drawables.BOTTOM]
};
} else {
return new Drawable[] { null, null, null, null };
@@ -2439,6 +2480,118 @@
return dr != null ? dr.mDrawablePadding : 0;
}
+ /**
+ * Applies a tint to the compound drawables. Does not modify the
+ * current tint mode, which is {@link PorterDuff.Mode#SRC_IN} by default.
+ * <p>
+ * Subsequent calls to
+ * {@link #setCompoundDrawables(Drawable, Drawable, Drawable, Drawable)}
+ * and related methods will automatically mutate the drawables and apply
+ * the specified tint and tint mode using
+ * {@link Drawable#setTintList(ColorStateList)}.
+ *
+ * @param tint the tint to apply, may be {@code null} to clear tint
+ *
+ * @attr ref android.R.styleable#TextView_drawableTint
+ * @see #getCompoundDrawableTintList()
+ * @see Drawable#setTintList(ColorStateList)
+ */
+ public void setCompoundDrawableTintList(@Nullable ColorStateList tint) {
+ if (mDrawables == null) {
+ mDrawables = new Drawables(getContext());
+ }
+ mDrawables.mTintList = tint;
+ mDrawables.mHasTint = true;
+
+ applyCompoundDrawableTint();
+ }
+
+ /**
+ * @return the tint applied to the compound drawables
+ * @attr ref android.R.styleable#TextView_drawableTint
+ * @see #setCompoundDrawableTintList(ColorStateList)
+ */
+ public ColorStateList getCompoundDrawableTintList() {
+ return mDrawables != null ? mDrawables.mTintList : null;
+ }
+
+ /**
+ * Specifies the blending mode used to apply the tint specified by
+ * {@link #setCompoundDrawableTintList(ColorStateList)} to the compound
+ * drawables. The default mode is {@link PorterDuff.Mode#SRC_IN}.
+ *
+ * @param tintMode the blending mode used to apply the tint, may be
+ * {@code null} to clear tint
+ * @attr ref android.R.styleable#TextView_drawableTintMode
+ * @see #setCompoundDrawableTintList(ColorStateList)
+ * @see Drawable#setTintMode(PorterDuff.Mode)
+ */
+ public void setCompoundDrawableTintMode(@Nullable PorterDuff.Mode tintMode) {
+ if (mDrawables == null) {
+ mDrawables = new Drawables(getContext());
+ }
+ mDrawables.mTintMode = tintMode;
+ mDrawables.mHasTintMode = true;
+
+ applyCompoundDrawableTint();
+ }
+
+ /**
+ * Returns the blending mode used to apply the tint to the compound
+ * drawables, if specified.
+ *
+ * @return the blending mode used to apply the tint to the compound
+ * drawables
+ * @attr ref android.R.styleable#TextView_drawableTintMode
+ * @see #setCompoundDrawableTintMode(PorterDuff.Mode)
+ */
+ public PorterDuff.Mode getCompoundDrawableTintMode() {
+ return mDrawables != null ? mDrawables.mTintMode : null;
+ }
+
+ private void applyCompoundDrawableTint() {
+ if (mDrawables == null) {
+ return;
+ }
+
+ if (mDrawables.mHasTint || mDrawables.mHasTintMode) {
+ final ColorStateList tintList = mDrawables.mTintList;
+ final PorterDuff.Mode tintMode = mDrawables.mTintMode;
+ final boolean hasTint = mDrawables.mHasTint;
+ final boolean hasTintMode = mDrawables.mHasTintMode;
+ final int[] state = getDrawableState();
+
+ for (Drawable dr : mDrawables.mShowing) {
+ if (dr == null) {
+ continue;
+ }
+
+ if (dr == mDrawables.mDrawableError) {
+ // From a developer's perspective, the error drawable isn't
+ // a compound drawable. Don't apply the generic compound
+ // drawable tint to it.
+ continue;
+ }
+
+ dr.mutate();
+
+ if (hasTint) {
+ dr.setTintList(tintList);
+ }
+
+ if (hasTintMode) {
+ dr.setTintMode(tintMode);
+ }
+
+ // The drawable (or one of its children) may not have been
+ // stateful before applying the tint, so let's try again.
+ if (dr.isStateful()) {
+ dr.setState(state);
+ }
+ }
+ }
+ }
+
@Override
public void setPadding(int left, int top, int right, int bottom) {
if (left != mPaddingLeft ||
@@ -3657,26 +3810,12 @@
updateTextColors();
}
- final Drawables dr = mDrawables;
- if (dr != null) {
- int[] state = getDrawableState();
- if (dr.mDrawableTop != null && dr.mDrawableTop.isStateful()) {
- dr.mDrawableTop.setState(state);
- }
- if (dr.mDrawableBottom != null && dr.mDrawableBottom.isStateful()) {
- dr.mDrawableBottom.setState(state);
- }
- if (dr.mDrawableLeft != null && dr.mDrawableLeft.isStateful()) {
- dr.mDrawableLeft.setState(state);
- }
- if (dr.mDrawableRight != null && dr.mDrawableRight.isStateful()) {
- dr.mDrawableRight.setState(state);
- }
- if (dr.mDrawableStart != null && dr.mDrawableStart.isStateful()) {
- dr.mDrawableStart.setState(state);
- }
- if (dr.mDrawableEnd != null && dr.mDrawableEnd.isStateful()) {
- dr.mDrawableEnd.setState(state);
+ if (mDrawables != null) {
+ final int[] state = getDrawableState();
+ for (Drawable dr : mDrawables.mShowing) {
+ if (dr != null && dr.isStateful()) {
+ dr.setState(state);
+ }
}
}
}
@@ -3685,25 +3824,12 @@
public void drawableHotspotChanged(float x, float y) {
super.drawableHotspotChanged(x, y);
- final Drawables dr = mDrawables;
- if (dr != null) {
- if (dr.mDrawableTop != null) {
- dr.mDrawableTop.setHotspot(x, y);
- }
- if (dr.mDrawableBottom != null) {
- dr.mDrawableBottom.setHotspot(x, y);
- }
- if (dr.mDrawableLeft != null) {
- dr.mDrawableLeft.setHotspot(x, y);
- }
- if (dr.mDrawableRight != null) {
- dr.mDrawableRight.setHotspot(x, y);
- }
- if (dr.mDrawableStart != null) {
- dr.mDrawableStart.setHotspot(x, y);
- }
- if (dr.mDrawableEnd != null) {
- dr.mDrawableEnd.setHotspot(x, y);
+ if (mDrawables != null) {
+ final int[] state = getDrawableState();
+ for (Drawable dr : mDrawables.mShowing) {
+ if (dr != null && dr.isStateful()) {
+ dr.setHotspot(x, y);
+ }
}
}
}
@@ -5028,9 +5154,11 @@
protected boolean verifyDrawable(Drawable who) {
final boolean verified = super.verifyDrawable(who);
if (!verified && mDrawables != null) {
- return who == mDrawables.mDrawableLeft || who == mDrawables.mDrawableTop ||
- who == mDrawables.mDrawableRight || who == mDrawables.mDrawableBottom ||
- who == mDrawables.mDrawableStart || who == mDrawables.mDrawableEnd;
+ for (Drawable dr : mDrawables.mShowing) {
+ if (who == dr) {
+ return true;
+ }
+ }
}
return verified;
}
@@ -5039,23 +5167,10 @@
public void jumpDrawablesToCurrentState() {
super.jumpDrawablesToCurrentState();
if (mDrawables != null) {
- if (mDrawables.mDrawableLeft != null) {
- mDrawables.mDrawableLeft.jumpToCurrentState();
- }
- if (mDrawables.mDrawableTop != null) {
- mDrawables.mDrawableTop.jumpToCurrentState();
- }
- if (mDrawables.mDrawableRight != null) {
- mDrawables.mDrawableRight.jumpToCurrentState();
- }
- if (mDrawables.mDrawableBottom != null) {
- mDrawables.mDrawableBottom.jumpToCurrentState();
- }
- if (mDrawables.mDrawableStart != null) {
- mDrawables.mDrawableStart.jumpToCurrentState();
- }
- if (mDrawables.mDrawableEnd != null) {
- mDrawables.mDrawableEnd.jumpToCurrentState();
+ for (Drawable dr : mDrawables.mShowing) {
+ if (dr != null) {
+ dr.jumpToCurrentState();
+ }
}
}
}
@@ -5074,7 +5189,7 @@
// accordingly.
final TextView.Drawables drawables = mDrawables;
if (drawables != null) {
- if (drawable == drawables.mDrawableLeft) {
+ if (drawable == drawables.mShowing[Drawables.LEFT]) {
final int compoundPaddingTop = getCompoundPaddingTop();
final int compoundPaddingBottom = getCompoundPaddingBottom();
final int vspace = mBottom - mTop - compoundPaddingBottom - compoundPaddingTop;
@@ -5082,7 +5197,7 @@
scrollX += mPaddingLeft;
scrollY += compoundPaddingTop + (vspace - drawables.mDrawableHeightLeft) / 2;
handled = true;
- } else if (drawable == drawables.mDrawableRight) {
+ } else if (drawable == drawables.mShowing[Drawables.RIGHT]) {
final int compoundPaddingTop = getCompoundPaddingTop();
final int compoundPaddingBottom = getCompoundPaddingBottom();
final int vspace = mBottom - mTop - compoundPaddingBottom - compoundPaddingTop;
@@ -5090,7 +5205,7 @@
scrollX += (mRight - mLeft - mPaddingRight - drawables.mDrawableSizeRight);
scrollY += compoundPaddingTop + (vspace - drawables.mDrawableHeightRight) / 2;
handled = true;
- } else if (drawable == drawables.mDrawableTop) {
+ } else if (drawable == drawables.mShowing[Drawables.TOP]) {
final int compoundPaddingLeft = getCompoundPaddingLeft();
final int compoundPaddingRight = getCompoundPaddingRight();
final int hspace = mRight - mLeft - compoundPaddingRight - compoundPaddingLeft;
@@ -5098,7 +5213,7 @@
scrollX += compoundPaddingLeft + (hspace - drawables.mDrawableWidthTop) / 2;
scrollY += mPaddingTop;
handled = true;
- } else if (drawable == drawables.mDrawableBottom) {
+ } else if (drawable == drawables.mShowing[Drawables.BOTTOM]) {
final int compoundPaddingLeft = getCompoundPaddingLeft();
final int compoundPaddingRight = getCompoundPaddingRight();
final int hspace = mRight - mLeft - compoundPaddingRight - compoundPaddingLeft;
@@ -5302,44 +5417,44 @@
// IMPORTANT: The coordinates computed are also used in invalidateDrawable()
// Make sure to update invalidateDrawable() when changing this code.
- if (dr.mDrawableLeft != null) {
+ if (dr.mShowing[Drawables.LEFT] != null) {
canvas.save();
canvas.translate(scrollX + mPaddingLeft + leftOffset,
scrollY + compoundPaddingTop +
(vspace - dr.mDrawableHeightLeft) / 2);
- dr.mDrawableLeft.draw(canvas);
+ dr.mShowing[Drawables.LEFT].draw(canvas);
canvas.restore();
}
// IMPORTANT: The coordinates computed are also used in invalidateDrawable()
// Make sure to update invalidateDrawable() when changing this code.
- if (dr.mDrawableRight != null) {
+ if (dr.mShowing[Drawables.RIGHT] != null) {
canvas.save();
canvas.translate(scrollX + right - left - mPaddingRight
- dr.mDrawableSizeRight - rightOffset,
scrollY + compoundPaddingTop + (vspace - dr.mDrawableHeightRight) / 2);
- dr.mDrawableRight.draw(canvas);
+ dr.mShowing[Drawables.RIGHT].draw(canvas);
canvas.restore();
}
// IMPORTANT: The coordinates computed are also used in invalidateDrawable()
// Make sure to update invalidateDrawable() when changing this code.
- if (dr.mDrawableTop != null) {
+ if (dr.mShowing[Drawables.TOP] != null) {
canvas.save();
canvas.translate(scrollX + compoundPaddingLeft +
(hspace - dr.mDrawableWidthTop) / 2, scrollY + mPaddingTop);
- dr.mDrawableTop.draw(canvas);
+ dr.mShowing[Drawables.TOP].draw(canvas);
canvas.restore();
}
// IMPORTANT: The coordinates computed are also used in invalidateDrawable()
// Make sure to update invalidateDrawable() when changing this code.
- if (dr.mDrawableBottom != null) {
+ if (dr.mShowing[Drawables.BOTTOM] != null) {
canvas.save();
canvas.translate(scrollX + compoundPaddingLeft +
(hspace - dr.mDrawableWidthBottom) / 2,
scrollY + bottom - top - mPaddingBottom - dr.mDrawableSizeBottom);
- dr.mDrawableBottom.draw(canvas);
+ dr.mShowing[Drawables.BOTTOM].draw(canvas);
canvas.restore();
}
}
@@ -8374,9 +8489,10 @@
}
}
+ /** @hide */
@Override
- public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
- super.onPopulateAccessibilityEvent(event);
+ public void onPopulateAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onPopulateAccessibilityEventInternal(event);
final boolean isPassword = hasPasswordTransformationMethod();
if (!isPassword || shouldSpeakPasswordsForAccessibility()) {
@@ -8397,9 +8513,10 @@
UserHandle.USER_CURRENT_OR_SELF) == 1);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(TextView.class.getName());
final boolean isPassword = hasPasswordTransformationMethod();
@@ -8412,9 +8529,10 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(TextView.class.getName());
final boolean isPassword = hasPasswordTransformationMethod();
@@ -8572,15 +8690,16 @@
}
}
+ /** @hide */
@Override
- public void sendAccessibilityEvent(int eventType) {
+ public void sendAccessibilityEventInternal(int eventType) {
// Do not send scroll events since first they are not interesting for
// accessibility and second such events a generated too frequently.
// For details see the implementation of bringTextIntoView().
if (eventType == AccessibilityEvent.TYPE_VIEW_SCROLLED) {
return;
}
- super.sendAccessibilityEvent(eventType);
+ super.sendAccessibilityEventInternal(eventType);
}
/**
diff --git a/core/java/android/widget/TextViewWithCircularIndicator.java b/core/java/android/widget/TextViewWithCircularIndicator.java
index 43c0843..d3c786c 100644
--- a/core/java/android/widget/TextViewWithCircularIndicator.java
+++ b/core/java/android/widget/TextViewWithCircularIndicator.java
@@ -18,7 +18,6 @@
import android.content.Context;
import android.content.res.Resources;
-import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Typeface;
@@ -27,14 +26,8 @@
import com.android.internal.R;
class TextViewWithCircularIndicator extends TextView {
-
- private static final int SELECTED_CIRCLE_ALPHA = 60;
-
private final Paint mCirclePaint = new Paint();
-
private final String mItemIsSelectedText;
- private int mCircleColor;
- private boolean mDrawIndicator;
public TextViewWithCircularIndicator(Context context) {
this(context, null);
@@ -50,22 +43,11 @@
public TextViewWithCircularIndicator(Context context, AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
- super(context, attrs);
-
-
- // Use Theme attributes if possible
- final TypedArray a = mContext.obtainStyledAttributes(attrs,
- R.styleable.DatePicker, defStyleAttr, defStyleRes);
- final int resId = a.getResourceId(R.styleable.DatePicker_yearListItemTextAppearance, -1);
- if (resId != -1) {
- setTextAppearance(context, resId);
- }
+ super(context, attrs, defStyleAttr, defStyleRes);
final Resources res = context.getResources();
mItemIsSelectedText = res.getString(R.string.item_is_selected);
- a.recycle();
-
init();
}
@@ -77,33 +59,26 @@
}
public void setCircleColor(int color) {
- if (color != mCircleColor) {
- mCircleColor = color;
- mCirclePaint.setColor(mCircleColor);
- mCirclePaint.setAlpha(SELECTED_CIRCLE_ALPHA);
- requestLayout();
- }
- }
-
- public void setDrawIndicator(boolean drawIndicator) {
- mDrawIndicator = drawIndicator;
+ mCirclePaint.setColor(color);
+ invalidate();
}
@Override
public void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- if (mDrawIndicator) {
+ if (isActivated()) {
final int width = getWidth();
final int height = getHeight();
- int radius = Math.min(width, height) / 2;
+ final int radius = Math.min(width, height) / 2;
canvas.drawCircle(width / 2, height / 2, radius, mCirclePaint);
}
+
+ super.onDraw(canvas);
}
@Override
public CharSequence getContentDescription() {
- CharSequence itemText = getText();
- if (mDrawIndicator) {
+ final CharSequence itemText = getText();
+ if (isActivated()) {
return String.format(mItemIsSelectedText, itemText);
} else {
return itemText;
diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java
index 26e02f8..bbf5f53 100644
--- a/core/java/android/widget/TimePicker.java
+++ b/core/java/android/widget/TimePicker.java
@@ -195,26 +195,30 @@
mDelegate.onRestoreInstanceState(ss);
}
+ /** @hide */
@Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
return mDelegate.dispatchPopulateAccessibilityEvent(event);
}
+ /** @hide */
@Override
- public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
- super.onPopulateAccessibilityEvent(event);
+ public void onPopulateAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onPopulateAccessibilityEventInternal(event);
mDelegate.onPopulateAccessibilityEvent(event);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
mDelegate.onInitializeAccessibilityEvent(event);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
mDelegate.onInitializeAccessibilityNodeInfo(info);
}
diff --git a/core/java/android/widget/ToggleButton.java b/core/java/android/widget/ToggleButton.java
index 28519d1..1b23778 100644
--- a/core/java/android/widget/ToggleButton.java
+++ b/core/java/android/widget/ToggleButton.java
@@ -153,15 +153,17 @@
}
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(ToggleButton.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(ToggleButton.class.getName());
}
}
diff --git a/core/java/android/widget/TwoLineListItem.java b/core/java/android/widget/TwoLineListItem.java
index 5606c60..9035dbe 100644
--- a/core/java/android/widget/TwoLineListItem.java
+++ b/core/java/android/widget/TwoLineListItem.java
@@ -93,15 +93,17 @@
return mText2;
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(TwoLineListItem.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(TwoLineListItem.class.getName());
}
}
diff --git a/core/java/android/widget/VideoView.java b/core/java/android/widget/VideoView.java
index 572cca2..a240dc2 100644
--- a/core/java/android/widget/VideoView.java
+++ b/core/java/android/widget/VideoView.java
@@ -201,15 +201,17 @@
setMeasuredDimension(width, height);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(VideoView.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(VideoView.class.getName());
}
diff --git a/core/java/android/widget/ViewAnimator.java b/core/java/android/widget/ViewAnimator.java
index eee914e..d31754b 100644
--- a/core/java/android/widget/ViewAnimator.java
+++ b/core/java/android/widget/ViewAnimator.java
@@ -357,15 +357,17 @@
return (getCurrentView() != null) ? getCurrentView().getBaseline() : super.getBaseline();
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(ViewAnimator.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(ViewAnimator.class.getName());
}
}
diff --git a/core/java/android/widget/ViewFlipper.java b/core/java/android/widget/ViewFlipper.java
index cf1f554..587f469 100644
--- a/core/java/android/widget/ViewFlipper.java
+++ b/core/java/android/widget/ViewFlipper.java
@@ -149,15 +149,17 @@
updateRunning();
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(ViewFlipper.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(ViewFlipper.class.getName());
}
diff --git a/core/java/android/widget/ViewSwitcher.java b/core/java/android/widget/ViewSwitcher.java
index 0376918..c97770f 100644
--- a/core/java/android/widget/ViewSwitcher.java
+++ b/core/java/android/widget/ViewSwitcher.java
@@ -68,15 +68,17 @@
super.addView(child, index, params);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(ViewSwitcher.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(ViewSwitcher.class.getName());
}
diff --git a/core/java/android/widget/YearPickerView.java b/core/java/android/widget/YearPickerView.java
index 24ed7ce..6f0465f 100644
--- a/core/java/android/widget/YearPickerView.java
+++ b/core/java/android/widget/YearPickerView.java
@@ -17,8 +17,10 @@
package android.widget;
import android.content.Context;
+import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.util.AttributeSet;
+import android.util.StateSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
@@ -42,7 +44,7 @@
private DatePickerController mController;
private int mSelectedPosition = -1;
- private int mYearSelectedCircleColor;
+ private int mYearActivatedColor;
public YearPickerView(Context context) {
this(context, null);
@@ -97,15 +99,14 @@
onDateChanged();
}
- public void setYearSelectedCircleColor(int color) {
- if (color != mYearSelectedCircleColor) {
- mYearSelectedCircleColor = color;
- }
- requestLayout();
+ public void setYearBackgroundColor(ColorStateList yearBackgroundColor) {
+ mYearActivatedColor = yearBackgroundColor.getColorForState(
+ StateSet.get(StateSet.VIEW_STATE_ENABLED | StateSet.VIEW_STATE_ACTIVATED), 0);
+ invalidate();
}
- public int getYearSelectedCircleColor() {
- return mYearSelectedCircleColor;
+ public void setYearTextAppearance(int resId) {
+ mAdapter.setItemTextAppearance(resId);
}
private void updateAdapterData() {
@@ -127,12 +128,8 @@
mController.onYearSelected(mAdapter.getItem(position));
}
- void setItemTextAppearance(int resId) {
- mAdapter.setItemTextAppearance(resId);
- }
-
private class YearAdapter extends ArrayAdapter<Integer> {
- int mItemTextAppearanceResId;
+ private int mItemTextAppearanceResId;
public YearAdapter(Context context, int resource) {
super(context, resource);
@@ -140,16 +137,15 @@
@Override
public View getView(int position, View convertView, ViewGroup parent) {
- TextViewWithCircularIndicator v = (TextViewWithCircularIndicator)
+ final TextViewWithCircularIndicator v = (TextViewWithCircularIndicator)
super.getView(position, convertView, parent);
- v.setTextAppearance(getContext(), mItemTextAppearanceResId);
- v.requestLayout();
- int year = getItem(position);
- boolean selected = mController.getSelectedDay().get(Calendar.YEAR) == year;
- v.setDrawIndicator(selected);
- if (selected) {
- v.setCircleColor(mYearSelectedCircleColor);
- }
+ v.setTextAppearance(v.getContext(), mItemTextAppearanceResId);
+ v.setCircleColor(mYearActivatedColor);
+
+ final int year = getItem(position);
+ final boolean selected = mController.getSelectedDay().get(Calendar.YEAR) == year;
+ v.setActivated(selected);
+
return v;
}
@@ -189,9 +185,10 @@
mController.getSelectedDay().get(Calendar.YEAR) - mMinDate.get(Calendar.YEAR));
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) {
event.setFromIndex(0);
diff --git a/core/java/android/widget/ZoomButton.java b/core/java/android/widget/ZoomButton.java
index 715e868..e0be0ab 100644
--- a/core/java/android/widget/ZoomButton.java
+++ b/core/java/android/widget/ZoomButton.java
@@ -103,15 +103,17 @@
return super.dispatchUnhandledMove(focused, direction);
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(ZoomButton.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(ZoomButton.class.getName());
}
}
diff --git a/core/java/android/widget/ZoomControls.java b/core/java/android/widget/ZoomControls.java
index 8897875..a0aacea 100644
--- a/core/java/android/widget/ZoomControls.java
+++ b/core/java/android/widget/ZoomControls.java
@@ -109,15 +109,17 @@
return mZoomIn.hasFocus() || mZoomOut.hasFocus();
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
event.setClassName(ZoomControls.class.getName());
}
+ /** @hide */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
info.setClassName(ZoomControls.class.getName());
}
}
diff --git a/core/java/com/android/internal/app/WindowDecorActionBar.java b/core/java/com/android/internal/app/WindowDecorActionBar.java
index d95f0e5..061b535 100644
--- a/core/java/com/android/internal/app/WindowDecorActionBar.java
+++ b/core/java/com/android/internal/app/WindowDecorActionBar.java
@@ -993,6 +993,13 @@
@Override
public void invalidate() {
+ if (mActionMode != this) {
+ // Not the active action mode - no-op. It's possible we are
+ // currently deferring onDestroy, so the app doesn't yet know we
+ // are going away and is trying to use us. That's also a no-op.
+ return;
+ }
+
mMenu.stopDispatchingItemsChanged();
try {
mCallback.onPrepareActionMode(this, mMenu);
diff --git a/core/java/com/android/internal/content/PackageMonitor.java b/core/java/com/android/internal/content/PackageMonitor.java
index 9df8ad5..eff44bd 100644
--- a/core/java/com/android/internal/content/PackageMonitor.java
+++ b/core/java/com/android/internal/content/PackageMonitor.java
@@ -24,6 +24,7 @@
import android.os.Handler;
import android.os.Looper;
import android.os.UserHandle;
+import android.util.Slog;
import com.android.internal.os.BackgroundThread;
import java.util.HashSet;
@@ -279,8 +280,8 @@
mChangeUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
UserHandle.USER_NULL);
if (mChangeUserId == UserHandle.USER_NULL) {
- throw new IllegalArgumentException(
- "Intent broadcast does not contain user handle: " + intent);
+ Slog.w("PackageMonitor", "Intent broadcast does not contain user handle: " + intent);
+ return;
}
onBeginPackageChanges();
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 8ceee20..20bb95e 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -6955,6 +6955,17 @@
}
}
+ private void recordShutdownLocked(final long elapsedRealtimeMs, final long uptimeMs) {
+ if (mRecordingHistory) {
+ mHistoryCur.currentTime = System.currentTimeMillis();
+ mLastRecordedClockTime = mHistoryCur.currentTime;
+ mLastRecordedClockRealtime = elapsedRealtimeMs;
+ addHistoryBufferLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.CMD_SHUTDOWN,
+ mHistoryCur);
+ mHistoryCur.currentTime = 0;
+ }
+ }
+
// This should probably be exposed in the API, though it's not critical
private static final int BATTERY_PLUGGED_NONE = 0;
@@ -7627,6 +7638,7 @@
}
public void shutdownLocked() {
+ recordShutdownLocked(SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
writeSyncLocked();
mShuttingDown = true;
}
diff --git a/core/java/com/android/internal/util/FastPrintWriter.java b/core/java/com/android/internal/util/FastPrintWriter.java
index c70a243..c74fea0 100644
--- a/core/java/com/android/internal/util/FastPrintWriter.java
+++ b/core/java/com/android/internal/util/FastPrintWriter.java
@@ -15,7 +15,7 @@
import java.nio.charset.CodingErrorAction;
public class FastPrintWriter extends PrintWriter {
- private static Writer sDummyWriter = new Writer() {
+ private static class DummyWriter extends Writer {
@Override
public void close() throws IOException {
UnsupportedOperationException ex
@@ -100,7 +100,7 @@
* if {@code out} is {@code null}.
*/
public FastPrintWriter(OutputStream out, boolean autoFlush, int bufferLen) {
- super(sDummyWriter, autoFlush);
+ super(new DummyWriter(), autoFlush);
if (out == null) {
throw new NullPointerException("out is null");
}
@@ -169,7 +169,7 @@
* if {@code wr} is {@code null}.
*/
public FastPrintWriter(Writer wr, boolean autoFlush, int bufferLen) {
- super(sDummyWriter, autoFlush);
+ super(new DummyWriter(), autoFlush);
if (wr == null) {
throw new NullPointerException("wr is null");
}
@@ -212,7 +212,7 @@
* if {@code pr} is {@code null}.
*/
public FastPrintWriter(Printer pr, int bufferLen) {
- super(sDummyWriter, true);
+ super(new DummyWriter(), true);
if (pr == null) {
throw new NullPointerException("pr is null");
}
diff --git a/core/java/com/android/internal/view/menu/ActionMenuItemView.java b/core/java/com/android/internal/view/menu/ActionMenuItemView.java
index 7eec392..f75b139 100644
--- a/core/java/com/android/internal/view/menu/ActionMenuItemView.java
+++ b/core/java/com/android/internal/view/menu/ActionMenuItemView.java
@@ -217,14 +217,14 @@
}
@Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
onPopulateAccessibilityEvent(event);
return true;
}
@Override
- public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
- super.onPopulateAccessibilityEvent(event);
+ public void onPopulateAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onPopulateAccessibilityEventInternal(event);
final CharSequence cdesc = getContentDescription();
if (!TextUtils.isEmpty(cdesc)) {
event.getText().add(cdesc);
diff --git a/core/java/com/android/internal/view/menu/ListMenuItemView.java b/core/java/com/android/internal/view/menu/ListMenuItemView.java
index 692bdac..29ac3f3 100644
--- a/core/java/com/android/internal/view/menu/ListMenuItemView.java
+++ b/core/java/com/android/internal/view/menu/ListMenuItemView.java
@@ -276,8 +276,8 @@
}
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
if (mItemData != null && mItemData.hasSubMenu()) {
info.setCanOpenPopup(true);
diff --git a/core/java/com/android/internal/view/menu/MenuPopupHelper.java b/core/java/com/android/internal/view/menu/MenuPopupHelper.java
index 99bb1ac..2b20b38 100644
--- a/core/java/com/android/internal/view/menu/MenuPopupHelper.java
+++ b/core/java/com/android/internal/view/menu/MenuPopupHelper.java
@@ -118,6 +118,10 @@
mDropDownGravity = gravity;
}
+ public int getGravity() {
+ return mDropDownGravity;
+ }
+
public void show() {
if (!tryShow()) {
throw new IllegalStateException("MenuPopupHelper cannot be used without an anchor");
@@ -135,7 +139,7 @@
mPopup.setAdapter(mAdapter);
mPopup.setModal(true);
- View anchor = mAnchorView;
+ final View anchor = mAnchorView;
if (anchor != null) {
final boolean addGlobalListener = mTreeObserver == null;
mTreeObserver = anchor.getViewTreeObserver(); // Refresh to latest
diff --git a/core/java/com/android/internal/widget/AccessibleDateAnimator.java b/core/java/com/android/internal/widget/AccessibleDateAnimator.java
index e91a55c..f97a5d1 100644
--- a/core/java/com/android/internal/widget/AccessibleDateAnimator.java
+++ b/core/java/com/android/internal/widget/AccessibleDateAnimator.java
@@ -40,7 +40,7 @@
* Announce the currently-selected date when launched.
*/
@Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
// Clear the event's current text so that only the current date will be spoken.
event.getText().clear();
@@ -51,6 +51,6 @@
event.getText().add(dateString);
return true;
}
- return super.dispatchPopulateAccessibilityEvent(event);
+ return super.dispatchPopulateAccessibilityEventInternal(event);
}
}
diff --git a/core/java/com/android/internal/widget/ActionBarContextView.java b/core/java/com/android/internal/widget/ActionBarContextView.java
index 7c671e8..5d3f464 100644
--- a/core/java/com/android/internal/widget/ActionBarContextView.java
+++ b/core/java/com/android/internal/widget/ActionBarContextView.java
@@ -529,7 +529,7 @@
}
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
// Action mode started
event.setSource(this);
@@ -537,7 +537,7 @@
event.setPackageName(getContext().getPackageName());
event.setContentDescription(mTitle);
} else {
- super.onInitializeAccessibilityEvent(event);
+ super.onInitializeAccessibilityEventInternal(event);
}
}
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index 654d08b..88436f8 100644
--- a/core/java/com/android/internal/widget/ActionBarView.java
+++ b/core/java/com/android/internal/widget/ActionBarView.java
@@ -1463,14 +1463,14 @@
}
@Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
onPopulateAccessibilityEvent(event);
return true;
}
@Override
- public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
- super.onPopulateAccessibilityEvent(event);
+ public void onPopulateAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onPopulateAccessibilityEventInternal(event);
final CharSequence cdesc = getContentDescription();
if (!TextUtils.isEmpty(cdesc)) {
event.getText().add(cdesc);
diff --git a/core/java/com/android/internal/widget/ResolverDrawerLayout.java b/core/java/com/android/internal/widget/ResolverDrawerLayout.java
index ed7af2f..4e48454 100644
--- a/core/java/com/android/internal/widget/ResolverDrawerLayout.java
+++ b/core/java/com/android/internal/widget/ResolverDrawerLayout.java
@@ -20,6 +20,7 @@
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Rect;
+import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
@@ -31,6 +32,8 @@
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.ViewTreeObserver;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.AnimationUtils;
import android.widget.AbsListView;
import android.widget.OverScroller;
@@ -367,8 +370,14 @@
child.offsetTopAndBottom((int) dy);
}
}
+ final boolean isCollapsedOld = mCollapseOffset != 0;
mCollapseOffset = newPos;
mTopOffset += dy;
+ final boolean isCollapsedNew = newPos != 0;
+ if (isCollapsedOld != isCollapsedNew) {
+ notifyViewAccessibilityStateChangedIfNeeded(
+ AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED);
+ }
postInvalidateOnAnimation();
return dy;
}
@@ -571,6 +580,50 @@
}
@Override
+ public boolean onNestedPrePerformAccessibilityAction(View target, int action, Bundle args) {
+ if (super.onNestedPrePerformAccessibilityAction(target, action, args)) {
+ return true;
+ }
+
+ if (action == AccessibilityNodeInfo.ACTION_SCROLL_FORWARD && mCollapseOffset != 0) {
+ smoothScrollTo(0, 0);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEvent(event);
+ event.setClassName(ResolverDrawerLayout.class.getName());
+ }
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(info);
+ info.setClassName(ResolverDrawerLayout.class.getName());
+ if (isEnabled()) {
+ if (mCollapseOffset != 0) {
+ info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
+ info.setScrollable(true);
+ }
+ }
+ }
+
+ @Override
+ public boolean performAccessibilityAction(int action, Bundle arguments) {
+ if (super.performAccessibilityAction(action, arguments)) {
+ return true;
+ }
+
+ if (action == AccessibilityNodeInfo.ACTION_SCROLL_FORWARD && mCollapseOffset != 0) {
+ smoothScrollTo(0, 0);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int sourceWidth = MeasureSpec.getSize(widthMeasureSpec);
int widthSize = sourceWidth;
@@ -615,7 +668,13 @@
mUncollapsibleHeight = heightUsed - mCollapsibleHeight;
if (isLaidOut()) {
+ final boolean isCollapsedOld = mCollapseOffset != 0;
mCollapseOffset = Math.min(mCollapseOffset, mCollapsibleHeight);
+ final boolean isCollapsedNew = mCollapseOffset != 0;
+ if (isCollapsedOld != isCollapsedNew) {
+ notifyViewAccessibilityStateChangedIfNeeded(
+ AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED);
+ }
} else {
// Start out collapsed at first unless we restored state for otherwise
mCollapseOffset = mOpenOnLayout ? 0 : mCollapsibleHeight;
diff --git a/core/java/com/android/internal/widget/ScrollingTabContainerView.java b/core/java/com/android/internal/widget/ScrollingTabContainerView.java
index d6bd1d6f..61499ff6 100644
--- a/core/java/com/android/internal/widget/ScrollingTabContainerView.java
+++ b/core/java/com/android/internal/widget/ScrollingTabContainerView.java
@@ -391,15 +391,15 @@
}
@Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
+ public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
+ super.onInitializeAccessibilityEventInternal(event);
// This view masquerades as an action bar tab.
event.setClassName(ActionBar.Tab.class.getName());
}
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
+ public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfoInternal(info);
// This view masquerades as an action bar tab.
info.setClassName(ActionBar.Tab.class.getName());
}
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 149d7bc..88fa8f77 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -696,6 +696,14 @@
if (skip_compilation) {
addOption("-Xcompiler-option");
addOption("--compiler-filter=verify-none");
+
+ // We skip compilation when a minimal runtime is brought up for decryption. In that case
+ // /data is temporarily backed by a tmpfs, which is usually small.
+ // If the system image contains prebuilts, they will be relocated into the tmpfs. In this
+ // specific situation it is acceptable to *not* relocate and run out of the prebuilts
+ // directly instead.
+ addOption("--runtime-arg");
+ addOption("-Xnorelocate");
} else {
parseCompilerOption("dalvik.vm.dex2oat-filter", dex2oatCompilerFilterBuf,
"--compiler-filter=", "-Xcompiler-option");
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index f506569..a10cfca 100755
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -19,8 +19,6 @@
#include <jni.h>
-#include <ResourceCache.h>
-
///////////////////////////////////////////////////////////////////////////////
// Conversions to/from SkColor, for get/setPixels, and the create method, which
// is basically like setPixels
@@ -224,37 +222,34 @@
SkColorTable* ctable) {
SkASSERT(width > 0);
const uint8_t* s = (const uint8_t*)src;
- const SkPMColor* colors = ctable->lockColors();
+ const SkPMColor* colors = ctable->readColors();
do {
*dst++ = SkUnPreMultiply::PMColorToColor(colors[*s++]);
} while (--width != 0);
- ctable->unlockColors();
}
static void ToColor_SI8_Raw(SkColor dst[], const void* src, int width,
SkColorTable* ctable) {
SkASSERT(width > 0);
const uint8_t* s = (const uint8_t*)src;
- const SkPMColor* colors = ctable->lockColors();
+ const SkPMColor* colors = ctable->readColors();
do {
SkPMColor c = colors[*s++];
*dst++ = SkColorSetARGB(SkGetPackedA32(c), SkGetPackedR32(c),
SkGetPackedG32(c), SkGetPackedB32(c));
} while (--width != 0);
- ctable->unlockColors();
}
static void ToColor_SI8_Opaque(SkColor dst[], const void* src, int width,
SkColorTable* ctable) {
SkASSERT(width > 0);
const uint8_t* s = (const uint8_t*)src;
- const SkPMColor* colors = ctable->lockColors();
+ const SkPMColor* colors = ctable->readColors();
do {
SkPMColor c = colors[*s++];
*dst++ = SkColorSetRGB(SkGetPackedR32(c), SkGetPackedG32(c),
SkGetPackedB32(c));
} while (--width != 0);
- ctable->unlockColors();
}
// can return NULL
@@ -363,20 +358,11 @@
static void Bitmap_destructor(JNIEnv* env, jobject, jlong bitmapHandle) {
SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle);
- if (android::uirenderer::ResourceCache::hasInstance()) {
- android::uirenderer::ResourceCache::getInstance().destructor(bitmap);
- } else {
- delete bitmap;
- }
+ delete bitmap;
}
static jboolean Bitmap_recycle(JNIEnv* env, jobject, jlong bitmapHandle) {
SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle);
- if (android::uirenderer::ResourceCache::hasInstance()) {
- bool result;
- result = android::uirenderer::ResourceCache::getInstance().recycle(bitmap);
- return result ? JNI_TRUE : JNI_FALSE;
- }
bitmap->setPixels(NULL, NULL);
return JNI_TRUE;
}
@@ -639,8 +625,7 @@
int count = ctable->count();
p->writeInt32(count);
memcpy(p->writeInplace(count * sizeof(SkPMColor)),
- ctable->lockColors(), count * sizeof(SkPMColor));
- ctable->unlockColors();
+ ctable->readColors(), count * sizeof(SkPMColor));
} else {
p->writeInt32(0); // indicate no ctable
}
@@ -827,10 +812,8 @@
return JNI_FALSE;
}
- SkAutoLockColors alc0(ct0);
- SkAutoLockColors alc1(ct1);
const size_t size = ct0->count() * sizeof(SkPMColor);
- if (memcmp(alc0.colors(), alc1.colors(), size) != 0) {
+ if (memcmp(ct0->readColors(), ct1->readColors(), size) != 0) {
return JNI_FALSE;
}
}
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index eded678..672008d 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -63,7 +63,7 @@
{ SkImageDecoder::kWBMP_Format, "image/vnd.wap.wbmp" }
};
- const char* cstr = NULL;
+ const char* cstr = nullptr;
for (size_t i = 0; i < SK_ARRAY_COUNT(gMimeTypes); i++) {
if (gMimeTypes[i].fFormat == format) {
cstr = gMimeTypes[i].fMimeType;
@@ -71,8 +71,10 @@
}
}
- jstring jstr = 0;
- if (NULL != cstr) {
+ jstring jstr = nullptr;
+ if (cstr != nullptr) {
+ // NOTE: Caller should env->ExceptionCheck() for OOM
+ // (can't check for nullptr as it's a valid return value)
jstr = env->NewStringUTF(cstr);
}
return jstr;
@@ -324,10 +326,13 @@
// update options (if any)
if (options != NULL) {
+ jstring mimeType = getMimeTypeString(env, decoder->getFormat());
+ if (env->ExceptionCheck()) {
+ return nullObjectReturn("OOM in getMimeTypeString()");
+ }
env->SetIntField(options, gOptions_widthFieldID, scaledWidth);
env->SetIntField(options, gOptions_heightFieldID, scaledHeight);
- env->SetObjectField(options, gOptions_mimeFieldID,
- getMimeTypeString(env, decoder->getFormat()));
+ env->SetObjectField(options, gOptions_mimeFieldID, mimeType);
}
// if we're in justBounds mode, return now (skip the java bitmap)
@@ -518,8 +523,7 @@
Asset* asset = reinterpret_cast<Asset*>(native_asset);
// since we know we'll be done with the asset when we return, we can
// just use a simple wrapper
- SkAutoTUnref<SkStreamRewindable> stream(new AssetStreamAdaptor(asset,
- AssetStreamAdaptor::kNo_OwnAsset, AssetStreamAdaptor::kNo_HasMemoryBase));
+ SkAutoTUnref<SkStreamRewindable> stream(new AssetStreamAdaptor(asset));
return doDecode(env, stream, padding, options);
}
diff --git a/core/jni/android/graphics/FontFamily.cpp b/core/jni/android/graphics/FontFamily.cpp
index 8a85d62..3e6327b 100644
--- a/core/jni/android/graphics/FontFamily.cpp
+++ b/core/jni/android/graphics/FontFamily.cpp
@@ -19,6 +19,8 @@
#include "JNIHelp.h"
#include <core_jni_helpers.h>
+#include "SkData.h"
+#include "SkRefCnt.h"
#include "SkTypeface.h"
#include "GraphicsJNI.h"
#include <ScopedPrimitiveArray.h>
@@ -82,6 +84,10 @@
return true;
}
+static void releaseAsset(const void* ptr, size_t length, void* context) {
+ delete static_cast<Asset*>(context);
+}
+
static jboolean FontFamily_addFontFromAsset(JNIEnv* env, jobject, jlong familyPtr,
jobject jassetMgr, jstring jpath) {
NPE_CHECK_RETURN_ZERO(env, jassetMgr);
@@ -98,12 +104,15 @@
return false;
}
- SkStream* stream = new AssetStreamAdaptor(asset,
- AssetStreamAdaptor::kYes_OwnAsset,
- AssetStreamAdaptor::kYes_HasMemoryBase);
+ const void* buf = asset->getBuffer(false);
+ if (NULL == buf) {
+ delete asset;
+ return false;
+ }
+
+ SkAutoTUnref<SkData> data(SkData::NewWithProc(buf, asset->getLength(), releaseAsset, asset));
+ SkAutoTUnref<SkMemoryStream> stream(new SkMemoryStream(data));
SkTypeface* face = SkTypeface::CreateFromStream(stream);
- // Note: SkTypeface::CreateFromStream holds its own reference to the stream
- stream->unref();
if (face == NULL) {
ALOGE("addFontFromAsset failed to create font %s", str.c_str());
return false;
diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp
index 2ec0828..9996ce1 100644
--- a/core/jni/android/graphics/Graphics.cpp
+++ b/core/jni/android/graphics/Graphics.cpp
@@ -8,10 +8,12 @@
#include "SkCanvas.h"
#include "SkDevice.h"
#include "SkMath.h"
-#include "SkPicture.h"
#include "SkRegion.h"
#include <android_runtime/AndroidRuntime.h>
+#include <Caches.h>
+#include <TextureCache.h>
+
void doThrowNPE(JNIEnv* env) {
jniThrowNullPointerException(env, NULL);
}
@@ -501,10 +503,28 @@
JNIEnv* env = vm2env(fVM);
env->DeleteGlobalRef(fStorageObj);
}
+
+ if (android::uirenderer::Caches::hasInstance()) {
+ android::uirenderer::Caches::getInstance().textureCache.releaseTexture(getStableID());
+ }
}
///////////////////////////////////////////////////////////////////////////////
+static bool computeAllocationSize(const SkImageInfo& info, size_t* size, size_t* rowBytes) {
+ int32_t rowBytes32 = SkToS32(info.minRowBytes());
+ int64_t bigSize = (int64_t)info.height() * rowBytes32;
+ if (rowBytes32 < 0 || !sk_64_isS32(bigSize)) {
+ return false; // allocation will be too large
+ }
+
+ *size = sk_64_asS32(bigSize);
+ *rowBytes = rowBytes32;
+
+ SkASSERT(*size >= info.getSafeSize(*rowBytes));
+ return true;
+}
+
jbyteArray GraphicsJNI::allocateJavaPixelRef(JNIEnv* env, SkBitmap* bitmap,
SkColorTable* ctable) {
const SkImageInfo& info = bitmap->info();
@@ -513,7 +533,11 @@
return NULL;
}
- const size_t size = bitmap->getSize();
+ size_t size, rowBytes;
+ if (!computeAllocationSize(info, &size, &rowBytes)) {
+ return NULL;
+ }
+
jbyteArray arrayObj = (jbyteArray) env->CallObjectMethod(gVMRuntime,
gVMRuntime_newNonMovableArray,
gByte_class, size);
@@ -526,8 +550,7 @@
return NULL;
}
SkASSERT(addr);
- SkPixelRef* pr = new AndroidPixelRef(env, info, (void*) addr,
- bitmap->rowBytes(), arrayObj, ctable);
+ SkPixelRef* pr = new AndroidPixelRef(env, info, (void*) addr, rowBytes, arrayObj, ctable);
bitmap->setPixelRef(pr)->unref();
// since we're already allocated, we lockPixels right away
// HeapAllocator behaves this way too
@@ -536,6 +559,56 @@
return arrayObj;
}
+struct AndroidPixelRefContext {
+ int32_t stableID;
+};
+
+static void allocatePixelsReleaseProc(void* ptr, void* ctx) {
+ AndroidPixelRefContext* context = (AndroidPixelRefContext*)ctx;
+ if (android::uirenderer::Caches::hasInstance()) {
+ android::uirenderer::Caches::getInstance().textureCache.releaseTexture(context->stableID);
+ }
+
+ sk_free(ptr);
+ delete context;
+}
+
+bool GraphicsJNI::allocatePixels(JNIEnv* env, SkBitmap* bitmap, SkColorTable* ctable) {
+ const SkImageInfo& info = bitmap->info();
+ if (info.fColorType == kUnknown_SkColorType) {
+ doThrowIAE(env, "unknown bitmap configuration");
+ return NULL;
+ }
+
+ size_t size, rowBytes;
+ if (!computeAllocationSize(info, &size, &rowBytes)) {
+ return false;
+ }
+
+ void* addr = sk_malloc_flags(size, 0);
+ if (NULL == addr) {
+ return false;
+ }
+
+ AndroidPixelRefContext* context = new AndroidPixelRefContext;
+ SkMallocPixelRef* pr = SkMallocPixelRef::NewWithProc(info, rowBytes, ctable, addr,
+ &allocatePixelsReleaseProc, context);
+ if (!pr) {
+ delete context;
+ return false;
+ }
+
+ // set the stableID in the context so that it can be used later in
+ // allocatePixelsReleaseProc to remove the texture from the cache.
+ context->stableID = pr->getStableID();
+
+ bitmap->setPixelRef(pr)->unref();
+ // since we're already allocated, we can lockPixels right away
+ bitmap->lockPixels();
+
+ return true;
+}
+
///////////////////////////////////////////////////////////////////////////////
JavaPixelAllocator::JavaPixelAllocator(JNIEnv* env)
diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h
index 0a70ba2..a202c38 100644
--- a/core/jni/android/graphics/GraphicsJNI.h
+++ b/core/jni/android/graphics/GraphicsJNI.h
@@ -95,6 +95,14 @@
static jbyteArray allocateJavaPixelRef(JNIEnv* env, SkBitmap* bitmap,
SkColorTable* ctable);
+ /**
+ * Given a bitmap we natively allocate a memory block to store the contents
+ * of that bitmap. The memory is then attached to the bitmap via an
+ * SkPixelRef, which ensures that upon deletion the appropriate caches
+ * are notified.
+ */
+ static bool allocatePixels(JNIEnv* env, SkBitmap* bitmap, SkColorTable* ctable);
+
/** Copy the colors in colors[] to the bitmap, convert to the correct
format along the way.
Whether to use premultiplied pixels is determined by dstBitmap's alphaType.
diff --git a/core/jni/android/graphics/Movie.cpp b/core/jni/android/graphics/Movie.cpp
index 8c79edf..134551d 100644
--- a/core/jni/android/graphics/Movie.cpp
+++ b/core/jni/android/graphics/Movie.cpp
@@ -1,3 +1,4 @@
+#include "Canvas.h"
#include "ScopedLocalRef.h"
#include "SkFrontBufferedStream.h"
#include "SkMovie.h"
@@ -63,16 +64,19 @@
return J2Movie(env, movie)->setTime(ms) ? JNI_TRUE : JNI_FALSE;
}
-static void movie_draw(JNIEnv* env, jobject movie, jobject canvas,
+static void movie_draw(JNIEnv* env, jobject movie, jlong canvasHandle,
jfloat fx, jfloat fy, jlong paintHandle) {
NPE_CHECK_RETURN_VOID(env, movie);
- NPE_CHECK_RETURN_VOID(env, canvas);
- // its OK for paint to be null
+
+ android::Canvas* c = reinterpret_cast<android::Canvas*>(canvasHandle);
+ const android::Paint* p = reinterpret_cast<android::Paint*>(paintHandle);
+
+ // Canvas should never be NULL. However paint is an optional parameter and
+ // therefore may be NULL.
+ SkASSERT(c != NULL);
SkMovie* m = J2Movie(env, movie);
- SkCanvas* c = GraphicsJNI::getNativeCanvas(env, canvas);
const SkBitmap& b = m->bitmap();
- const android::Paint* p = reinterpret_cast<android::Paint*>(paintHandle);
c->drawBitmap(b, fx, fy, p);
}
@@ -80,9 +84,7 @@
static jobject movie_decodeAsset(JNIEnv* env, jobject clazz, jlong native_asset) {
android::Asset* asset = reinterpret_cast<android::Asset*>(native_asset);
if (asset == NULL) return NULL;
- SkAutoTUnref<SkStreamRewindable> stream (new android::AssetStreamAdaptor(asset,
- android::AssetStreamAdaptor::kNo_OwnAsset,
- android::AssetStreamAdaptor::kNo_HasMemoryBase));
+ SkAutoTUnref<SkStreamRewindable> stream(new android::AssetStreamAdaptor(asset));
SkMovie* moov = SkMovie::DecodeStream(stream.get());
return create_jmovie(env, moov);
}
@@ -140,7 +142,7 @@
{ "isOpaque", "()Z", (void*)movie_isOpaque },
{ "duration", "()I", (void*)movie_duration },
{ "setTime", "(I)Z", (void*)movie_setTime },
- { "nDraw", "(Landroid/graphics/Canvas;FFJ)V",
+ { "nDraw", "(JFFJ)V",
(void*)movie_draw },
{ "nativeDecodeAsset", "(J)Landroid/graphics/Movie;",
(void*)movie_decodeAsset },
diff --git a/core/jni/android/graphics/NinePatchImpl.cpp b/core/jni/android/graphics/NinePatchImpl.cpp
index 4c589b7..26ce967 100644
--- a/core/jni/android/graphics/NinePatchImpl.cpp
+++ b/core/jni/android/graphics/NinePatchImpl.cpp
@@ -206,7 +206,7 @@
src.fTop = 0;
dst.fTop = bounds.fTop;
// The first row always starts with the top being at y=0 and the bottom
- // being either yDivs[1] (if yDivs[0]=0) of yDivs[0]. In the former case
+ // being either yDivs[1] (if yDivs[0]=0) or yDivs[0]. In the former case
// the first row is stretchable along the Y axis, otherwise it is fixed.
// The last row always ends with the bottom being bitmap.height and the top
// being either yDivs[numYDivs-2] (if yDivs[numYDivs-1]=bitmap.height) or
diff --git a/core/jni/android/graphics/Picture.cpp b/core/jni/android/graphics/Picture.cpp
index 33d43083..c249012 100644
--- a/core/jni/android/graphics/Picture.cpp
+++ b/core/jni/android/graphics/Picture.cpp
@@ -27,9 +27,10 @@
mHeight = src->height();
if (NULL != src->mPicture.get()) {
mPicture.reset(SkRef(src->mPicture.get()));
- } if (NULL != src->mRecorder.get()) {
+ } else if (NULL != src->mRecorder.get()) {
mPicture.reset(src->makePartialCopy());
}
+ validate();
} else {
mWidth = 0;
mHeight = 0;
@@ -48,35 +49,31 @@
void Picture::endRecording() {
if (NULL != mRecorder.get()) {
mPicture.reset(mRecorder->endRecording());
+ validate();
mRecorder.reset(NULL);
}
}
int Picture::width() const {
- if (NULL != mPicture.get()) {
- SkASSERT(mPicture->width() == mWidth);
- SkASSERT(mPicture->height() == mHeight);
- }
-
+ validate();
return mWidth;
}
int Picture::height() const {
- if (NULL != mPicture.get()) {
- SkASSERT(mPicture->width() == mWidth);
- SkASSERT(mPicture->height() == mHeight);
- }
-
+ validate();
return mHeight;
}
Picture* Picture::CreateFromStream(SkStream* stream) {
Picture* newPict = new Picture;
- newPict->mPicture.reset(SkPicture::CreateFromStream(stream));
- if (NULL != newPict->mPicture.get()) {
- newPict->mWidth = newPict->mPicture->width();
- newPict->mHeight = newPict->mPicture->height();
+ SkPicture* skPicture = SkPicture::CreateFromStream(stream);
+ if (NULL != skPicture) {
+ newPict->mPicture.reset(skPicture);
+
+ const SkIRect cullRect = skPicture->cullRect().roundOut();
+ newPict->mWidth = cullRect.width();
+ newPict->mHeight = cullRect.height();
}
return newPict;
@@ -87,6 +84,7 @@
SkAutoTDelete<SkPicture> tempPict(this->makePartialCopy());
tempPict->serialize(stream);
} else if (NULL != mPicture.get()) {
+ validate();
mPicture->serialize(stream);
} else {
SkPictureRecorder recorder;
@@ -101,6 +99,7 @@
this->endRecording();
SkASSERT(NULL != mPicture.get());
}
+ validate();
if (NULL != mPicture.get()) {
mPicture.get()->playback(canvas->getSkCanvas());
}
@@ -116,4 +115,14 @@
return reRecorder.endRecording();
}
+void Picture::validate() const {
+#ifdef SK_DEBUG
+ if (NULL != mPicture.get()) {
+ SkRect cullRect = mPicture->cullRect();
+ SkRect myRect = SkRect::MakeWH(SkIntToScalar(mWidth), SkIntToScalar(mHeight));
+ SkASSERT(cullRect == myRect);
+ }
+#endif
+}
+
}; // namespace android
diff --git a/core/jni/android/graphics/Picture.h b/core/jni/android/graphics/Picture.h
index 4db923d..a9db648 100644
--- a/core/jni/android/graphics/Picture.h
+++ b/core/jni/android/graphics/Picture.h
@@ -60,6 +60,8 @@
// Make a copy of a picture that is in the midst of being recorded. The
// resulting picture will have balanced saves and restores.
SkPicture* makePartialCopy() const;
+
+ void validate() const;
};
}; // namespace android
diff --git a/core/jni/android/graphics/Utils.cpp b/core/jni/android/graphics/Utils.cpp
index a134d4b..3c471bd 100644
--- a/core/jni/android/graphics/Utils.cpp
+++ b/core/jni/android/graphics/Utils.cpp
@@ -19,21 +19,11 @@
using namespace android;
-AssetStreamAdaptor::AssetStreamAdaptor(Asset* asset, OwnAsset ownAsset,
- HasMemoryBase hasMemoryBase)
+AssetStreamAdaptor::AssetStreamAdaptor(Asset* asset)
: fAsset(asset)
- , fMemoryBase(kYes_HasMemoryBase == hasMemoryBase ?
- asset->getBuffer(false) : NULL)
- , fOwnAsset(ownAsset)
{
}
-AssetStreamAdaptor::~AssetStreamAdaptor() {
- if (kYes_OwnAsset == fOwnAsset) {
- delete fAsset;
- }
-}
-
bool AssetStreamAdaptor::rewind() {
off64_t pos = fAsset->seek(0, SEEK_SET);
if (pos == (off64_t)-1) {
diff --git a/core/jni/android/graphics/Utils.h b/core/jni/android/graphics/Utils.h
index bde87f0..c0b9410 100644
--- a/core/jni/android/graphics/Utils.h
+++ b/core/jni/android/graphics/Utils.h
@@ -28,22 +28,7 @@
class AssetStreamAdaptor : public SkStreamRewindable {
public:
- // Enum passed to constructor. If set to kYes_OwnAsset,
- // the passed in Asset will be deleted upon destruction.
- enum OwnAsset {
- kYes_OwnAsset,
- kNo_OwnAsset,
- };
-
- // Enum passed to constructor. If set to kYes_HasMemoryBase,
- // getMemoryBase will return the Asset's buffer.
- enum HasMemoryBase {
- kYes_HasMemoryBase,
- kNo_HasMemoryBase,
- };
-
- AssetStreamAdaptor(Asset*, OwnAsset, HasMemoryBase);
- ~AssetStreamAdaptor();
+ AssetStreamAdaptor(Asset*);
virtual bool rewind();
virtual size_t read(void* buffer, size_t size);
@@ -51,13 +36,9 @@
virtual size_t getLength() const;
virtual bool isAtEnd() const;
- virtual const void* getMemoryBase() { return fMemoryBase; }
-
virtual SkStreamRewindable* duplicate() const;
private:
- Asset* fAsset;
- const void* const fMemoryBase;
- const OwnAsset fOwnAsset;
+ Asset* fAsset;
};
/**
diff --git a/core/jni/android/graphics/pdf/PdfDocument.cpp b/core/jni/android/graphics/pdf/PdfDocument.cpp
index 8ba164f..a91b15b 100644
--- a/core/jni/android/graphics/pdf/PdfDocument.cpp
+++ b/core/jni/android/graphics/pdf/PdfDocument.cpp
@@ -71,7 +71,7 @@
mCurrentPage = page;
SkCanvas* canvas = page->mPictureRecorder->beginRecording(
- contentRect.width(), contentRect.height(), NULL, 0);
+ SkRect::MakeWH(contentRect.width(), contentRect.height()));
return canvas;
}
diff --git a/core/jni/android/graphics/pdf/PdfEditor.cpp b/core/jni/android/graphics/pdf/PdfEditor.cpp
index cb228f2..84434ae 100644
--- a/core/jni/android/graphics/pdf/PdfEditor.cpp
+++ b/core/jni/android/graphics/pdf/PdfEditor.cpp
@@ -201,7 +201,11 @@
SkMatrix* skTransform = reinterpret_cast<SkMatrix*>(transformPtr);
SkScalar transformValues[6];
- skTransform->asAffine(transformValues);
+ if (!skTransform->asAffine(transformValues)) {
+ jniThrowException(env, "java/lang/IllegalArgumentException",
+ "transform matrix has perspective. Only affine matrices are allowed.");
+ return;
+ }
// PDF's coordinate system origin is left-bottom while in graphics it
// is the top-left. So, translate the PDF coordinates to ours.
diff --git a/core/jni/android/graphics/pdf/PdfRenderer.cpp b/core/jni/android/graphics/pdf/PdfRenderer.cpp
index ae23cb4..fc98cf9 100644
--- a/core/jni/android/graphics/pdf/PdfRenderer.cpp
+++ b/core/jni/android/graphics/pdf/PdfRenderer.cpp
@@ -219,11 +219,16 @@
matrix.Set(1, 0, 0, -1, 0, pPage->GetPageHeight());
SkScalar transformValues[6];
- transform->asAffine(transformValues);
+ if (transform->asAffine(transformValues)) {
+ matrix.Concat(transformValues[SkMatrix::kAScaleX], transformValues[SkMatrix::kASkewY],
+ transformValues[SkMatrix::kASkewX], transformValues[SkMatrix::kAScaleY],
+ transformValues[SkMatrix::kATransX], transformValues[SkMatrix::kATransY]);
+ } else {
+ // Already checked for a return value of false in the caller, so this should never
+ // happen.
+ ALOGE("Error rendering page!");
+ }
- matrix.Concat(transformValues[SkMatrix::kAScaleX], transformValues[SkMatrix::kASkewY],
- transformValues[SkMatrix::kASkewX], transformValues[SkMatrix::kAScaleY],
- transformValues[SkMatrix::kATransX], transformValues[SkMatrix::kATransY]);
}
pageContext->AppendObjectList(pPage, &matrix);
@@ -264,6 +269,12 @@
renderFlags |= FPDF_PRINTING;
}
+ if (skMatrix && !skMatrix->asAffine(NULL)) {
+ jniThrowException(env, "java/lang/IllegalArgumentException",
+ "transform matrix has perspective. Only affine matrices are allowed.");
+ return;
+ }
+
renderPageBitmap(bitmap, page, destLeft, destTop, destRight,
destBottom, skMatrix, renderFlags);
diff --git a/core/jni/android/opengl/util.cpp b/core/jni/android/opengl/util.cpp
index da30044..461507f 100644
--- a/core/jni/android/opengl/util.cpp
+++ b/core/jni/android/opengl/util.cpp
@@ -675,9 +675,8 @@
if (data) {
void* const pixels = (char*)data + palette_size;
SkColorTable* ctable = bitmap.getColorTable();
- memcpy(data, ctable->lockColors(), ctable->count() * sizeof(SkPMColor));
+ memcpy(data, ctable->readColors(), ctable->count() * sizeof(SkPMColor));
memcpy(pixels, p, size);
- ctable->unlockColors();
glCompressedTexImage2D(target, level, internalformat, w, h, border, imageSize, data);
free(data);
} else {
diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp
index 4675b49..b98dbca 100644
--- a/core/jni/android_graphics_Canvas.cpp
+++ b/core/jni/android_graphics_Canvas.cpp
@@ -383,7 +383,8 @@
hasAlpha ? kN32_SkColorType : kRGB_565_SkColorType,
kPremul_SkAlphaType);
SkBitmap bitmap;
- if (!bitmap.tryAllocPixels(info)) {
+ bitmap.setInfo(info);
+ if (!GraphicsJNI::allocatePixels(env, &bitmap, NULL)) {
return;
}
diff --git a/core/jni/android_hardware_camera2_DngCreator.cpp b/core/jni/android_hardware_camera2_DngCreator.cpp
index bb8de28..5548476 100644
--- a/core/jni/android_hardware_camera2_DngCreator.cpp
+++ b/core/jni/android_hardware_camera2_DngCreator.cpp
@@ -37,6 +37,17 @@
#include <img_utils/StripSource.h>
#include "core_jni_helpers.h"
+#include <utils/Log.h>
+#include <utils/Errors.h>
+#include <utils/StrongPointer.h>
+#include <utils/RefBase.h>
+#include <utils/Vector.h>
+#include <cutils/properties.h>
+
+#include <string.h>
+#include <inttypes.h>
+
+#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/android_hardware_camera2_CameraMetadata.h"
#include <jni.h>
@@ -360,15 +371,18 @@
realCount = count;
}
- mEnv->CallObjectMethod(mInBuf, gInputByteBufferClassInfo.mGetMethod, mByteArray, 0,
+ jobject chainingBuf = mEnv->CallObjectMethod(mInBuf, gInputByteBufferClassInfo.mGetMethod, mByteArray, 0,
realCount);
+ mEnv->DeleteLocalRef(chainingBuf);
if (mEnv->ExceptionCheck()) {
+ ALOGE("%s: Exception while reading from input into byte buffer.", __FUNCTION__);
return BAD_VALUE;
}
mEnv->GetByteArrayRegion(mByteArray, 0, realCount, reinterpret_cast<jbyte*>(buf + offset));
if (mEnv->ExceptionCheck()) {
+ ALOGE("%s: Exception while reading from byte buffer.", __FUNCTION__);
return BAD_VALUE;
}
return realCount;
@@ -468,15 +482,17 @@
for (uint32_t i = 0; i < mHeight; ++i) {
size_t rowFillAmt = 0;
- size_t rowSize = mPixStride;
+ size_t rowSize = mRowStride;
while (rowFillAmt < mRowStride) {
ssize_t bytesRead = mInput->read(rowBytes, rowFillAmt, rowSize);
if (bytesRead <= 0) {
if (bytesRead == NOT_ENOUGH_DATA || bytesRead == 0) {
+ ALOGE("%s: Early EOF on row %" PRIu32 ", received bytesRead %zd",
+ __FUNCTION__, i, bytesRead);
jniThrowExceptionFmt(mEnv, "java/io/IOException",
- "Early EOF encountered, not enough pixel data for image of size %u",
- fullSize);
+ "Early EOF encountered, not enough pixel data for image of size %"
+ PRIu32, fullSize);
bytesRead = NOT_ENOUGH_DATA;
} else {
if (!mEnv->ExceptionCheck()) {
diff --git a/core/res/res/color/date_picker_calendar_holo_dark.xml b/core/res/res/color/date_picker_calendar_holo_dark.xml
index d29486f..6749ea1 100644
--- a/core/res/res/color/date_picker_calendar_holo_dark.xml
+++ b/core/res/res/color/date_picker_calendar_holo_dark.xml
@@ -15,11 +15,10 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_enabled="true" android:state_selected="false"
- android:color="@color/datepicker_default_normal_text_color_holo_dark"/>
- <item android:state_enabled="true" android:state_selected="true"
- android:color="@color/holo_blue_light"/>
<item android:state_enabled="false"
- android:color="@color/datepicker_default_disabled_text_color_holo_dark"/>
+ android:color="@color/datepicker_default_disabled_text_color_holo_dark" />
+ <item android:state_activated="true"
+ android:color="@color/holo_blue_light" />
+ <item android:color="@color/datepicker_default_normal_text_color_holo_dark" />
</selector>
\ No newline at end of file
diff --git a/core/res/res/color/date_picker_calendar_holo_light.xml b/core/res/res/color/date_picker_calendar_holo_light.xml
index 776f39b..0aa116a 100644
--- a/core/res/res/color/date_picker_calendar_holo_light.xml
+++ b/core/res/res/color/date_picker_calendar_holo_light.xml
@@ -15,11 +15,10 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_enabled="true" android:state_selected="false"
- android:color="@color/datepicker_default_normal_text_color_holo_light"/>
- <item android:state_enabled="true" android:state_selected="true"
- android:color="@color/holo_blue_light"/>
<item android:state_enabled="false"
- android:color="@color/datepicker_default_disabled_text_color_holo_light"/>
+ android:color="@color/datepicker_default_disabled_text_color_holo_light" />
+ <item android:state_activated="true"
+ android:color="@color/holo_blue_light" />
+ <item android:color="@color/datepicker_default_normal_text_color_holo_light" />
</selector>
\ No newline at end of file
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 4d05447..415e6d5 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Foon se berging is vol. Vee \'n aantal lêers uit om spasie vry te maak."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Netwerk kan dalk gemonitor word"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Deur \'n onbekende derde party"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Deur jou werkprofieladministrateur"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Deur <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Werkprofiel is uitgevee"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Werkprofiel is uitgevee weens ontbrekende administrasieprogram."</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 2d8dc4b..aafffe8 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"የስልክ ማከማቻ ሙሉ ነው! ቦታ ነፃ ለማድረግ አንዳንድ ፋይሎች ሰርዝ።"</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"አውታረ መረብ በክትትል ውስጥ ሊሆን ይችላል"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"ባልታወቀ ሶስተኛ ወገን"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"በእርስዎ የስራ መገለጫ አስተዳዳሪ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"በ<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"የስራ መገለጫ ተሰርዟል"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"በጎደለ የአስተዳዳሪ መተግበሪያ ምክንያት የስራ መገለጫ ተሰርዟል።"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index f44b92d..63340fc 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"سعة تخزين الهاتف ممتلئة. احذف بعض الملفات لإخلاء مساحة."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"قد تكون الشبكة مراقبة"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"بواسطة جهة خارجية غير معلومة"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"بواسطة مشرف الملف الشخصي للعمل"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"بواسطة <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"تم حذف الملف الشخصي للعمل."</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"تم حذف الملف الشخصي للعمل نتيجة فقد تطبيق المشرف."</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index be92b6a..2112d8a 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Хранилището на телефона е пълно. Изтрийте файлове, за да освободите място."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Мрежата може да се наблюдава"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"От неизвестна трета страна"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"От администратора на служебния ви потребителски профил"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"От <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Служебният потребителски профил е изтрит"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Служебният потребителски профил е изтрит поради липса на администраторско приложение."</string>
diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml
index 2939514..f37b7fb 100644
--- a/core/res/res/values-bn-rBD/strings.xml
+++ b/core/res/res/values-bn-rBD/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"ফোনের সঞ্চয়স্থানে আর জায়গা খালি নেই৷ স্থান খালি করতে কিছু ফাইল মুছে দিন৷"</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"নেটওয়ার্ক নিরীক্ষণ করা হতে পারে"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"একটি অজানা তৃতীয় পক্ষের দ্বারা"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"আপনার কাজের প্রোফাইলের প্রশাসক দ্বারা"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> এর দ্বারা"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"কাজের প্রোফাইল মুছে ফেলা হয়েছে"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"প্রশাসক অ্যাপ্লিকেশান অনুপস্থিত থাকায় কাজের প্রোফাইল মুছে ফেলা হয়েছে৷"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index e4cd832..a2235fd 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"L\'emmagatzematge del telèfon és ple. Suprimeix uns quants fitxers per alliberar espai."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"És possible que la xarxa estigui supervisada"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Per un tercer desconegut"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Administrador del perfil de la feina"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Per <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"S\'ha suprimit el perfil professional"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"S\'ha suprimit el perfil professional perquè no s\'ha detectat cap aplicació d\'administració."</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 1e6014e..dc9eda2 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Paměť telefonu je plná. Uvolněte místo smazáním některých souborů."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Síť může být monitorována"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Původce: neznámá třetí strana"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Od správce vašeho pracovního profilu"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Původce: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Pracovní profil byl smazán."</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Pracovní profil byl smazán, protože není k dispozici aplikace pro správu."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index b2c99fd..46d064d 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Telefonens lager er fuldt. Slet nogle filer for at frigøre plads."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Netværket kan være overvåget"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Af en ukendt tredjepart"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Af administratoren for din arbejdsprofil"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Af <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Arbejdsprofilen blev slettet"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Arbejdsprofilen blev slettet, fordi der mangler en administrationsapp."</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index f52a747..aaa41a2 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Der Handyspeicher ist voll! Löschen Sie Dateien, um Speicherplatz freizugeben."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Das Netzwerk wird möglicherweise überwacht."</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Von einem unbekannten Dritten"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Vom Administrator Ihres Arbeitsprofils"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Von <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Arbeitsprofil gelöscht"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Arbeitsprofil aufgrund fehlender Admin-App gelöscht"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 8a4905a..737cc1f 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Ο αποθηκευτικός χώρος του τηλεφώνου είναι πλήρης. Διαγράψτε μερικά αρχεία για να δημιουργήσετε ελεύθερο χώρο."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Το δίκτυο ενδέχεται να παρακολουθείται"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Από ένα άγνωστο τρίτο μέρος"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Από το διαχειριστή του προφίλ εργασίας σας"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Από <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Το προφίλ εργασίας διαγράφηκε"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Το προφίλ εργασίας διαγράφηκε επειδή λείπει η εφαρμογή διαχείρισης."</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 74870af..df8b41f 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Phone storage is full. Delete some files to free space."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Network may be monitored"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"By an unknown third party"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"By your work profile administrator"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"By <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Work profile deleted"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Work profile deleted due to missing admin app."</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 74870af..df8b41f 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Phone storage is full. Delete some files to free space."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Network may be monitored"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"By an unknown third party"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"By your work profile administrator"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"By <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Work profile deleted"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Work profile deleted due to missing admin app."</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 0b7dd33..a9353db 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Se ha agotado el espacio de almacenamiento del dispositivo. Elimina algunos archivos para liberar espacio."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Es posible que la red esté supervisada"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Por un tercero desconocido"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Por el administrador del perfil de trabajo"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Perfil de trabajo eliminado"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Se eliminó el perfil de trabajo debido a la falta de una aplicación de administración."</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index fb78c54..96856c0 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Se ha agotado el espacio de almacenamiento del teléfono. Elimina algunos archivos para liberar espacio."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Es posible que la red esté supervisada"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Por un tercero desconocido"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Del administrador de tu perfil de trabajo"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Perfil de trabajo eliminado"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Perfil de trabajo eliminado porque falta la aplicación de administración."</string>
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index 9b74e49..ccb7b9f 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Telefonimälu on täis. Ruumi vabastamiseks kustutage mõned failid."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Võrku võidakse jälgida"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Tundmatu kolmas osapool:"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Teie tööprofiili administraatori poolt"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Domeen: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Tööprofiil on kustutatud"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Tööprofiil on kustutatud puuduva administraatori rakenduse tõttu."</string>
diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml
index ebb70f5..51e9fee 100644
--- a/core/res/res/values-eu-rES/strings.xml
+++ b/core/res/res/values-eu-rES/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Telefonoaren memoria beteta dago. Tokia egiteko, ezabatu fitxategi batzuk."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Baliteke sarea kontrolatuta egotea"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Hirugarren alderdi ezezagun baten arabera"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Laneko profilaren administratzailea"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> da arduraduna"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Laneko profila ezabatu egin da"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Laneko profila ezabatu egin da hura administratzeko aplikazioa falta delako."</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index c6e7397..b04d53c 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"حافظه تلفن پر است. بعضی از فایلها را حذف کنید تا فضا آزاد شود."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ممکن است شبکه نظارت شده باشد"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"توسط یک شخص ثالث ناشناس"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"توسط سرپرست نمایه کار شما"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"توسط <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"نمایه کار حذف شد"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"به دلیل نداشتن برنامه سرپرست، نمایه کار حذف شده است."</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 7b1b21b..49dd96f 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Puhelimen tallennustila on täynnä. Vapauta tilaa poistamalla tiedostoja."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Verkkoa saatetaan valvoa"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Valvoja on tuntematon kolmas osapuoli."</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Valvoja: työprofiilin järjestelmänvalvoja"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Valvoja on <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>."</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Työprofiili poistettiin"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Työprofiili poistettiin, koska laitteelta puuttuu järjestelmänvalvojasovellus."</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 85b806f..10d0ab3 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Le réseau peut être surveillé"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Par un tiers inconnu"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Par l\'administrateur de votre profil professionnel"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Par <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Profil professionnel supprimé"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Profil professionnel supprimé en raison de l\'application d\'administration manquante."</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 7ea4c8b..1945e78 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Il est possible que le réseau soit surveillé."</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Par un tiers inconnu"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Par l\'administrateur de votre profil professionnel"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Par <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Profil professionnel supprimé"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Le profil professionnel a été supprimé, car une application d\'administration est manquante."</string>
diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml
index e7ef843..78d223c 100644
--- a/core/res/res/values-gl-rES/strings.xml
+++ b/core/res/res/values-gl-rES/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"O almacenamento do teléfono está cheo. Elimina algúns ficheiros para liberar espazo."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"É posible que se supervise a rede"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Por un terceiro descoñecido"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Mediante o administrador do teu perfil de traballo"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Eliminouse o perfil de traballo"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Eliminouse o perfil de traballo porque falta a aplicación de administración."</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 494284a..d17a5cb 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"फ़ोन मेमोरी भर गया है. स्थान खाली करने के लिए कुछ फ़ाइलें हटाएं."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"नेटवर्क को मॉनिटर किया जा सकता है"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"किसी अज्ञात तृतीय पक्ष के द्वारा"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"आपके कार्य प्रोफ़ाइल नियंत्रक द्वारा"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> के द्वारा"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"कार्य प्रोफ़ाइल हटाई गई"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"अनुपलब्ध व्यवस्थापक ऐप के कारण कार्य प्रोफ़ाइल हटाई गई."</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 063c81d..21c9938 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Prostor za pohranu na telefonu je pun. Izbrišite nekoliko datoteka kako biste oslobodili prostor."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Mreža se možda nadzire"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Od strane nepoznate treće strane"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Administrator vašeg radnog profila"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Od strane domene <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Radni je profil izbrisan"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Radni je profil izbrisan jer nedostaje administratorska aplikacija."</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index aa8be9b..978d115 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"A telefon tárhelye megtelt. Hely felszabadításához töröljön néhány fájlt."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Lehet, hogy a hálózat felügyelt"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Ismeretlen harmadik fél által"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"A munkaprofil adminisztrátora által"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Megfigyelő: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Munkahelyi profil törölve"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"A munkahelyi profilt a rendszer a hiányzó rendszergazda alkalmazás miatt törölte."</string>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index 80427bd..101a726 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Հեռախոսի պահոցը լիքն է: Ջնջեք մի քանի ֆայլեր` տարածություն ազատելու համար:"</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Ցանցը կարող է վերահսկվել"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Անհայտ երրորդ կողմի կողմից"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Ձեր աշխատանքային պրոֆիլի ադմինիստրատորի կողմից"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>-ի կողմից"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Աշխատանքային պրոֆիլը ջնջվել է"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Աշխատանքային պրոֆիլը ջնջվել է ադմինիստրատորի հավելվածի բացակայության պատճառով:"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 688a368..085939a 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Penyimpanan di ponsel penuh. Hapus sebagian file untuk mengosongkan ruang."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Jaringan mungkin dipantau"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Oleh pihak ketiga yang tidak dikenal"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Oleh administrator profil kantor"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Oleh <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Profil kerja dihapus"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Profil kerja dihapus karena tidak ada aplikasi admin."</string>
diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml
index 19fe2ea..2839911 100644
--- a/core/res/res/values-is-rIS/strings.xml
+++ b/core/res/res/values-is-rIS/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Geymslurými símans er fullt. Eyddu einhverjum skrám til að losa um pláss."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Hugsanlega er fylgst með netinu"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Af óþekktum þriðja aðila"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Af hálfu stjórnanda vinnusniðsins"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Af <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Vinnusniði eytt"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Vinnusniði eytt vegna þess að stjórnunarforrit vantar."</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 94e137e..e1f1d7c 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Spazio di archiviazione del telefono esaurito. Elimina alcuni file per liberare spazio."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"La rete potrebbe essere monitorata"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Da una terza parte sconosciuta"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Dall\'amministratore del profilo di lavoro"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Da <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Profilo di lavoro eliminato"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Profilo di lavoro eliminato per app di amministrazione mancante."</string>
@@ -211,8 +212,8 @@
<string name="permgroupdesc_messages" msgid="7821999071003699236">"Consentono di leggere e scrivere SMS, email e altri messaggi."</string>
<string name="permgrouplab_personalInfo" msgid="3519163141070533474">"Informazioni personali"</string>
<string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"Accesso diretto alle informazioni su di te memorizzate nella tua scheda di contatto."</string>
- <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"Tue informazioni sociali"</string>
- <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"Accesso diretto alle informazioni sui tuoi contatti e sulle tue connessioni sociali."</string>
+ <string name="permgrouplab_socialInfo" msgid="5799096623412043791">"Le tue informazioni social"</string>
+ <string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"Accesso diretto alle informazioni sui tuoi contatti e sulle tue connessioni social."</string>
<string name="permgrouplab_location" msgid="635149742436692049">"La tua posizione"</string>
<string name="permgroupdesc_location" msgid="5704679763124170100">"Monitoraggio della posizione fisica dell\'utente."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Comunicazione di rete"</string>
@@ -522,9 +523,9 @@
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Consente all\'applicazione di modificare o aggiungere informazioni ai dati del profilo personale memorizzati sul dispositivo, come il tuo nome e le tue informazioni di contatto. Significa che l\'applicazione può identificarti e inviare le informazioni del tuo profilo ad altri."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"sensori per il corpo (come il cardiofrequenzimetro)"</string>
<string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Consente all\'app di accedere ai dati relativi ai sensori che monitorano le tue condizioni fisiche, ad esempio la frequenza cardiaca."</string>
- <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"lettura del tuo stream sociale"</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"lettura del tuo stream social"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Consente all\'applicazione di accedere agli aggiornamenti dei social network tra te e i tuoi amici e di sincronizzarli. Fai attenzione quando condividi informazioni: questa autorizzazione consente all\'applicazione di leggere le comunicazioni tra te e i tuoi amici sui social network, indipendentemente dal livello di riservatezza. Nota. È possibile che questa autorizzazione non sia applicabile su tutti i social network."</string>
- <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"scrittura nel tuo stream sociale"</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"scrittura nel tuo stream social"</string>
<string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Consente all\'applicazione di visualizzare gli aggiornamenti dei social network dai tuoi amici. Fai attenzione quando condividi informazioni: questa autorizzazione consente all\'applicazione di produrre messaggi apparentemente provenienti da un amico. Nota. È possibile che questa autorizzazione non sia applicabile su tutti i social network."</string>
<string name="permlab_readCalendar" msgid="5972727560257612398">"lettura di eventi di calendario e di informazioni riservate"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Consente all\'applicazione di leggere tutti gli eventi di calendario memorizzati sul tablet, inclusi quelli di amici o colleghi. Ciò potrebbe consentire all\'applicazione di condividere o salvare i dati del tuo calendario, a prescindere dal livello di riservatezza o privacy."</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index f594806..196a774 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"שטח האחסון של הטלפון מלא. מחק חלק מהקבצים כדי לפנות שטח."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ייתכן שהרשת מנוטרת"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"על ידי צד שלישי לא מוכר"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"על ידי המנהל של פרופיל העבודה שלך"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"על ידי <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"פרופיל העבודה נמחק"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"פרופיל העבודה נמחק מפני שחסרה אפליקציית ניהול."</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 7c2007f..67b72d4 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"端末のストレージに空き領域がありません。ファイルを削除して空き領域を確保してください。"</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ネットワークが監視される場合があります"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"不明な第三者"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"ワークプロフィールの管理者によって監視される場合があります"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>によって監視される場合があります"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"ワークプロフィールが削除されました"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"管理アプリがないためワークプロフィールが削除されました。"</string>
diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml
index 3d64b497..9ab84bef4 100644
--- a/core/res/res/values-ka-rGE/strings.xml
+++ b/core/res/res/values-ka-rGE/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"ტელეფონის მეხსიერება გავსებულია. ადგილის გასათავისუფლებლად წაშალეთ ფაილების ნაწილი."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"შესაძლოა ქსელი მონიტორინგის ქვეშ იმყოფება"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"უცნობი მესამე მხარის მიერ"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"თქვენი სამუშაო პროფილის ადმინისტრატორი"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>-ის მიერ"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"სამუშაო პროფილი წაშლილია"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"სამუშაო პროფილი წაშლილია ადმინისტრატორის აპლიკაციის არ ქონის გამო."</string>
diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml
index 4f02741..255fedc 100644
--- a/core/res/res/values-kk-rKZ/strings.xml
+++ b/core/res/res/values-kk-rKZ/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Телефон жады толы. Орын босату үшін кейбір файлдарды жойыңыз."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Желі бақылауда болуы мүмкін"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Белгісіз үшінші жақ арқылы"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Жұмыс профилінің әкімшісі"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> арқылы"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Жұмыс профилі жойылды"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Басқару қолданбасы болмағандықтан жұмыс профилі жойылды."</string>
diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml
index a1d3e41..73ba8117 100644
--- a/core/res/res/values-km-rKH/strings.xml
+++ b/core/res/res/values-km-rKH/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"ឧបករណ៍ផ្ទុកទូរស័ព្ទពេញ! លុបឯកសារមួយចំនួនដើម្បីបង្កើនទំហំ។"</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"បណ្ដាញអាចត្រូវបានតាមដាន"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"ដោយភាគីទីបីដែលមិនស្គាល់"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"ដោយអ្នកគ្រប់គ្រងទម្រង់ការងាររបស់អ្នក។"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"ដោយ <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"ប្រវត្តិរូបការងារត្រូវបានលុប"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"ប្រវត្តិរូបការងារត្រូវបានលុបដោយសារបាត់បង់កម្មវិធីគ្រប់គ្រង។"</string>
diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml
index 9135a03..0d18fce 100644
--- a/core/res/res/values-kn-rIN/strings.xml
+++ b/core/res/res/values-kn-rIN/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"ಫೋನ್ ಸಂಗ್ರಹಣೆ ತಂಬಿದೆ. ಸ್ಥಳವನ್ನು ಖಾಲಿಯಾಗಿಸಲು ಕೆಲವು ಫೈಲ್ಗಳನ್ನು ಅಳಿಸಿ."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ನೆಟ್ವರ್ಕ್ ಅನ್ನು ವೀಕ್ಷಿಸಬಹುದಾಗಿರುತ್ತದೆ"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"ಅಜ್ಞಾತ ಮೂರನೇ ವ್ಯಕ್ತಿಯ ಪ್ರಕಾರ"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ನಿರ್ವಾಹಕರಿಂದ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> ಪ್ರಕಾರ"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಅಳಿಸಲಾಗಿದೆ"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"ತಪ್ಪಿಹೋಗಿರುವ ನಿರ್ವಾಹಕ ಅಪ್ಲಿಕೇಶನ್ನಿಂದಾಗಿ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಅಳಿಸಲಾಗಿದೆ."</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 74f82b2..c52c351 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"휴대전화 저장공간이 꽉 찼습니다. 일부 파일을 삭제하여 저장공간을 늘리세요."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"네트워크가 모니터링될 수 있음"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"알 수 없는 제3자의 모니터링"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"직장 프로필 관리자에 의해 모니터링될 수 있음"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>에서 모니터링"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"직장 프로필 삭제됨"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"관리 앱이 누락되어 직장 프로필이 삭제되었습니다."</string>
diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml
index a36881d..2b45690 100644
--- a/core/res/res/values-ky-rKG/strings.xml
+++ b/core/res/res/values-ky-rKG/strings.xml
@@ -239,6 +239,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Телефондун сактагычы толуп калды. Орун бошотуш үчүн кээ бир файлдарды өчүрүңүз."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Тармак тинтилиши мүмкүн"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Аныкталбаган үчүнчү тараптардан"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Жумушуңуздун профайл администратору тарабынан"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> тарабынан"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Жумуш профили жок кылынды"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Администратордун колдонмосу жок болгондуктан, жумуш профили жок кылынды."</string>
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index 40b7c6e..95809236 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"ພື້ນທີ່ໃນໂທລະສັບເຕັມແລ້ວ. ກະລຸນາລຶບບາງໄຟລ໌ອອກເພື່ອເພີ່ມພື້ນທີ່ຫວ່າງ."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ການນຳໃຊ້ເຄືອຂ່າຍອາດມີການກວດສອບຕິດຕາມ"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"ໂດຍບຸກຄົນທີສາມທີ່ບໍ່ຮູ້ຈັກ"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"ຕາມຜູ້ຄວບຄຸມໂປຣໄຟລ໌ວຽກຂອງທ່ານ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"ໂດຍ <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"ລຶບໂປຣໄຟລ໌ບ່ອນເຮັດວຽກແລ້ວ"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"ລຶບໂປຣໄຟລ໌ບ່ອນເຮັດວຽກແລ້ວ ເນື່ອງຈາກຂາດແອັບບໍລິຫານໄປ."</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 02a39f2..f22ddea 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Telefono atmintis pilna. Ištrinkite kai kuriuos failus, kad atlaisvintumėte vietos."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Tinklas gali būti stebimas"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Nežinoma trečioji šalis"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Darbo profilio administratorius"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Darbo profilis ištrintas"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Darbo profilis ištrintas dėl trūkstamos administratoriaus programos."</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 3b71454..1c1f0c5 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Tālruņa atmiņa ir pilna! Dzēsiet dažus failus, lai atbrīvotu vietu."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Iespējams, tīklā veiktās darbības tiek pārraudzītas."</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Nezināma trešā puse"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Tīklu uzrauga jūsu darba profila administrators."</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Domēns <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Darba profils izdzēsts"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Darba profils tika dzēsts, jo trūkst administratora lietotnes."</string>
diff --git a/core/res/res/values-mcc302-mnc220/config.xml b/core/res/res/values-mcc302-mnc220/config.xml
index b70e1b4..9147cbf 100644
--- a/core/res/res/values-mcc302-mnc220/config.xml
+++ b/core/res/res/values-mcc302-mnc220/config.xml
@@ -39,7 +39,6 @@
<string-array translatable="false" name="config_tether_apndata">
<item>[ApnSettingV3]TELUS ISP,isp.telus.com,,,,,,,,,302,220,,DUN,,,true,0,,,,,,,gid,54</item>
<item>[ApnSettingV3]Tethered PC Mobile,isp.mb.com,,,,,,,,,302,220,,DUN,,,true,0,,,,,,,gid,50</item>
- <item>[ApnSettingV3]Koodo,sp.koodo.com,,,,,,,,,302,220,,DUN,,,true,0,,,,,,,gid,4B</item>
</string-array>
</resources>
diff --git a/core/res/res/values-mcc311-mnc480/config.xml b/core/res/res/values-mcc311-mnc480/config.xml
index be68d57..56f8aa2 100755
--- a/core/res/res/values-mcc311-mnc480/config.xml
+++ b/core/res/res/values-mcc311-mnc480/config.xml
@@ -43,6 +43,9 @@
provisioning, availability etc -->
<bool name="config_carrier_volte_available">true</bool>
+ <!-- Flag specifying whether VoLTE availability is based on provisioning -->
+ <bool name="config_carrier_volte_provisioned">true</bool>
+
<bool name="config_auto_attach_data_on_creation">false</bool>
<!-- service number convert map in roaming network. -->
<string-array translatable="false" name="dial_string_replace">
diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml
index d876ea2..df4b13b 100644
--- a/core/res/res/values-mk-rMK/strings.xml
+++ b/core/res/res/values-mk-rMK/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Меморијата на телефонот е полна. Избришете некои датотеки за да ослободите простор."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Можеби мрежата се следи"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Од страна на непознато трето лице"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Од администраторот на вашиот работен профил"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Од <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Работниот профил е избришан"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Работниот профил е избришан заради отсуството на апликација на администратор."</string>
diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml
index 37bb7ae..b9bfa99 100644
--- a/core/res/res/values-ml-rIN/strings.xml
+++ b/core/res/res/values-ml-rIN/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"ഫോൺ സംഭരണം കഴിഞ്ഞു. ഇടം ശൂന്യമാക്കാൻ ചില ഫയലുകൾ ഇല്ലാതാക്കുക."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"നെറ്റ്വർക്ക് നിരീക്ഷിക്കപ്പെടാം"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"അജ്ഞാത മൂന്നാം കക്ഷി നിരീക്ഷിക്കാം"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ അഡ്മിനിസ്ട്രേറ്റർ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> നിരീക്ഷിക്കാം"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"ഔദ്യോഗിക പ്രൊഫൈൽ ഇല്ലാതാക്കി"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"അഡ്മിൻ അപ്ലിക്കേഷൻ നഷ്ടപ്പെട്ടതിനാൽ ഔദ്യോഗിക പ്രൊഫൈൽ ഇല്ലാതാക്കി."</string>
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
index c3df875..a14588d 100644
--- a/core/res/res/values-mn-rMN/strings.xml
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Утасны сан дүүрсэн. Зай чөлөөлөх бол зарим файлыг устгана уу."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Сүлжээ хянагдаж байж болзошгүй"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Тодорхойгүй гуравдагч талаас"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Таны ажлын мэдээллийн администратороос"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>-с"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Ажлын профайл устсан"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Зохицуулагч аппликейшн алга болсон учраас ажлын профайл устсан байна."</string>
diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml
index 3e5e8243..55daa3a 100644
--- a/core/res/res/values-mr-rIN/strings.xml
+++ b/core/res/res/values-mr-rIN/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"फोन संचयन पूर्ण भरले आहे. स्थान मोकळे करण्यासाठी काही फायली हटवा."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"नेटवर्कचे परीक्षण केले जाऊ शकते"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"एका अज्ञात तृतीय पक्षाद्वारे"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"आपल्या कार्य प्रोफाईल प्रशासकाकडून"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> द्वारे"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"कार्य प्रोफाईल हटविले"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"गहाळ प्रशासन अॅपमुळे कार्य प्रोफाईल हटविले."</string>
diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml
index b141932..7ec40c4 100644
--- a/core/res/res/values-ms-rMY/strings.xml
+++ b/core/res/res/values-ms-rMY/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Storan telefon penuh. Padamkan beberapa fail untuk mengosongkan ruang."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Rangkaian mungkin dipantau"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Oleh pihak ketiga yang tidak diketahui"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Oleh pentadbir profil kerja anda"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Oleh <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Profil kerja dipadam"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Profil kerja dipadam kerana apl pentadbir hilang."</string>
diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml
index 4e83825..70906d2 100644
--- a/core/res/res/values-my-rMM/strings.xml
+++ b/core/res/res/values-my-rMM/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"ဖုန်းတွင် သိမ်းဆည်းသော နေရာ ကုန်သွားပါပြီ။ တချို့ ဖိုင်များ ဖျက်စီးခြင်းဖြင့် နေရာလွတ် ပြုလုပ်ပါ"</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ကွန်ရက်ကို စောင့်ကြည့်စစ်ဆေးခံရနိုင်သည်"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"အမျိုးအမည်မသိ တတိယ ပါတီဖြင့်"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"သင့်အလုပ်ပရိုဖိုင် စီမံခန့်ခွဲသူမှ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> ဖြင့်"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"အလုပ်ပရိုဖိုင် ဖျက်ပြီးဖြစ်၏"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"အက်ဒမင် အပလီကေးရှင်း ပျောက်နေသောကြောင့် အလုပ်ပရိုဖိုင် ပျက်သွားသည်။"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 02a7925..4e9e38d2 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Telefonlageret er fullt. Slett noen filer for å frigjøre lagringsplass."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Nettverket blir muligens overvåket"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Av en ukjent tredjepart"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"av administratoren for jobbprofilen din"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Av <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Arbeidsprofilen er slettet"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Arbeidsprofilen er slettet på grunn av manglende admin-app."</string>
diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml
index f6d19a6..fb8e1c2 100644
--- a/core/res/res/values-ne-rNP/strings.xml
+++ b/core/res/res/values-ne-rNP/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"फोन भण्डारण भरिएको छ! ठाउँ खाली गर्नको लागि केही फाइलहरू मेटाउनुहोस्।"</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"सञ्जाल अनुगमित हुन सक्छ"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"अज्ञात तेस्रो पक्ष द्वारा"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"तपाईँको काम प्रोफाइल प्रशासक द्वारा"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> द्वारा"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"कार्य प्रोफाइल मेटियो"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"प्रशासन अनुप्रयोग हराएको कारण कार्य प्रोफाइल मेटियो।"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 5fe3c58..75f4a74 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Telefoongeheugen is vol. Verwijder enkele bestanden om ruimte vrij te maken."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Netwerk kan worden gecontroleerd"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Door een onbekende derde partij"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Door uw werkprofielbeheerder"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Door <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Werkprofiel verwijderd"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Werkprofiel verwijderd wegens ontbrekende beheerapp."</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index ffdf30a..2482b0a 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Pamięć telefonu jest pełna. Usuń niektóre pliki, aby zwolnić miejsce."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Sieć może być monitorowana"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Przez nieznany podmiot zewnętrzny"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Przez administratora Twojego profilu do pracy"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Przez <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Usunięto profil do pracy"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Profil do pracy został usunięty z powodu braku aplikacji administracyjnej."</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index d8cf208..40e9313 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"O armazenamento do telemóvel está cheio. Elimine alguns ficheiros para libertar espaço."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"A rede pode ser monitorizada"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Por um terceiro desconhecido"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Do administrador do seu perfil de trabalho"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Perfil de trabalho eliminado"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Perfil de trabalho eliminado devido a aplicação de administração em falta."</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index f753a9c..cd940a4 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"O armazenamento do telefone está cheio. Exclua alguns arquivos para liberar espaço."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"A rede pode ser monitorada"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Por terceiros desconhecidos"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Pelo seu perfil profissional de administrador"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Perfil de trabalho excluído"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Perfil de trabalho excluído devido à ausência de um app para administrador."</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index c882103..625f720 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Stocarea pe telefon este plină. Ștergeţi câteva fişiere pentru a elibera spaţiu."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Rețeaua poate fi monitorizată"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"De o terță parte necunoscută"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"De administratorul profilului de serviciu"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"De <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Profilul de serviciu a fost șters"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Profilul de serviciu a fost șters, deoarece aplicația de administrare lipsește."</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 1a3a7d5..a768aa9 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Память телефона заполнена. Удалите какие-нибудь файлы, чтобы освободить место."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Сеть может отслеживаться"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"администратором"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Администратор рабочего профиля может отслеживать сеть"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"администратором домена <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Рабочий профиль удален"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Рабочий профиль удален из-за отсутствия приложения Admin."</string>
diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml
index dc2c679..3cde8f6 100644
--- a/core/res/res/values-si-rLK/strings.xml
+++ b/core/res/res/values-si-rLK/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"දුරකථන ආචයනය පිරී ඇත. ඉඩ නිදහස් කිරීමට සමහර ගොනු මකන්න."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ඇතැම් විට ජාලය නිරීක්ෂණය විය හැක"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"නොදන්නා තෙවෙනි පාර්ශවයකින්"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"ඔබේ රාජකාරි පැතිකඩ පරිපාලක විසින්"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> වෙතින්"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"කාර්යාල පැතිකඩ මකා දමන ලදි"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"පරිපාලක යෙදුමක් නොමැති වීමෙන් කාර්යාල පැතිකඩ මකා දමන ලදි."</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index aca0725..4b56f04 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Pamäť telefónu je plná. Odstráňte niektoré súbory a uvoľnite miesto."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Sieť môže byť monitorovaná"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Neznámou treťou stranou"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Správcom vášho pracovného profilu"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Doménou <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Pracovný profil bol odstránený"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Pracovný profil bol odstránený z dôvodu chýbajúcej správcovskej aplikácie."</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index ac2e28e..dca7d4e 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Pomnilnik telefona je poln. Izbrišite nekaj datotek, da sprostite prostor."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Omrežje je lahko nadzorovano"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Neznana tretja oseba"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Skrbnik delovnega profila"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Nadzira: <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Delovni profil izbrisan"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Delovni profil izbrisan zaradi manjkajoče skrbniške aplikacije."</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 0c048ee..dc17c3f 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Складиште телефона је пуно! Избришите неке датотеке како бисте ослободили простор."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Мрежа се можда надгледа"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Од стране непознате треће стране"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Од стране администратора профила за посао"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Од стране <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Пословни профил је избрисан"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Пословни профил је избрисан јер недостаје администраторска апликација."</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index c45ce45..ad5c495 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Mobilens lagringsutrymme är fullt. Ta bort några filer för att frigöra utrymme."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Nätverket kan vara övervakat"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Av en okänd tredje part"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Av jobbprofilsadministratören"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Av <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Jobbprofilen har raderats"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Jobbprofilen har raderats eftersom det saknas en administratörsapp."</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 4376fca..2db8cd6 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Hifadhi ya simu imejaa. Futa baadhi ya faili ili uweze kupata nafasi."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Huenda mtandao unafuatiliwa"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Na mtu mwingine asiyejulikana"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Na msimamizi wa wasifu wako wa kazini"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Na <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Wasifu wa kazini umefutwa"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Wasifu wa kazini umefutwa kutokana na kupotea kwa programu ya msimamizi."</string>
diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml
index 57f7653..570671b 100644
--- a/core/res/res/values-ta-rIN/strings.xml
+++ b/core/res/res/values-ta-rIN/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"மொபைல் சேமிப்பிடம் நிரம்பியது. இடத்தைக் காலியாக்க சில கோப்புகளை அழிக்கவும்."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"பிணையம் கண்காணிக்கப்படலாம்"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"அறியப்படாத மூன்றாம் தரப்பினரின்படி"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"பணியிட சுயவிவர நிர்வாகி வழங்கியது"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> இன் படி"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"பணி சுயவிவரம் நீக்கப்பட்டது"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"நிர்வாகி பயன்பாடு இல்லாததனால், பணி சுயவிவரம் நீக்கப்பட்டது."</string>
diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml
index 21c71ca..9975c71 100644
--- a/core/res/res/values-te-rIN/strings.xml
+++ b/core/res/res/values-te-rIN/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"ఫోన్ నిల్వ నిండింది. స్థలాన్ని ఖాళీ చేయడానికి కొన్ని ఫైల్లను తొలగించండి."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"నెట్వర్క్ పర్యవేక్షించబడవచ్చు"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"తెలియని మూడవ పక్షం ద్వారా"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"మీ కార్యాలయ ప్రొఫైల్ నిర్వాహకుని ద్వారా"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> ద్వారా"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"కార్యాలయ ప్రొఫైల్ తొలగించబడింది"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"నిర్వాహక అనువర్తనం లేనందున కార్యాలయ ప్రొఫైల్ తొలగించబడింది."</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 271da41..f9bcd79 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"ที่เก็บข้อมูลโทรศัพท์เต็ม ลบบางไฟล์เพื่อเพิ่มที่ว่าง"</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"เครือข่ายอาจได้รับการตรวจสอบ"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"โดยบุคคลที่สามที่ไม่รู้จัก"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"โดยผู้ดูแลโปรไฟล์งานของคุณ"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"โดย <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"ลบโปรไฟล์งานแล้ว"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"ลบโปรไฟล์งานแล้วเนื่องจากไม่มีแอปผู้ดูแลระบบ"</string>
@@ -268,7 +269,7 @@
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"เข้าถึงการ์ด SD"</string>
<string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"คุณลักษณะการเข้าถึง"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"คุณลักษณะที่เทคโนโลยีความช่วยเหลือสามารถร้องขอได้"</string>
- <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"เรียกเนื้อหาหน้าต่าง"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"เรียกข้อมูลเนื้อหาของหน้าต่าง"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ตรวจสอบเนื้อหาของหน้าต่างที่คุณกำลังโต้ตอบอยู่"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"เปิด \"แตะเพื่อสำรวจ\""</string>
<string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"รายการที่แตะจะถูกพูดออกเสียง และการสำรวจหน้าจอสามารถทำได้ด้วยท่าทางสัมผัส"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 5614848..2364e29 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Puno na ang storage ng telepono. Magtanggal ng ilang file upang magbakante ng espasyo."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Maaaring sinusubaybayan ang network"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Ng isang di-kilalang third party"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Ng administrator sa iyong profile sa trabaho"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Ng <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Na-delete na ang profile sa trabaho"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Na-delete ang profile sa trabaho dahil wala itong admin app."</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 0e31d01..11fa69f 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Telefonun depolama alanı dolu! Yer açmak için bazı dosyaları silin."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Ağ izlenebilir"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Bunu, bilinmeyen üçüncü taraflar yapabilir"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"İş profili yöneticiniz tarafından"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> tarafından"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"İş profili silindi"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Eksik yönetici uygulaması nedeniyle iş profili silindi."</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index a3103e2..79281b3 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Пам’ять телефону заповнено. Видаліть якісь файли, щоб звільнити місце."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Мережа може відстежуватися"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Невідомою третьою стороною"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Дії в мережі відстежує адміністратор вашого робочого профілю"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Доменом <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Робочий профіль видалено"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Робочий профіль видалено через відсутність додатка адміністратора."</string>
diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml
index 40611ef..7f8a88e 100644
--- a/core/res/res/values-ur-rPK/strings.xml
+++ b/core/res/res/values-ur-rPK/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"فون اسٹوریج بھرا ہوا ہے۔ جگہ خالی کرنے کیلئے کچھ فائلیں حذف کریں۔"</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"نیٹ ورک کو مانیٹر کیا جا سکتا ہے"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"ایک نامعلوم فریق ثالث کے لحاظ سے"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"آپ کی دفتری پروفائل کے منتظم کے ذریعے"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> کے لحاظ سے"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"دفتری پروفائل حذف کر دیا گیا"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"گمشدہ منتظم ایپ کی وجہ سے دفتری پروفائل حذف کر دیا گیا۔"</string>
diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml
index a327dd3..306e4b2 100644
--- a/core/res/res/values-uz-rUZ/strings.xml
+++ b/core/res/res/values-uz-rUZ/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Telefon xotirasi to‘la. Joy bo‘shatish uchun ba’zi fayllarni o‘chiring."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Tarmoq nazorat ostida bo‘lishi mumkin"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Noma‘lum uchinchi shaxslar tomonidan"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Ishchi profilingiz administratori tomonidan"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> tomonidan"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Ichshi profil o‘chirildi"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Administrator ilovasi yo‘qligi sababli ishchi profil o‘chirib tashlandi"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 6524ece..e361bad 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Bộ nhớ điện thoại đã đầy. Hãy xóa một số tệp để tạo thêm dung lượng."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Mạng có thể được giám sát"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Bởi một bên thứ ba không xác định"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Bởi quản trị viên hồ sơ công việc của bạn"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Bởi <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Đã xóa hồ sơ công việc"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Đã xóa hồ sơ công việc do thiếu ứng dụng quản trị."</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index f54c4fa..ea54598 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"手机存储空间已满。请删除一些文件以腾出空间。"</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"网络可能会受到监控"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"受到不明第三方的监控"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"由您的工作资料管理员监控"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"受到 <xliff:g id="MANAGING_DOMAIN">%s</xliff:g> 监控"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"工作资料已删除"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"由于缺少管理应用,工作资料已被删除。"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index d3192c3..bb39491 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"手機的儲存空間已滿。請刪除一些檔案,以騰出可用空間。"</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"網絡可能會受到監控"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"由不明的第三方監管"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"由工作設定檔管理員監控"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"由 <xliff:g id="MANAGING_DOMAIN">%s</xliff:g> 監管"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"工作設定檔已被刪除"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"由於沒有管理員應用程式,工作設定檔已被刪除。"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 1422bcf..ae0f276 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"手機儲存空間已滿。請刪除一些檔案,以釋放可用空間。"</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"網路可能會受到監控"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"受到不明的第三方監控"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"受到您的 Work 設定檔管理員監控"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"受到 <xliff:g id="MANAGING_DOMAIN">%s</xliff:g> 監控"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Work 設定檔已遭刪除"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Work 設定檔因管理員應用程式遺失而遭到刪除。"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index a0a60c6..1222904 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -156,6 +156,7 @@
<string name="low_memory" product="default" msgid="3475999286680000541">"Isilondolozi sefoni sigcwele! Susa amanye amafayela ukukhulula isikhala."</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Inethiwekhi ingase inganyelwe"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Ngenkampani yangaphandle engaziwa"</string>
+ <string name="ssl_ca_cert_noti_by_administrator" msgid="550758088185764312">"Ngomlawuli wephrofayela yakho yokusebenza"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Nge-<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
<string name="work_profile_deleted" msgid="5005572078641980632">"Iphrofayela yomsebenzi isusiwe"</string>
<string name="work_profile_deleted_description" msgid="6305147513054341102">"Iphrofayela yomsebenzi isusiwe ngenxa yohlelo lokusebenza lomlawuli elingekho."</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 1ef68a4..52cf8c1 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -4163,6 +4163,28 @@
<attr name="drawableEnd" format="reference|color" />
<!-- The padding between the drawables and the text. -->
<attr name="drawablePadding" format="dimension" />
+ <!-- Tint to apply to the compound (left, top, etc.) drawables. -->
+ <attr name="drawableTint" format="color" />
+ <!-- Blending mode used to apply the compound (left, top, etc.) drawables tint. -->
+ <attr name="drawableTintMode">
+ <!-- The tint is drawn on top of the drawable.
+ [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc] -->
+ <enum name="src_over" value="3" />
+ <!-- The tint is masked by the alpha channel of the drawable. The drawable’s
+ color channels are thrown out. [Sa * Da, Sc * Da] -->
+ <enum name="src_in" value="5" />
+ <!-- The tint is drawn above the drawable, but with the drawable’s alpha
+ channel masking the result. [Da, Sc * Da + (1 - Sa) * Dc] -->
+ <enum name="src_atop" value="9" />
+ <!-- Multiplies the color and alpha channels of the drawable with those of
+ the tint. [Sa * Da, Sc * Dc] -->
+ <enum name="multiply" value="14" />
+ <!-- [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] -->
+ <enum name="screen" value="15" />
+ <!-- Combines the tint and drawable color and alpha channels, clamping the
+ result to valid color values. Saturate(S + D) -->
+ <enum name="add" value="16" />
+ </attr>
<!-- Extra spacing between lines of text. -->
<attr name="lineSpacingExtra" format="dimension" />
<!-- Extra spacing between lines of text, as a multiplier. -->
@@ -4434,10 +4456,8 @@
<attr name="yearListSelectorColor" format="color" />
<!-- The text color list of the calendar. -->
<attr name="calendarTextColor" format="color" />
- <!-- @hide The selected text color for the calendar. Used as a backup
- if the text color does not explicitly have a color set for the
- selected state. -->
- <attr name="calendarSelectedTextColor" format="color" />
+ <!-- @hide The activated background color for the calendar. -->
+ <attr name="calendarDayBackgroundColor" format="color" />
<!-- Defines the look of the widget. Prior to the L release, the only choice was
spinner. As of L, with the Material theme selected, the default layout is calendar,
but this attribute can be used to force spinner to be used instead. -->
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index ae76984..4c95ed5 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -384,7 +384,6 @@
<dimen name="datepicker_month_label_size">14sp</dimen>
<dimen name="datepicker_month_day_label_text_size">12sp</dimen>
<dimen name="datepicker_month_list_item_header_height">48dp</dimen>
- <dimen name="datepicker_day_number_select_circle_radius">16dp</dimen>
<dimen name="datepicker_view_animator_height">244dp</dimen>
<dimen name="datepicker_year_picker_padding_top">8dp</dimen>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index c7b5615..dbf2b4d 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2594,6 +2594,8 @@
<public type="attr" name="dialogPreferredPadding" id="0x010104d3" />
<public type="attr" name="searchHintIcon" id="0x010104d4" />
<public type="attr" name="revisionCode" />
+ <public type="attr" name="drawableTint" />
+ <public type="attr" name="drawableTintMode" />
<public type="style" name="Theme.DeviceDefault.Dialog.Alert" />
<public type="style" name="Theme.DeviceDefault.Light.Dialog.Alert" />
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 2ce2e05..f51e82c9 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -333,11 +333,15 @@
device. Indicates to the user that SSL traffic can be intercepted. [CHAR LIMIT=NONE] -->
<string name="ssl_ca_cert_warning">Network may be monitored</string>
<!-- Content text for a notification. The Title of the notification is "ssl_ca_cert_warning",
- i.e. "Network may be monitored". This says that an unknown party is doing the monitoring.
+ i.e. "Network may be monitored". This says that an unknown party is doing the monitoring.
[CHAR LIMIT=100]-->
<string name="ssl_ca_cert_noti_by_unknown">By an unknown third party</string>
<!-- Content text for a notification. The Title of the notification is "ssl_ca_cert_warning",
- i.e. "Network may be monitored". This indicates who is doing the monitoring.
+ i.e. "Network may be monitored". This indicates that an unspecified administrator is doing
+ the monitoring. [CHAR LIMIT=100]-->
+ <string name="ssl_ca_cert_noti_by_administrator">By your work profile administrator</string>
+ <!-- Content text for a notification. The Title of the notification is "ssl_ca_cert_warning",
+ i.e. "Network may be monitored". This indicates who is doing the monitoring.
[CHAR LIMIT=100]-->
<string name="ssl_ca_cert_noti_managed">By <xliff:g id="managing_domain">%s</xliff:g></string>
diff --git a/core/res/res/values/styles_holo.xml b/core/res/res/values/styles_holo.xml
index 41b8b25..4589fa3 100644
--- a/core/res/res/values/styles_holo.xml
+++ b/core/res/res/values/styles_holo.xml
@@ -496,7 +496,7 @@
<item name="yearListItemTextAppearance">@style/TextAppearance.Holo.DatePicker.List.YearLabel</item>
<item name="yearListSelectorColor">@color/datepicker_default_circle_background_color_holo_dark</item>
<item name="calendarTextColor">@color/date_picker_calendar_holo_dark</item>
- <item name="calendarSelectedTextColor">@color/holo_blue_light</item>
+ <item name="calendarDayBackgroundColor">@color/holo_blue_dark</item>
</style>
<style name="Widget.Holo.ActivityChooserView" parent="Widget.ActivityChooserView" />
@@ -921,7 +921,7 @@
<item name="yearListItemTextAppearance">@style/TextAppearance.Holo.Light.DatePicker.List.YearLabel</item>
<item name="yearListSelectorColor">@color/datepicker_default_circle_background_color_holo_light</item>
<item name="calendarTextColor">@color/date_picker_calendar_holo_light</item>
- <item name="calendarSelectedTextColor">@color/holo_blue_light</item>
+ <item name="calendarDayBackgroundColor">@color/holo_blue_light</item>
</style>
<style name="Widget.Holo.Light.ActivityChooserView" parent="Widget.Holo.ActivityChooserView">
diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml
index 4f8c31d..8632673 100644
--- a/core/res/res/values/styles_material.xml
+++ b/core/res/res/values/styles_material.xml
@@ -395,24 +395,24 @@
<style name="TextAppearance.Material.DatePicker.MonthLabel" parent="TextAppearance.Material">
<item name="includeFontPadding">false</item>
- <item name="textColor">?attr/textColorSecondaryInverse</item> <!-- selected should be accent -->
+ <item name="textColor">?attr/textColorSecondaryInverse</item>
<item name="textSize">@dimen/datepicker_selected_date_month_size</item>
</style>
<style name="TextAppearance.Material.DatePicker.DayOfMonthLabel" parent="TextAppearance.Material">
<item name="includeFontPadding">false</item>
- <item name="textColor">?attr/textColorSecondaryInverse</item> <!-- selected should be accent -->
+ <item name="textColor">?attr/textColorSecondaryInverse</item>
<item name="textSize">@dimen/datepicker_selected_date_day_size</item>
</style>
<style name="TextAppearance.Material.DatePicker.YearLabel" parent="TextAppearance.Material">
<item name="includeFontPadding">false</item>
- <item name="textColor">?attr/textColorSecondaryInverse</item> <!-- selected should be accent -->
+ <item name="textColor">?attr/textColorSecondaryInverse</item>
<item name="textSize">@dimen/datepicker_selected_date_year_size</item>
</style>
<style name="TextAppearance.Material.DatePicker.List.YearLabel" parent="TextAppearance.Material">
- <item name="textColor">?attr/textColorSecondary</item> <!-- selected should be accent -->
+ <item name="textColor">?attr/textColorSecondaryActivated</item>
<item name="textSize">@dimen/datepicker_year_label_text_size</item>
</style>
@@ -675,8 +675,8 @@
<item name="headerBackground">?attr/colorAccent</item>
<item name="yearListItemTextAppearance">@style/TextAppearance.Material.DatePicker.List.YearLabel</item>
<item name="yearListSelectorColor">?attr/colorControlActivated</item>
- <item name="calendarTextColor">?attr/textColorSecondary</item>
- <item name="calendarSelectedTextColor">?attr/colorControlActivated</item>
+ <item name="calendarTextColor">?attr/textColorSecondaryActivated</item>
+ <item name="calendarDayBackgroundColor">?attr/colorControlActivated</item>
</style>
<style name="Widget.Material.ActivityChooserView" parent="Widget.ActivityChooserView">
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 2432296..77d9345 100755
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1044,6 +1044,7 @@
<java-symbol type="string" name="write_fail_reason_cancelled" />
<java-symbol type="string" name="write_fail_reason_cannot_write" />
<java-symbol type="string" name="ssl_ca_cert_noti_by_unknown" />
+ <java-symbol type="string" name="ssl_ca_cert_noti_by_administrator" />
<java-symbol type="string" name="ssl_ca_cert_noti_managed" />
<java-symbol type="string" name="ssl_ca_cert_warning" />
<java-symbol type="string" name="work_profile_deleted" />
@@ -2042,7 +2043,6 @@
<java-symbol type="dimen" name="datepicker_month_label_size" />
<java-symbol type="dimen" name="datepicker_month_day_label_text_size" />
<java-symbol type="dimen" name="datepicker_month_list_item_header_height" />
- <java-symbol type="dimen" name="datepicker_day_number_select_circle_radius" />
<java-symbol type="dimen" name="datepicker_view_animator_height" />
<java-symbol type="dimen" name="datepicker_year_label_height" />
<java-symbol type="dimen" name="datepicker_year_picker_padding_top" />
diff --git a/core/tests/coretests/src/android/net/http/HttpResponseCacheTest.java b/core/tests/coretests/src/android/net/http/HttpResponseCacheTest.java
index 9015a6f..0421d44 100644
--- a/core/tests/coretests/src/android/net/http/HttpResponseCacheTest.java
+++ b/core/tests/coretests/src/android/net/http/HttpResponseCacheTest.java
@@ -19,6 +19,7 @@
import com.google.mockwebserver.MockResponse;
import com.google.mockwebserver.MockWebServer;
import java.io.File;
+import java.io.InputStream;
import java.net.CacheRequest;
import java.net.CacheResponse;
import java.net.ResponseCache;
@@ -118,7 +119,10 @@
server.play();
URLConnection c1 = server.getUrl("/").openConnection();
- assertEquals('A', c1.getInputStream().read());
+ InputStream inputStream1 = c1.getInputStream();
+ assertEquals('A', inputStream1.read());
+ inputStream1.close();
+
assertEquals(1, cache.getRequestCount());
assertEquals(1, cache.getNetworkCount());
assertEquals(0, cache.getHitCount());
diff --git a/docs/html-intl/intl/ja/training/tv/playback/browse.jd b/docs/html-intl/intl/ja/training/tv/playback/browse.jd
new file mode 100755
index 0000000..f2261e1
--- /dev/null
+++ b/docs/html-intl/intl/ja/training/tv/playback/browse.jd
@@ -0,0 +1,194 @@
+page.title=カタログ ブラウザを作成する
+page.tags=tv, browsefragment, presenter, backgroundmanager
+
+trainingnavtop=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>学習の目的</h2>
+ <ol>
+ <li><a href="#layout">メディア ブラウズ レイアウトを作成する</a></li>
+ <li><a href="#lists">メディア リストを表示する</a></li>
+ <li><a href="#background">背景をアップデートする</a></li>
+ </ol>
+
+</div>
+</div>
+
+<p>
+ TV で使用するメディア アプリでは、ユーザーがコンテンツ内容をブラウズして選び、再生を開始できるようにする必要があります。このタイプのアプリのコンテンツ ブラウジングに関するユーザー エクスペリエンスは、シンプルで直感的、そして目を楽しませる魅力的なものである必要があります。
+</p>
+
+<p>
+ このレッスンでは、<a href="{@docRoot}tools/support-library/features.html#v17-leanback">v17 leanback サポート ライブラリ</a> が提供するクラスを使用して、アプリのメディア カタログから音楽やビデオを閲覧するためのユーザー インターフェースを実装する方法を説明します。
+</p>
+
+
+<h2 id="layout">メディア ブラウズ レイアウトを作成する</h2>
+
+<p>
+ leanback サポート ライブラリの {@link android.support.v17.leanback.app.BrowseFragment} クラスを使用すると、最小限のコードでブラウジング カテゴリのプライマリ レイアウトとメディア アイテムの行を作成できます。次の例では、{@link android.support.v17.leanback.app.BrowseFragment} を含むレイアウトの作成方法を示します。
+</p>
+
+<pre>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ >
+
+ <fragment
+ <strong>android:name="android.support.v17.leanback.app.BrowseFragment"</strong>
+ android:id="@+id/browse_fragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ />
+</LinearLayout>
+</pre>
+
+<p>
+ アクティビティ内でこのレイアウトを使用して作業するには、レイアウトから{@link android.support.v17.leanback.app.BrowseFragment} エレメントを取得します。このクラスのメソッドを使用して、アイコン、タイトル、カテゴリ ヘッダーが有効になっているかどうかなどの表示パラメータを設定します。次のコード サンプルでは、レイアウト内で {@link android.support.v17.leanback.app.BrowseFragment} のレイアウト パラメータの設定方法を示します。
+</p>
+
+<pre>
+public class BrowseMediaActivity extends Activity {
+
+ public static final String TAG ="BrowseActivity";
+
+ protected BrowseFragment mBrowseFragment;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.browse_fragment);
+
+ final FragmentManager fragmentManager = getFragmentManager();
+ <strong>mBrowseFragment = (BrowseFragment) fragmentManager.findFragmentById(
+ R.id.browse_fragment);</strong>
+
+ // Set display parameters for the BrowseFragment
+ mBrowseFragment.setHeadersState(BrowseFragment.HEADERS_ENABLED);
+ mBrowseFragment.setTitle(getString(R.string.app_name));
+ mBrowseFragment.setBadgeDrawable(getResources().getDrawable(
+ R.drawable.ic_launcher));
+ mBrowseFragment.setBrowseParams(params);
+
+ }
+}
+</pre>
+
+
+<h2 id="lists">メディア リストを表示する</h2>
+
+<p>
+ {@link android.support.v17.leanback.app.BrowseFragment} ではアダプタとプレゼンターを使用して、ブラウズ可能なメディア コンテンツのカテゴリや、メディア カタログのメディア アイテムを定義したり、表示したりできます。アダプタを使用すると、メディア カタログ情報が含まれているローカルやオンラインのデータ ソースに接続できます。プレゼンターは、メディア アイテムに関するデータを保持し、スクリーンにアイテムを表示する際のレイアウト情報を提供します。
+</p>
+
+<p>
+ 次のコード例では、文字列データを表示する際の{@link android.support.v17.leanback.widget.Presenter} の実装について示します。
+</p>
+
+<pre>
+public class StringPresenter extends Presenter {
+ private static final String TAG = "StringPresenter";
+
+ public ViewHolder onCreateViewHolder(ViewGroup parent) {
+ TextView textView = new TextView(parent.getContext());
+ textView.setFocusable(true);
+ textView.setFocusableInTouchMode(true);
+ textView.setBackground(
+ parent.getContext().getResources().getDrawable(R.drawable.text_bg));
+ return new ViewHolder(textView);
+ }
+
+ public void onBindViewHolder(ViewHolder viewHolder, Object item) {
+ ((TextView) viewHolder.view).setText(item.toString());
+ }
+
+ public void onUnbindViewHolder(ViewHolder viewHolder) {
+ // no op
+ }
+}
+</pre>
+
+<p>
+ メディア アイテムのプレゼンター クラスを構築したら、アダプタをビルドしたり、{@link android.support.v17.leanback.app.BrowseFragment} にアタッチしたりして、ユーザーのブラウジング用にスクリーン上にそれらのアイテムを表示させることができます。次のコード例では、1 つ前のコード例に示したように、{@code StringPresenter} クラスを使用して、カテゴリ内にカテゴリとアイテムを表示するためのアダプタの構築方法を示します。
+</p>
+
+<pre>
+private ArrayObjectAdapter mRowsAdapter;
+private static final int NUM_ROWS = 4;
+
+@Override
+protected void onCreate(Bundle savedInstanceState) {
+ ...
+
+ buildRowsAdapter();
+}
+
+private void buildRowsAdapter() {
+ mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
+
+ for (int i = 0; i < NUM_ROWS; ++i) {
+ ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(
+ new StringPresenter());
+ listRowAdapter.add("Media Item 1");
+ listRowAdapter.add("Media Item 2");
+ listRowAdapter.add("Media Item 3");
+ HeaderItem header = new HeaderItem(i, "Category " + i, null);
+ mRowsAdapter.add(new ListRow(header, listRowAdapter));
+ }
+
+ mBrowseFragment.setAdapter(mRowsAdapter);
+}
+</pre>
+
+<p>
+ この例では、アダプタの静的実装を示します。一般的なメディア ブラウジング アプリは、オンライン データベースやウェブ サービスのデータを使用します。ウェブから取得したデータを使用したブラウジング アプリの例については、<a href="http://github.com/googlesamples/androidtv-leanback">Android TV</a> のサンプル アプリを参照してください。
+</p>
+
+<h2 id="background">背景をアップデートする</h2>
+
+<p>
+ TV で使用されるメディア ブラウジング アプリを目立たせるために、ユーザーがコンテンツをブラウジングしている間の背景イメージをアップデートできます。これにより、アプリの使用がユーザーにとって、より動きのある楽しいものになります。
+</p>
+
+<p>
+ Leanback サポート ライブラリは、TV アプリのアクティビティの背景を変更するための {@link android.support.v17.leanback.app.BackgroundManager} クラスを提供しています。次の例では、TV アプリのアクティビティ内の背景をアップデートする簡単なメソッドの作成方法を示します。
+</p>
+
+<pre>
+protected void updateBackground(Drawable drawable) {
+ BackgroundManager.getInstance(this).setDrawable(drawable);
+}
+</pre>
+
+<p>
+ ほとんどの既存のメディア ブラウズ アプリでは、ユーザーがメディア リストをスクロールするのに合わせて自動的に背景がアップデートされます。これを行うには選択リスナを設定して、ユーザーの現在の選択に基づいて自動的に背景をアップデートできるようにします。次の例では、{@link android.support.v17.leanback.widget.OnItemViewSelectedListener} クラスをセットアップして、選択イベントの判別後に背景をアップデートする方法を示します。
+</p>
+
+<pre>
+protected void clearBackground() {
+ BackgroundManager.getInstance(this).setDrawable(mDefaultBackground);
+}
+
+protected OnItemViewSelectedListener getDefaultItemViewSelectedListener() {
+ return new OnItemViewSelectedListener() {
+ @Override
+ public void onItemSelected(Object item, Row row) {
+ if (item instanceof Movie ) {
+ URI uri = ((Movie)item).getBackdropURI();
+ updateBackground(uri);
+ } else {
+ clearBackground();
+ }
+ }
+ };
+}
+</pre>
+
+<p class="note">
+ <strong>注意:</strong>上記の実装例はわかりやすく示すため、実際よりも単純化されています。実際にアプリでこの機能を作成する際は、パフォーマンス向上のために、別のスレッドで背景のアップデート アクションを実行するようにしてください。また、ユーザーがアイテムをスクロールする動作に合わせて背景をアップデートする場合には、ユーザーが 1 つのアイテムに落ち着くまで、背景イメージのアップデートを遅らせる時間を追加することも検討してください。これにより、背景イメージのアップデートが過剰にならないようにします。
+</p>
diff --git a/docs/html-intl/intl/ja/training/tv/playback/details.jd b/docs/html-intl/intl/ja/training/tv/playback/details.jd
new file mode 100755
index 0000000..8e6d28f
--- /dev/null
+++ b/docs/html-intl/intl/ja/training/tv/playback/details.jd
@@ -0,0 +1,210 @@
+page.title=詳細ビューをビルドする
+page.tags=tv, detailsfragment
+
+trainingnavtop=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>学習の目的</h2>
+ <ol>
+ <li><a href="#details-presenter">詳細プレゼンターをビルドする</a></li>
+ <li><a href="#details-fragment">詳細フラグメントを拡張する</a>
+ <li><a href="#activity">詳細アクティビティを作成する</a></li>
+ <li><a href="#item-listener">クリックされたアイテムのリスナを定義する</a></li>
+ </ol>
+</div>
+</div>
+
+<p>
+ <a href="{@docRoot}tools/support-library/features.html#v17-leanback">v17 leanback サポート ライブラリ</a> が提供するメディア ブラウジング インターフェース クラスには、説明やレビューなどのメディア アイテムに関する追加情報を表示したり、アイテムの購入やコンテンツの再生など、アイテムに対するアクションを取ったりするためのクラスが含まれます。
+</p>
+
+<p>
+ このレッスンでは、メディア アイテムの詳細に関するプレゼンター クラスを作成したり、{@link android.support.v17.leanback.app.DetailsFragment} クラスを拡張して、ユーザーがメディア アイテムを選択した場合に表示する詳細ビューを実装したりする方法を説明します。
+</p>
+
+<p class="note">
+ <strong>注意:</strong>次の実装例では、追加的なアクティビティを使用して {@link android.support.v17.leanback.app.DetailsFragment} を含めています。ただし、フラグメント トランザクションを使用すると、現在の {@link android.support.v17.leanback.app.BrowseFragment} を<em>同じ</em>アクティビティにある {@link android.support.v17.leanback.app.DetailsFragment} で置き換えることにより、2 つ目のアクティビティの作成を回避できます。フラグメント トランザクションの使用については、<a href="{@docRoot}training/basics/fragments/fragment-ui.html#Replace">フラグメントを使用したダイナミックな UI のビルド</a>を参照してください。
+</p>
+
+
+<h2 id="details-presenter">詳細プレゼンターをビルドする</h2>
+
+<p>
+ Leanback ライブラリが提供するメディア ブラウジングのフレームワークでは、プレゼンター オブジェクトを使用して、メディア アイテムの詳細を含むスクリーン上のデータ表示を制御します。このメディア アイテムの詳細に関するプレゼンターのほぼ完全な実装を目的に、フレームワークでは{@link android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter} クラスを提供しています。これにより、次のコード サンプルのように、{@link android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter#onBindDescription onBindDescription()} メソッドを実装して、ビュー フィールドをデータ オブジェクトにバインドするだけでよくなります。
+</p>
+
+<pre>
+public class DetailsDescriptionPresenter
+ extends AbstractDetailsDescriptionPresenter {
+
+ @Override
+ protected void onBindDescription(ViewHolder viewHolder, Object itemData) {
+ MyMediaItemDetails details = (MyMediaItemDetails) itemData;
+ // In a production app, the itemData object contains the information
+ // needed to display details for the media item:
+ // viewHolder.getTitle().setText(details.getShortTitle());
+
+ // Here we provide static data for testing purposes:
+ viewHolder.getTitle().setText(itemData.toString());
+ viewHolder.getSubtitle().setText("2014 Drama TV-14");
+ viewHolder.getBody().setText("Lorem ipsum dolor sit amet, consectetur "
+ + "adipisicing elit, sed do eiusmod tempor incididunt ut labore "
+ + " et dolore magna aliqua. Ut enim ad minim veniam, quis "
+ + "nostrud exercitation ullamco laboris nisi ut aliquip ex ea "
+ + "commodo consequat.");
+ }
+}
+</pre>
+
+
+<h2 id="details-fragment">詳細フラグメントを拡張する</h2>
+
+<p>
+ メディア アイテムの詳細を表示するために {@link android.support.v17.leanback.app.DetailsFragment} クラスを使用する場合、そのクラスを拡張すると、メディア アイテムのプレビュー画像やアクションなどの追加コンテンツを提供できます。関連するメディア アイテムのリストといった追加コンテンツも提供できます。
+</p>
+
+<p>
+ 次のコード例では、前のセクションで説明したプレゼンター クラスを使用して、表示中のメディア アイテムのプレビュー画像やアクションを追加する方法を示しています。この例では、詳細リストの下に表示される関連するメディア アイテムの行も追加しています。
+</p>
+
+<pre>
+public class MediaItemDetailsFragment extends DetailsFragment {
+ private static final String TAG = "MediaItemDetailsFragment";
+ private ArrayObjectAdapter mRowsAdapter;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ Log.i(TAG, "onCreate");
+ super.onCreate(savedInstanceState);
+
+ buildDetails();
+ }
+
+ private void buildDetails() {
+ ClassPresenterSelector selector = new ClassPresenterSelector();
+ // Attach your media item details presenter to the row presenter:
+ DetailsOverviewRowPresenter rowPresenter =
+ new DetailsOverviewRowPresenter(new DetailsDescriptionPresenter());
+
+ selector.addClassPresenter(DetailsOverviewRow.class, rowPresenter);
+ selector.addClassPresenter(ListRow.class,
+ new ListRowPresenter());
+ mRowsAdapter = new ArrayObjectAdapter(selector);
+
+ Resources res = getActivity().getResources();
+ DetailsOverviewRow detailsOverview = new DetailsOverviewRow(
+ "Media Item Details");
+
+ // Add images and action buttons to the details view
+ detailsOverview.setImageDrawable(res.getDrawable(R.drawable.jelly_beans));
+ detailsOverview.addAction(new Action(1, "Buy $9.99"));
+ detailsOverview.addAction(new Action(2, "Rent $2.99"));
+ mRowsAdapter.add(detailsOverview);
+
+ // Add a Related items row
+ ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(
+ new StringPresenter());
+ listRowAdapter.add("Media Item 1");
+ listRowAdapter.add("Media Item 2");
+ listRowAdapter.add("Media Item 3");
+ HeaderItem header = new HeaderItem(0, "Related Items", null);
+ mRowsAdapter.add(new ListRow(header, listRowAdapter));
+
+ setAdapter(mRowsAdapter);
+ }
+}
+</pre>
+
+
+<h3 id="activity">詳細アクティビティを作成する</h3>
+
+<p>
+ {@link android.support.v17.leanback.app.DetailsFragment} のようなフラグメントを表示に使用するには、これをアクティビティ内に含める必要があります。ブラウズ アクティビティとは別に、詳細ビューのアクティビティを作成すると、{@link android.content.Intent} を使用して詳細ビューを呼び出すことができます。このセクションでは、メディア アイテムの詳細ビューの実装を含んだアクティビティのビルド方法を説明します。
+</p>
+
+<p>
+ 次のように {@link android.support.v17.leanback.app.DetailsFragment} の実装を参照するレイアウトをビルドして、詳細アクティビティの作成を開始します。
+</p>
+
+<pre>
+<!-- file: res/layout/details.xml -->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+ <strong>android:name="com.example.android.mediabrowser.MediaItemDetailsFragment"</strong>
+ android:id="@+id/details_fragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+/>
+</pre>
+
+<p>
+ 次に、前述のコード例のレイアウトを使用して、アクティビティ クラスを作成します。
+</p>
+
+<pre>
+public class DetailsActivity extends Activity
+{
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ <strong>setContentView(R.layout.details);</strong>
+ }
+}
+</pre>
+
+<p>
+ 最後に、この新しいアクティビティをマニフェストに追加します。次のように、ユーザー インターフェースがメディア ブラウズ アクティビティと一致するように、Leanback テーマを適用します。
+</p>
+
+<pre>
+<application>
+ ...
+
+ <activity android:name=".DetailsActivity"
+ android:exported="true"
+ <strong>android:theme="@style/Theme.Leanback"/></strong>
+
+</application>
+</pre>
+
+
+<h3 id="item-listener">クリックされたアイテムのリスナを定義する</h3>
+
+<p>
+ {@link android.support.v17.leanback.app.DetailsFragment} の実装後、メインのメディア ブラウジング ビューを編集して、ユーザーがメディア アイテムをクリックしたときに詳細ビューに移動するようにします。この動作を有効にするには、 {@link android.support.v17.leanback.widget.OnItemViewClickedListener} オブジェクトを、アイテム詳細アクティビティを起動するインテントの起動元の {@link android.support.v17.leanback.app.BrowseFragment} に追加します。
+</p>
+
+<p>
+ 次の例では、ユーザーがメインのメディア ブラウジング アクティビティのメディア アイテムをクリックしたときに、詳細ビューを起動するリスナの実装方法を示しています。
+</p>
+
+<pre>
+public class BrowseMediaActivity extends Activity {
+ ...
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ ...
+
+ // create the media item rows
+ buildRowsAdapter();
+
+ // add a listener for selected items
+ mBrowseFragment.OnItemViewClickedListener(
+ new OnItemViewClickedListener() {
+ @Override
+ public void onItemClicked(Object item, Row row) {
+ System.out.println("Media Item clicked: " + item.toString());
+ Intent intent = new Intent(BrowseMediaActivity.this,
+ DetailsActivity.class);
+ // pass the item information
+ intent.getExtras().putLong("id", item.getId());
+ startActivity(intent);
+ }
+ });
+ }
+}
+</pre>
diff --git a/docs/html-intl/intl/ja/training/tv/playback/index.jd b/docs/html-intl/intl/ja/training/tv/playback/index.jd
new file mode 100755
index 0000000..55d2b66
--- /dev/null
+++ b/docs/html-intl/intl/ja/training/tv/playback/index.jd
@@ -0,0 +1,42 @@
+page.title=TV 再生アプリのビルド
+page.tags=tv, leanback
+
+startpage=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>依存関係と前提条件</h2>
+ <ul>
+ <li>Android 5.0(API レベル 21)以降</li>
+ </ul>
+ <h2>関連コンテンツ</h2>
+ <ul>
+ <li><a href="{@docRoot}design/tv/index.html">TV 向けデザインとは</a></li>
+ </ul>
+</div>
+</div>
+
+<p>
+ メディア ファイルのブラウジングと再生は、TV アプリが提供するユーザー エクスペリエンスによって左右される部分が多くあります。ゼロから開始して、高速でなめらかな魅力あるユーザー エクスペリエンスを確実にビルドすることは、非常に困難な場合があります。アプリの露出するメディア カタログが、小規模か大規模かにかかわらず、ユーザーが簡単にオプションをブラウジングでき、希望のコンテンツに辿りつけるようにすることが重要です。
+</p>
+
+<p>
+ Android のフレームワークでは、<a href="{@docRoot}tools/support-library/features.html#v17-leanback">v17 leanback サポート ライブラリ</a>を使用して TV アプリのユーザー インターフェースをビルドするためのクラスを提供します。このライブラリは、最小限のコーディングで、メディア ファイルのブラウジングと再生用の効率的で親しみやすいインターフェースを作成するためのクラスのフレームワークを提供します。クラスは拡張やカスタマイズができるように設計されており、アプリ独自のユーザー エクスペリエンスを作成できます。
+</p>
+
+<p>このクラスでは、TV 向けの Leanback サポート ライブラリを使用して、メディア コンテンツブをラウジングしたり再生したりする TV アプリのビルド方法を説明します。</p>
+
+<h2>トピック</h2>
+
+<dl>
+ <dt><b><a href="browse.html">カタログ ブラウザを作成する</a></b></dt>
+ <dd>Leanback サポート ライブラリを使用して、メディア カタログのブラウジング インターフェースをビルドする方法を説明します。</dd>
+
+ <dt><b><a href="details.html">詳細ビューをビルドする</a></b></dt>
+ <dd>Leanback サポート ライブラリを使用して、メディア アイテムの詳細ページをビルドする方法を説明します。</dd>
+
+ <dt><b><a href="now-playing.html">再生中カードを表示する</a></b></dt>
+ <dd>MediaSession を使用して、「再生中」カードをホーム スクリーンに表示する方法を説明します。</dd>
+</dl>
diff --git a/docs/html-intl/intl/ja/training/tv/playback/now-playing.jd b/docs/html-intl/intl/ja/training/tv/playback/now-playing.jd
new file mode 100755
index 0000000..0959204
--- /dev/null
+++ b/docs/html-intl/intl/ja/training/tv/playback/now-playing.jd
@@ -0,0 +1,134 @@
+page.title=再生中カードを表示する
+page.tags=tv, mediasession
+
+trainingnavtop=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>学習の目的</h2>
+ <ol>
+ <li><a href="#session">Media Session を起動する</a></li>
+ <li><a href="#card">再生中カードを表示する</a></li>
+ <li><a href="#state">再生ステータスをアップデートする</a></li>
+ <li><a href="#respond">ユーザー アクションを処理する</a></li>
+ </ol>
+
+</div>
+</div>
+
+<p>TV アプリでは、ユーザーが他のアプリを使用中にバックグラウンドで音楽やその他のメディアを再生できる場合があります。このタイプのアプリの場合、アプリに戻って音楽を一時停止したり、新しい曲に切り替えたりする方法をユーザーに提供する必要があります。Android のフレームワークでは、ホーム スクリーン上の推奨する行に [<em>再生中</em>] カードを表示することで、 TV アプリで上記の操作を行えるようになります。</p>
+
+<p>[再生中] カードは、アクティブなメディア セッションのホーム スクリーンの推奨する行に表示されるシステム アーティファクトです。アルバム アート、タイトル、アプリのアイコンなど、メディアのメタデータが含まれます。ユーザーが選択すると、システムはセッション中のアプリを開きます。</p>
+
+<p>このレッスンでは、{@link android.media.session.MediaSession} クラスを使用して [再生中] カードを実装する方法を説明します。</p>
+
+<h2 id="session">Media Session を起動する</h2>
+
+<p>再生アプリは<a href="{@docRoot}guide/components/activities">アクティビティ</a>か<a href="{@docRoot}guide/components/services">サービス</a>として実行できます。サービスは、サービスを開始したアクティビティが破棄された後もメディアの再生を継続できるため、バックグラウンド再生時に必要となります。ここでは、メディア再生アプリが {@link android.service.media.MediaBrowserService} で実行されているものとします。</p>
+
+<p>ご使用中のサービスの{@link android.service.media.MediaBrowserService#onCreate() onCreate()}メソッドで、{@link android.media.session.MediaSession#MediaSession(android.content.Context, java.lang.String) MediaSession} を新規作成し、メディア アプリへの適切なコールバックとフラグを設定して、{@link android.service.media.MediaBrowserService} のセッション トークンを設定します。</p>
+
+<pre>
+mSession = new MediaSession(this, "MusicService");
+mSession.setCallback(new MediaSessionCallback());
+mSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS |
+ MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
+
+// for the MediaBrowserService
+setSessionToken(mSession.getSessionToken());
+</pre>
+
+<p class="note"><strong>注意:</strong>[再生中] カードは、{@link android.media.session.MediaSession#FLAG_HANDLES_TRANSPORT_CONTROLS} フラグが設定されたメディア セッションでのみ表示されます。</p>
+
+<h2 id="card">再生中カードを表示する</h2>
+
+<p>[再生中] カードは、セッションがシステム内で最も優先度の高い場合に、{@link android.media.session.MediaSession#setActive(boolean) setActive(true)} を呼び出した後に表示されます。また、<a href="{@docRoot}training/managing-audio/audio-focus">オーディオ フォーカスを管理する</a>で説明したように、アプリからオーディオ フォーカスをリクエストする必要があります。</p>
+
+<pre>
+private void handlePlayRequest() {
+
+ tryToGetAudioFocus();
+
+ if (!mSession.isActive()) {
+ mSession.setActive(true);
+ }
+...
+</pre>
+
+<p>{@link android.media.session.MediaSession#setActive(boolean) setActive(false)} の呼び出し時や別のアプリがメディアの再生を開始した場合に、カードはホーム スクリーンから削除されます。再生が一時停止された後、通常は 5~30 分間、カードを表示したままにして、その後カードをホーム スクリーンから削除することもできiます。</p>
+
+<h2 id="state">再生ステータスをアップデートする</h2>
+
+<p>どのメディア アプリの場合でも、次の例のように現在のメタデータを表示するよう、{@link android.media.session.MediaSession} で再生ステータスをアップデートするようにします。</p>
+
+<pre>
+private void updatePlaybackState() {
+ long position = PlaybackState.PLAYBACK_POSITION_UNKNOWN;
+ if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
+ position = mMediaPlayer.getCurrentPosition();
+ }
+ PlaybackState.Builder stateBuilder = new PlaybackState.Builder()
+ .setActions(getAvailableActions());
+ stateBuilder.setState(mState, position, 1.0f);
+ mSession.setPlaybackState(stateBuilder.build());
+}
+private long getAvailableActions() {
+ long actions = PlaybackState.ACTION_PLAY |
+ PlaybackState.ACTION_PLAY_FROM_MEDIA_ID |
+ PlaybackState.ACTION_PLAY_FROM_SEARCH;
+ if (mPlayingQueue == null || mPlayingQueue.isEmpty()) {
+ return actions;
+ }
+ if (mState == PlaybackState.STATE_PLAYING) {
+ actions |= PlaybackState.ACTION_PAUSE;
+ }
+ if (mCurrentIndexOnQueue > 0) {
+ actions |= PlaybackState.ACTION_SKIP_TO_PREVIOUS;
+ }
+ if (mCurrentIndexOnQueue < mPlayingQueue.size() - 1) {
+ actions |= PlaybackState.ACTION_SKIP_TO_NEXT;
+ }
+ return actions;
+}
+</pre>
+
+<h2 id="metadata">メディアのメタデータを表示する</h2>
+
+<p>トラックが現在再生中の場合は、{@link android.media.session.MediaSession#setMetadata(android.media.MediaMetadata) setMetadata()} メソッドを使用して{@link android.media.MediaMetadata} を設定します。メディア セッション オブジェクトのこのメソッドを使用すると、タイトル、サブタイトル、さまざまなアイコンなど、トラックに関する情報を [再生中] カードに表示することができます。次の例は、トラック データがカスタムデータ クラスの {@code MediaData} に格納されている場合です。</p>
+
+<pre>
+private void updateMetadata(MediaData myData) {
+ MediaMetadata.Builder metadataBuilder = new MediaMetadata.Builder();
+ // To provide most control over how an item is displayed set the
+ // display fields in the metadata
+ metadataBuilder.putString(MediaMetadata.METADATA_KEY_DISPLAY_TITLE,
+ myData.displayTitle);
+ metadataBuilder.putString(MediaMetadata.METADATA_KEY_DISPLAY_SUBTITLE,
+ myData.displaySubtitle);
+ metadataBuilder.putString(MediaMetadata.METADATA_KEY_DISPLAY_ICON_URI,
+ myData.artUri);
+ // And at minimum the title and artist for legacy support
+ metadataBuilder.putString(MediaMetadata.METADATA_KEY_TITLE,
+ myData.title);
+ metadataBuilder.putString(MediaMetadata.METADATA_KEY_ARTIST,
+ myData.artist);
+ // A small bitmap for the artwork is also recommended
+ metadataBuilder.putString(MediaMetadata.METADATA_KEY_ART,
+ myData.artBitmap);
+ // Add any other fields you have for your data as well
+ mSession.setMetadata(metadataBuilder.build());
+}
+</pre>
+
+<h2 id="respond">ユーザー アクションを処理する</h2>
+
+<p>ユーザーが [再生中] カード選択すると、システムはセッション中のアプリを開きます。TV アプリが {@link android.app.PendingIntent} を{@link android.media.session.MediaSession#setSessionActivity(android.app.PendingIntent) setSessionActivity()}に渡した場合は、指定したアクティビティをシステムが次のように開始します。それ以外の場合は、デフォルトのシステム インテントが開きます。指定対象のアクティビティでは、ユーザーに再生の一時停止または停止(再生コントロール)機能を提供する必要があります。</p>
+
+<pre>
+Intent intent = new Intent(mContext, MyActivity.class);
+ PendingIntent pi = PendingIntent.getActivity(context, 99 /*request code*/,
+ intent, PendingIntent.FLAG_UPDATE_CURRENT);
+ mSession.setSessionActivity(pi);
+</pre>
diff --git a/docs/html-intl/intl/ja/training/tv/start/hardware.jd b/docs/html-intl/intl/ja/training/tv/start/hardware.jd
new file mode 100755
index 0000000..ccf20fa
--- /dev/null
+++ b/docs/html-intl/intl/ja/training/tv/start/hardware.jd
@@ -0,0 +1,314 @@
+page.title= TV ハードウェアを処理する
+page.tags=tv
+trainingnavtop=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>学習の目的</h2>
+ <ol>
+ <li><a href="#runtime-check">TV 端末をチェックする</a>
+ <li><a href="#handle-features">サポートされていないハードウェア機能を処理する</a></li>
+ <li><a href="#controllers">ハードウェア コントローラを管理する</a>
+ </li>
+ </ol>
+</div>
+</div>
+
+<p>
+ TV のハードウェアは、他の Android 端末とは大きく異なります。TV には、タッチスクリーン、カメラ、GPS 受信機など、他の Android 端末でよく使われるハードウェア機能がありません。そして TV は、2 次ハードウェア端末に完全に依存しています。つまり、ユーザーはリモコンやゲーム機のコントローラで TV アプリを操作する必要があります。TV アプリをビルドする際は、ハードウェア上の制限や TV 向けハードウェアの操作要件を慎重に考慮する必要があります。
+</p>
+
+<p>
+ このレッスンでは、TV でアプリが正常に動作するかどうかチェックする方法や、サポートされていないハードウェア機能を処理する方法、そして TV 端末用のコントローラを処理するための要件について説明します。
+</p>
+
+
+<h2 id="runtime-check">TV 端末をチェックする</h2>
+
+<p>
+ TV 端末やその他の端末の両方で動作するアプリをビルドする場合、アプリが実行される端末の種類をチェックして、アプリの動作を調整する必要があります。たとえば、{@link android.content.Intent} を介して起動するアプリの場合、アクティビティをテレビ向けに起動するか、携帯電話向けに起動するかを判断するために、アプリ側で端末のプロパティをチェックする必要があります。
+</p>
+
+<p>
+ TV 端末でアプリが正常に動作するかどうかを判断するには、{@link android.app.UiModeManager#getCurrentModeType UiModeManager.getCurrentModeType()} メソッドを使用して、その端末がアプリの TV モードで正常に動作するかどうかをチェックすることをお勧めします。次のコード例では、TV 端末でアプリが正常に動作するかどうかチェックする方法を示します。
+</p>
+
+<pre>
+public static final String TAG = "DeviceTypeRuntimeCheck";
+
+UiModeManager uiModeManager = (UiModeManager) getSystemService(UI_MODE_SERVICE);
+if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) {
+ Log.d(TAG, "Running on a TV Device")
+} else {
+ Log.d(TAG, "Running on a non-TV Device")
+}
+</pre>
+
+
+<h2 id="handle-features">サポートされていないハードウェア機能を処理する</h2>
+
+<p>
+ アプリのデザインと機能によっては、特定のハードウェア機能を利用できないという事態を回避できる場合があります。このセクションでは、一般的に TV で使用できないハードウェア機能や、それらを検出する方法、そしてそれらの機能の代替案について説明します。
+</p>
+
+
+<h3 id="unsupported-features">サポートされていない TV ハードウェア機能</h3>
+
+<p>
+ TV には他の端末と異なる用途がありますので、他の Android 端末で提供されることの多いハードウェア機能がない場合があります。このため、Android システムは TV 端末では次の機能をサポートしていません。
+</p>
+
+<table>
+ <tr>
+ <th>ハードウェア</th>
+ <th>Android の Feature Descriptor</th>
+ </tr>
+ <tr>
+ <td>タッチスクリーン</td>
+ <td>{@code android.hardware.touchscreen}</td>
+ </tr>
+ <tr>
+ <td>電話</td>
+ <td>{@code android.hardware.telephony}</td>
+ </tr>
+ <tr>
+ <td>カメラ</td>
+ <td>{@code android.hardware.camera}</td>
+ </tr>
+ <tr>
+ <td>近距離無線通信(NFC)</td>
+ <td>{@code android.hardware.nfc}</td>
+ </tr>
+ <tr>
+ <td>GPS</td>
+ <td>{@code android.hardware.location.gps}</td>
+ </tr>
+ <tr>
+ <td>マイク</td>
+ <td>{@code android.hardware.microphone}</td>
+ </tr>
+</table>
+
+
+<h3 id="declare-hardware-requirements">TV のハードウェア要件を宣言する</h3>
+
+<p>
+ Android アプリでは、機能提供がない端末にインストールされてしまわないように、アプリのマニフェストでハードウェア機能の要件を宣言できます。TV 向けに既存のアプリを拡張している場合は、TV 端末へのインストールを阻害する可能性のあるハードウェア要件を宣言しているかどうかについて、アプリのマニフェストを詳細に見直す必要があります。
+</p>
+
+<p>
+ アプリでは TV で使用できないハードウェア機能(タッチスクリーンやカメラなど)を使用しているが、TV 向けにはそれらの機能がなくても構わない場合、アプリのマニフェストを編集して、それが不要な機能であることを示します。次のマニフェストのコード スニペットでは、TV 端末で使用できないハードウェア機能を(TV 以外の端末には提供する可能性がある場合でも)不要と宣言する方法を示します。
+</p>
+
+<pre>
+<uses-feature android:name="android.hardware.touchscreen"
+ android:required="false"/>
+<uses-feature android:name="android.hardware.telephony"
+ android:required="false"/>
+<uses-feature android:name="android.hardware.camera"
+ android:required="false"/>
+<uses-feature android:name="android.hardware.nfc"
+ android:required="false"/>
+<uses-feature android:name="android.hardware.gps"
+ android:required="false"/>
+<uses-feature android:name="android.hardware.microphone"
+ android:required="false"/>
+</pre>
+
+<p>
+ なお、TV 端末向けのすべてのアプリは、<a href="{@docRoot}training/tv/start/start.html#no-touchscreen">TV アプリのビルドを開始する</a>で説明したように、タッチスクリーン機能が不要であることを宣言する必要があります。アプリで上記の機能を 1 つ以上使用している場合は、マニフェストで該当する機能の {@code android:required} 属性の設定を {@code false} に変更します。
+</p>
+
+<p class="caution">
+ <strong>警告:</strong>この値を {@code true} に設定してハードウェア機能を必要と宣言すると、TV 端末にインストールされず、Android 版 TV のホーム スクリーン ランチャーにもアプリが表示されなくなります。
+</p>
+
+<p>
+ アプリのハードウェア機能をオプションにする場合は、実行時にこれらの機能が利用できるかをチェックしてから、アプリの動作を調整する必要があります。次のセクションでは、ハードウェア機能をチェックする方法と、アプリの動作を変更するためのいくつかのアプローチについて説明します。
+</p>
+
+<p>
+ マニフェスト内でのフィルタリングと機能の宣言については、<a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code uses-feature}</a>ガイドを参照してください。
+</p>
+
+
+<h3 id="hardware-permissions">ハードウェア機能を暗示するパーミッションを宣言する</h3>
+
+<p>
+ <a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">{@code uses-permission}</a> のマニフェストにおける宣言には、<em>ハードウェア機能を暗示する</em>ものがあります。これは、アプリのマニフェストでいくつかのパーミッションを要求すると、アプリが TV 端末にインストールされず、使用されなくなることを意味します。次の一般によく要求されるパーミッションにより、暗黙的なハードウェア機能の要件が作成されます。
+</p>
+
+<table>
+ <tr>
+ <th>パーミッション</th>
+ <th>暗黙的なハードウェア機能</th>
+ </tr>
+ <tr>
+ <td>{@link android.Manifest.permission#RECORD_AUDIO}</td>
+ <td>{@code android.hardware.microphone}</td>
+ </tr>
+ <tr>
+ <td>{@link android.Manifest.permission#CAMERA}</td>
+ <td>{@code android.hardware.camera} <em>と</em> <br/> {@code android.hardware.camera.autofocus}</td>
+ </tr>
+ <tr>
+ <td>{@link android.Manifest.permission#ACCESS_COARSE_LOCATION}</td>
+ <td>{@code android.hardware.location} <em>と</em> <br/> {@code android.hardware.location.network}</td>
+ </tr>
+ <tr>
+ <td>{@link android.Manifest.permission#ACCESS_FINE_LOCATION}</td>
+ <td>{@code android.hardware.location} <em>と</em> <br/> {@code android.hardware.location.gps}</td>
+ </tr>
+</table>
+
+<p>
+ ハードウェア機能の要件を暗示するパーミッション要求を網羅したリストについては、<a href="{@docRoot}guide/topics/manifest/uses-feature-element.html#permissions-features">{@code uses-feature}</a>ガイドを参照してください。アプリが上記の機能のいずれかを要求する場合、暗示されたハードウェア機能についてマニフェストに <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code uses-feature}</a> 宣言を含めて、不要であることを示します({@code android:required="false"})。
+</p>
+
+
+<h3 id="check-features">ハードウェア機能をチェックする</h2>
+
+<p>
+ Android のフレームワークでは、アプリを実行している端末でハードウェア機能が使用できない場合を判別できます。{@link android.content.pm.PackageManager#hasSystemFeature(String)} メソッドを使用して、実行時に特定の機能をチェックできます。この場合、チェック対象の機能を指定する単一の文字列の引数を使用します。
+</p>
+
+<p>次のコード例では、アプリの実行時にハードウェア機能の利用可能性を検出する方法を示します。</p>
+
+<pre>
+// Check if the telephony hardware feature is available.
+if (getPackageManager().hasSystemFeature("android.hardware.telephony")) {
+ Log.d("HardwareFeatureTest", "Device can make phone calls");
+}
+
+// Check if android.hardware.touchscreen feature is available.
+if (getPackageManager().hasSystemFeature("android.hardware.touchscreen")) {
+ Log.d("HardwareFeatureTest", "Device has a touch screen.");
+}
+</pre>
+
+
+<h4 id="no-touchscreen">タッチスクリーン</h4>
+
+<p>
+ TV には通常タッチスクリーンがないので、Android は TV 端末向けにはタッチスクリーン操作をサポートしていません。そもそも、タッチスクリーン操作は、ユーザーが 10 フィート離れた場所から視聴するという TV 特有の使用環境にそぐわないものです。
+</p>
+
+<p>
+ TV 端末ではリモコンの矢印ボタンによるナビゲーションをサポートして、TV 特有のインタラクション モデルに適したアプリをデザインする必要があります。TV 向けのコントロールを使用してナビゲーションを適切にサポートする方法については、<a href="{@docRoot}training/tv/start/navigation.html">TV 用のナビゲーションを作成する</a>を参照してください。
+</p>
+
+
+<h4 id="no-camera">カメラ</h4>
+
+<p>
+ TV にはカメラがないことが一般的ですが、カメラ関連アプリを提供することは可能です。たとえば、写真の撮影、表示、編集の機能があるアプリの場合、TV 向けに撮影機能を無効にながら、写真をの表示や編集は可能にすることができます。カメラ関連アプリをTV 向けにする場合、アプリのマニフェストには次の機能の宣言を追加します。
+</p>
+
+<pre>
+<uses-feature android:name="android.hardware.camera" android:required="false" />
+</pre>
+
+<p>
+ カメラ機能を除いてアプリを動作させる場合、カメラ機能の存在を検出し、アプリの動作を調整するためのコードを追加します。次のコード例では、カメラ機能の存在を検出する方法を示します。
+</p>
+
+<pre>
+// Check if the camera hardware feature is available.
+if (getPackageManager().hasSystemFeature("android.hardware.camera")) {
+ Log.d("Camera test", "Camera available!");
+} else {
+ Log.d("Camera test", "No camera available. View and edit features only.");
+}
+</pre>
+
+
+<h4 id="no-gps">GPS</h4>
+
+<p>
+ TV は据え付けタイプの室内用端末であり、全地球測位システム(GPS)の受信機を内蔵していません。アプリが位置情報を使用している場合、TV 端末のセットアップ時に郵便番号などの静的なロケーション プロバイダを構成して、ユーザーが位置を調べたり、それらを使用できるようにすることが可能です。
+</p>
+
+<pre>
+// Request a static location from the location manager
+LocationManager locationManager = (LocationManager) this.getSystemService(
+ Context.LOCATION_SERVICE);
+Location location = locationManager.getLastKnownLocation("static");
+
+// Attempt to get postal or zip code from the static location object
+Geocoder geocoder = new Geocoder(this);
+Address address = null;
+try {
+ address = geocoder.getFromLocation(location.getLatitude(),
+ location.getLongitude(), 1).get(0);
+ Log.d("Zip code", address.getPostalCode());
+
+} catch (IOException e) {
+ Log.e(TAG, "Geocoder error", e);
+}
+</pre>
+
+
+<h2 id="controllers">コントローラを処理する</h2>
+
+<p>
+ TV 端末ではベーシックなタイプのリモコン、ゲーム機のコントローラといった、アプリを操作するための2 次ハードウェア端末が必要となります。これは、アプリで矢印ボタンによる入力をサポートする必要がある、ということです。そして、コントローラのオフライン操作と複数のタイプのコントローラによる入力を処理することも必要です。
+</p>
+
+
+<h3 id="d-pad-minimum">矢印ボタンによる最小限のコントロール</h3>
+
+<p>
+ TV 端末のデフォルト コントローラはリモコン端末の矢印ボタンです。すなわち、上下、左右、[選択]、[戻る]、[ホーム] ボタンのみを使用して、アプリを操作できるようにする必要があります。ゲーム アプリの場合、通常は追加のコントロール機能のあるゲーム機のコントローラが必要ですが、TV ではリモコン端末の矢印ボタンでプレイできるようにする必要があります。この場合、コントローラが必要な旨をユーザーに警告した上で、リモコン端末の矢印ボタンでゲームを終了できるようにする必要があります。TV のリモコン端末の矢印ボタンによるナビゲーションを処理する方法については、<a href="{@docRoot}training/tv/start/navigation.html">TV 用のナビゲーションを作成する</a>を参照してください。
+</p>
+
+
+<h3 id="controller-disconnects">コントローラの接続の切断を処理する</h3>
+
+<p>
+ TV 用コントローラは Bluetooth 端末であることが多く、定期的にスリープ モードに入って TV との接続を切断し、消費電力を節約しようとする場合があります。この場合、アプリ側で再接続イベントの処理を構成していないと、アプリが中断したり再起動する可能性が生じます。これらのイベントは、次のいずれかの場合に発生する可能性があります。
+</p>
+
+<ul>
+ <li>ビデオ(数分程度)を見ている間にリモコン端末かゲーム機のコントローラがスリープ モードになり、TV 端末との接続が失われ、その後再び接続される場合。
+ </li>
+ <li>ゲームプレイ中に、新しいプレイヤーがオフライン状態のゲーム機のコントローラを使用してゲームに参加した場合。
+ </li>
+ <li>ゲームプレイ中に、プレイヤーがゲームを中断し、ゲーム機のントローラとの接続が失われた場合。
+ </li>
+</ul>
+
+<p>
+ 接続の切断や再接続の対象となる TV アプリのアクティビティはすべて、アプリのマニフェストで再接続イベントを処理できるように構成する必要があります。次のコード サンプルでは、キーボードやナビゲーション端末の接続、切断、再接続などを含む構成の変更を処理するアクティビティの記述方法を示します。
+</p>
+
+<pre>
+<activity
+ android:name="com.example.android.TvActivity"
+ android:label="@string/app_name"
+ <strong>android:configChanges="keyboard|keyboardHidden|navigation"</strong>
+ android:theme="@style/Theme.Leanback">
+
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
+ </intent-filter>
+ ...
+</activity>
+</pre>
+
+<p>
+ この構成の変更により、Android のフレームワークによる再起動(ユーザー エクスペリエンスの観点から望ましくない)ではなく、再接続イベントを介してアプリの中断を回避することが可能です。
+</p>
+
+
+<h3 id="d-pad-variants">矢印ボタンによる入力のバリエーションを処理する</h3>
+
+<p>
+ TV 端末のユーザーは、複数のタイプのコントローラを使用して TV を操作する場合があります。たとえば、ベーシックなタイプのリモコンとゲーム機のコントローラを使用している場合があります。TV リモコンの矢印ボタンの機能をゲーム機のコントローラで実行する場合、送信されるキーコードはリモコン本体が送信するキーコードとは異なる場合があります。
+</p>
+
+<p>
+ ユーザーがアプリ操作のためにコントローラとリモコンを持ち替える必要がないよう、アプリでは、ゲーム機のコントローラからの矢印ボタンによる入力のバリエーションを処理する必要があります。入力のバリエーションの処理については、<a href="{@docRoot}training/game-controllers/controller-input.html#dpad">コントローラのアクションを処理する</a>を参照してください。
+</p>
diff --git a/docs/html-intl/intl/ja/training/tv/start/index.jd b/docs/html-intl/intl/ja/training/tv/start/index.jd
new file mode 100755
index 0000000..8f946a1
--- /dev/null
+++ b/docs/html-intl/intl/ja/training/tv/start/index.jd
@@ -0,0 +1,45 @@
+page.title=TV アプリのビルド
+page.tags=tv, leanback
+startpage=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>依存関係と前提条件</h2>
+ <ul>
+ <li>Android 5.0(API レベル 21)以降</li>
+ <li>Android Studio 0.8 以降、Gradle 0.12 以降</li>
+ </ul>
+</div>
+</div>
+
+<p>
+ Android は、ハイビジョン TV などの大画面の端末で使用するアプリ向けに最適化された、表現力豊かなユーザー エクスペリエンスを実現します。TV で使用できるアプリによって、ユーザーは自宅のソファでくつろぎながらさまざまな操作を行えるようになります。
+</p>
+
+<p>
+ TV アプリでは、携帯電話やタブレット向けのものと同じ構造を使用します。つまり、Android アプリのビルドに関する既知の技術を使用して新たな TV アプリを作成したり、既存のアプリを TV 端末でも使用できるように拡張したりできます。ただし、TV ユーザーのインタラクション モデルは、携帯電話やタブレット端末とは大きく異なっています。TV 端末向けアプリがユーザーに受け入れられるには、10 フィート離れた場所からでも容易に識別できる新しいレイアウト デザインや、リモコンの矢印ボタンや選択ボタンだけで操作できるナビゲーションが必要です。
+</p>
+
+<p>
+ このクラスでは、開発環境のセットアップやレイアウトとナビゲーションに関する基本的な要件、TV 端末では通常使用できないハードウェア機能の処理方法に関するガイダンスなど、TV 向けアプリのビルドを開始する方法を説明します。
+</p>
+
+<p class="note">
+ <strong>注意:</strong>TV アプリのビルドには、プロジェクトのセットアップ、ライブラリ インクルード、パッケージングの簡便性を備えた <a href="{@docRoot}sdk/installing/studio.html">Android Studio</a>の使用を推奨します。このトレーニングでは、Android Studio の使用を前提にしています。
+</p>
+
+
+<h2>レッスン</h2>
+
+<dl>
+ <dt><a href="{@docRoot}training/tv/start/start.html">TV アプリのビルドを開始する</a></dt>
+ <dd>TV アプリ用に Android Studio プロジェクトを新規作成したり、TV 端末で使用できるように既存アプリのプロジェクトを編集したりする方法を説明します。</dd>
+ <dt><a href="{@docRoot}training/tv/start/layouts.html">TV 用のレイアウトをビルドする</a></dt>
+ <dd>TV 用のレイアウトに最低限必要な要件と、それらを実装する方法を説明します。</dd>
+ <dt><a href="{@docRoot}training/tv/start/navigation.html"> TV 用のナビゲーションを作成する</a></dt>
+ <dd>TV 用のナビゲーションに必要な要件と、TV と互換性のあるナビゲーションを実装する方法を説明します。</dd>
+ <dt><a href="{@docRoot}training/tv/start/hardware.html"> TV ハードウェアを処理する</a></dt>
+ <dd>作成したアプリの TV ハードウェアでの動作を確認したり、サポートされていないハードウェア機能を処理したり、コントローラ端末を管理したりする方法を説明します。</dd>
+</dl>
diff --git a/docs/html-intl/intl/ja/training/tv/start/layouts.jd b/docs/html-intl/intl/ja/training/tv/start/layouts.jd
new file mode 100755
index 0000000..85193bf
--- /dev/null
+++ b/docs/html-intl/intl/ja/training/tv/start/layouts.jd
@@ -0,0 +1,190 @@
+page.title=TV 向けレイアウトをビルドする
+page.tags=tv
+trainingnavtop=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>学習の目的</h2>
+ <ol>
+ <li><a href="#themes">TV 向けのレイアウト テーマを使用する</a></li>
+ <li><a href="#structure">基本的な TV レイアウトをビルドする</a></li>
+ <li><a href="#visibility">使用可能なテキストとコントロールをビルドする</a></li>
+ <li><a href="#density-resources">TV のレイアウト リソースを管理する</a></li>
+ <li><a href="#anti-patterns">レイアウトのアンチパターンを回避する</a></li>
+ <li><a href="#large-bitmaps">大容量のビットマップを処理する</a></li>
+ </ol>
+ <h2>関連コンテンツ</h2>
+ <ol>
+ <li><a href="{@docRoot}design/tv/index.html">Android の TV 向けデザイン</a></li>
+ </ol>
+</div>
+</div>
+
+<p>
+ TV スクリーンは 10 フィートほど離れて見ることが通常であり、他の Android 端末のディスプレイよりもはるかに大きいことが多く、小型の端末と同レベルの精度と色を再現できません。便利で楽しいユーザー エクスペリエンスを作成する上で、これらの要素を配慮して TV 端末向けアプリのレイアウトを作成する必要があります。
+</p>
+
+<p>
+ このレッスンでは、TV アプリ用の効果的なレイアウトをビルドするための最低限の要件と実装の詳細を説明します。
+</p>
+
+<h2 id="themes">TV 向けのレイアウト テーマを使用する</h2>
+
+<p>
+ Android の<a href="{@docRoot}guide/topics/ui/themes.html">テーマ</a>は、TV アプリのレイアウトの基礎を提供しています。TV 端末上で動作するよう設計されたアプリのアクティビティに関しては、テーマを使用して表示を変更する必要があります。このセクションでは、どのテーマを使用したらよいかについて説明します。
+</p>
+
+<h3 id="leanback-theme">Leanback テーマ</h3>
+
+<p>
+ TV ユーザー インターフェースのサポート ライブラリである <a href="{@docRoot}tools/support-library/features.html#v17-leanback">v17 leanback ライブラリ</a> は、{@code Theme.Leanback} という TV アクティビティに関する標準的なテーマを提供しています。このテーマは、TV アプリに一貫性のある視覚的なスタイルを与えます。ほとんどの TV アプリにはこのテーマをお勧めします。このテーマは v17 leanback クラスを使用するすべての TV アプリに最適です。次のコード例では、アプリ内にあるアクティビティにこのテーマを適用する方法を示します。
+</p>
+
+<pre>
+<activity
+ android:name="com.example.android.TvActivity"
+ android:label="@string/app_name"
+ <strong>android:theme="@style/Theme.Leanback"</strong>>
+</pre>
+
+
+<h3 id="notitle-theme">NoTitleBar テーマ</h3>
+
+<p>
+ タイトル バーは、携帯電話やタブレットの Android アプリにとっては標準的なユーザー インターフェース エレメントですが、TV アプリには適していません。v17 leanback クラスを使用していない場合は、TV アクティビティにこのテーマを適用してタイトル バーの表示を控える必要があります。TV アプリのマニフェストに関する次のコード例では、このテーマを適用してタイトル バーの表示を削除する方法を示します。
+</p>
+
+<pre>
+<application>
+ ...
+
+ <activity
+ android:name="com.example.android.TvActivity"
+ android:label="@string/app_name"
+ <strong>android:theme="@android:style/Theme.NoTitleBar"</strong>>
+ ...
+
+ </activity>
+</application>
+</pre>
+
+
+<h2 id="structure">基本的な TV レイアウトをビルドする</h2>
+
+<p>TV 端末用のレイアウトが、大きなスクリーンでも使いやすく効果的になるように、参考となるガイドラインがいくつかあります。次のヒントに従って、TV スクリーン用に最適化された横長のレイアウトをビルドします。
+</p>
+
+<ul>
+ <li>横向きでレイアウトをビルドします。TV スクリーンは常に横表示になります。</li>
+ <li>スクリーンの左か右にナビゲーション コントロールを配置して、垂直方向にコンテンツ用のスペースを確保します。</li>
+ <li><a href="{@docRoot}guide/components/fragments.html">フラグメント</a>を使用してセクションごとに分割された UI を作成し、水平方向のスペースをより有効に活用するために、{@link android.widget.GridView} のようなビュー グループを {@link android.widget.ListView} の代わりに使用します。
+ </li>
+ <li>ビューの配置には、{@link android.widget.RelativeLayout} や {@link android.widget.LinearLayout} のようなビュー グループを使用します。これにより、システムで TV 画面のビューの位置を一定のサイズ、アラインメント、アスペクト比、画素密度に調整することができるようになります。</li>
+ <li>レイアウト コントロール間には十分なマージンを取り、UI が見やすくなるようにします。</li>
+</ul>
+
+
+<h3 id="overscan">オーバースキャン</h3>
+
+<p>TV 向けのレイアウトには、TV 規格の進化と、常に視聴者にフルスクリーン表示を提供したいという開発者側の意図に伴い、いくつかの特殊な要件があります。このため、TV 端末ではフルスクリーン表示の際にディスプレイ全体を埋められるように、アプリのレイアウト周囲がクリッピングされる場合があります。この動作を、一般に<em>オーバースキャン</em>と呼びます。
+</p>
+
+<p>
+ レイアウト周囲には 10%のマージンを与え、スクリーン エレメントがオーバースキャンによりクリッピングされないようにします。具体的には、アクティビティのベース レイアウトの左右には 27dp、上下には 48dp のマージンを設定します。次のレイアウト例では、TV アプリのルート レイアウト内でこれらのマージンを設定する方法を示します。
+</p>
+
+<pre>
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/base_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:layout_marginTop="27dp"
+ android:layout_marginLeft="48dp"
+ android:layout_marginRight="48dp"
+ android:layout_marginBottom="27dp" >
+</LinearLayout>
+</pre>
+
+<p class="caution">
+ <strong>警告:</strong>{@link android.support.v17.leanback.app.BrowseFragment} や関連ウィジェットなどの v17 leanback クラスを使用している場合、レイアウトには既にオーバースキャン用のマージンが設定されているため、重複して設定しないようにします。
+</p>
+
+<h2 id="visibility">使用可能なテキストとコントロールをビルドする</h2>
+
+<p>
+ TV アプリのレイアウト内のテキストやコントロールは、遠くからでも見やすく、操作内容を理解できるようにする必要があります。次のヒントに従って、遠くから見ても簡単に判別可能なユーザー インターフェース エレメントを作成します。
+</p>
+
+<ul>
+ <li>ユーザーが一目でわかる小さな単位にテキストを分割します。</li>
+ <li>暗い背景に対して明るい色のテキストを使用します。これにより、TV スクリーン上のテキストが読みやすくなります。</li>
+ <li>細いフォントや、狭すぎたり広すぎたりするストロークのフォントを使用しないようにします。シンプルなサンセリフ フォントやアンチ エイリアスを使用して、より読みやすくします。</li>
+ <li>次の Android の標準フォント サイズを使用します。 <pre>
+<TextView
+ android:id="@+id/atext"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:singleLine="true"
+ <strong>android:textAppearance="?android:attr/textAppearanceMedium"/></strong>
+</pre>
+ </li>
+ <li>すべてのビュー ウィジェットが、スクリーン位置から 10 フィート(スクリーンが大きくなると、この距離は長くなります)離れていてもはっきりと見えるように十分な大きさを確保します。これには、絶対的なサイズではなく相対レイアウトによるサイジングを、絶対的なピクセル単位ではなく密度に依存しないピクセル(dip)単位を使用します。たとえば、ウィジェットの幅を設定するには画素測定ではなく {@code wrap_content} を、ウィジェットのマージンを設定するにはピクセル値ではなくディップ値を使用します。</li>
+</ul>
+
+<p>
+ 密度に依存しないピクセルと、スクリーン サイズが大きな場合のレイアウトのビルドについては、<a href="{@docRoot}guide/practices/screens_support.html">複数のスクリーンをサポートする</a>を参照してください。
+</p>
+
+<h2 id="density-resources">TV のレイアウト リソースを管理する</h2>
+
+<p>一般的なハイビジョン TV ディスプレイの解像度は 720p、1080i、1080p です。TV のレイアウトが 1920×1080 ピクセルのスクリーン サイズになるようにして、Android のシステムが必要に応じてアプリのレイアウト エレメントを 720p にダウンスケールできるようにします。通常は、ダウンスケーリング(ピクセル削除)してもレイアウトのプレゼンテーション品質が低下することはありません。ただし、アップスケーリングはレイアウトの品質を劣化させ、アプリのユーザー エクスペリエンスに悪影響を与えるアーチファクトを引き起こす可能性があります。</p>
+
+<p>
+ 画像を最適な状態にスケーリングするには、可能であれば <a href="{@docRoot}tools/help/draw9patch.html">9patch 画像</a>のエレメントとして配置します。レイアウト内に低品質な画像や小さな画像を配置した場合、ピクセル化され、ぼやけた、粗い表示になり、ユーザー エクスペリエンスの低下につながります。それを避けるには、高品質の画像を使用します。
+</p>
+
+<p>
+ 大きなスクリーン向けのレイアウトやリソースの最適化については、<a href="{@docRoot}training/multiscreen/index.html">複数のスクリーンをデザインする</a>を参照してください。
+</p>
+
+
+<h2 id="anti-patterns">レイアウトのアンチパターンを回避する</h2>
+
+<p>
+ TV 端末には不向きでユーザー エクスペリエンスの低下につながるため、レイアウトのビルドに際して避けたほうがよいアプローチがいくつかあります。ここでは、TV のレイアウト開発の際に特に使用し<em>ない</em>ほうがよい、ユーザー インターフェースに関するアプローチをいくつか説明します。
+</p>
+
+<ul>
+ <li><strong>携帯電話やタブレットのレイアウトの再利用</strong> 携帯電話やタブレット向けアプリのレイアウトをそのまま再利用しないようにします。他の Android 端末のフォーム ファクタ向けにビルドされたレイアウトは、TV 端末には不向きであり、TV 操作向けに簡略化する必要があります。</li>
+ <li><strong>ActionBar</strong> - このユーザー インターフェース規則は、携帯電話やタブレットでの使用は推奨できますが、TV のインターフェースには適していません。具体的には、TV リモコンではアクション バーのオプション メニュー(その他類似機能のプルダウン メニュー)をナビゲートすることが難しいため、使用しないことをお勧めします。</li>
+ <li><strong>ViewPager</strong> - スクリーン間のスライド操作は携帯電話やタブレット上では非常に有効ですが、TV では推奨できません。</li>
+</ul>
+
+<p>TV に適したレイアウトのデザインについては、<a href="{@docRoot}design/tv/index.html">TV 向けデザイン</a>ガイドを参照してください。</p>
+
+
+<h2 id="large-bitmaps">大容量のビットマップを処理する</h2>
+
+<p>他の Android 端末と同様に、TV 端末ではメモリ容量が限られています。超高解像度の画像を使用してアプリのレイアウトをビルドしたり、アプリの動作に多くの高解像度の画像を使用した場合、すぐにメモリの上限に達し、メモリ不足エラーが発生する可能性があります。次のヒントに従って、このタイプの問題を回避します。</p>
+
+<ul>
+ <li>スクリーン上に表示された場合にのみ画像をロードします。たとえば、{@link android.widget.GridView} や {@link android.widget.Gallery} で複数の画像を表示する場合、 {@link android.widget.Adapter#getView getView()} がビューの {@link android.widget.Adapter} で呼び出されたときのみ画像をロードします。
+ </li>
+ <li>{@link android.graphics.Bitmap#recycle()} を、不要になった {@link android.graphics.Bitmap} ビューで呼び出します。
+ </li>
+ <li> {@link java.lang.ref.WeakReference} を使用して、{@link android.graphics.Bitmap} オブジェクト(メモリ内の {@link java.util.Collection} にある)への参照を格納します。
+ </li>
+ <li>ネットワークから画像を取得する場合は{@link android.os.AsyncTask} を使用して取得し、端末に格納すると、アクセスを高速化できます。アプリのメイン ユーザー インターフェースのスレッドで、ネットワーク トランザクションを実行しないでください。
+ </li>
+ <li>ダウンロードの際は大きな画像をより適切なサイズにスケールダウンしてください。スケールダウンしない場合、メモリ不足により障害が発生する可能性があります。
+ </li>
+</ul>
+
+<p>
+ 画像処理の際に最高のパフォーマンスを得るには、<a href="{@docRoot}training/displaying-bitmaps/index.html">ビットマップを効率的に表示する</a>を参照してください。
+</p>
diff --git a/docs/html-intl/intl/ja/training/tv/start/navigation.jd b/docs/html-intl/intl/ja/training/tv/start/navigation.jd
new file mode 100755
index 0000000..e118702
--- /dev/null
+++ b/docs/html-intl/intl/ja/training/tv/start/navigation.jd
@@ -0,0 +1,144 @@
+page.title=TV 用のナビゲーションを作成する
+page.tags=tv, d-pad, focus
+trainingnavtop=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>学習の目的</h2>
+ <ol>
+ <li><a href="#d-pad-navigation">矢印ボタンによるナビゲーションを有効にする</a></li>
+ <li><a href="#focus-selection">明確なフォーカスと選択を可能にする</a></li>
+ </ol>
+
+</div>
+</div>
+
+<p>
+ TV 端末では、アプリのナビゲーション コントロールが限定されています。TV アプリ向けの効率的なナビゲーション スキームを作成できるかどうかは、これらの限定されたナビゲーション コントロールと、アプリを使用するユーザー側の認識の限界についての理解にかかっています。TV 向け Android アプリをビルドする際には、ユーザーがタッチ スクリーンではなく TV のリモコン ボタンを使用して実際にどのようにアプリをナビゲートするかについて、よく考慮する必要があります。
+</p>
+
+<p>
+ このレッスンでは、効率的な TV アプリのナビゲーション スキームを作成するための最小要件と、アプリにそれらの要件を適用する方法を説明します。
+</p>
+
+
+<h2 id="d-pad-navigation">矢印ボタンによるナビゲーションを有効にする</h2>
+
+<p>
+ TV 端末では、ユーザーはリモコン端末の矢印ボタンを使用して、ナビゲーション操作を行います。この操作では、上、下、左、右方向への移動のみが可能です。TV 向けにこの上なく最適化されたアプリをビルドするには、このような限られたコントロールのみを使用して、ユーザーがアプリのナビゲーション方法を簡単に習得できるナビゲーション スキームを提供する必要があります。
+</p>
+
+<p>
+ Android のフレームワークでは、レイアウト エレメント間のナビゲーションを自動的に処理するため、通常は特に何もする必要はありません。ただし、ナビゲーション上の不備がないか、実際のリモコンの矢印ボタンで十分にテストする必要があります。次のガイドラインに従って、アプリのナビゲーション システムが、TV 端末のリモコンの矢印ボタンを使用した場合に正しく動作するかどうかをテストします。
+</p>
+
+<ul>
+ <li>ユーザーがリモコンの矢印ボタンを使って、スクリーン上のすべてのコントロールに移動できるか。
+ </li>
+ <li>フォーカスを使用してリストをスクロールする際、リモコンの上下ボタンでリストをスクロールし、[選択] キーでリスト内の項目を選択できるか。ユーザーがリスト内のエレメントを選択でき、選択後もリストがスクロールするか。
+ </li>
+ <li>コントロール間の切り替え操作がわかりやすく、予測可能であるか。
+ </li>
+</ul>
+
+
+<h3 id="modify-d-pad-nav">矢印ボタンによるナビゲーションを編集する</h3>
+
+<p>
+ Android のフレームワークでは、レイアウト内にあるフォーカス可能なエレメントの相対位置に基づいて、矢印ボタンによるナビゲーション スキームを自動的に適用します。TV 端末のリモコンの矢印ボタンを使用して、アプリ内に生成されたナビゲーション スキームをテストする必要があります。テスト後に、ある特定の方法でユーザーがレイアウト内を移動できるようにしたい場合には、コントロールに関する矢印ボタンによるナビゲーションを明示的にセットアップできます。
+</p>
+
+<p class="note">
+ <strong>注意:</strong>システムが適用したデフォルトの順序がうまく動作しない場合にのみ、これらの属性を使用してナビゲーション順序を変更します。
+</p>
+
+<p>
+ 次のコード サンプルでは、{@link android.widget.TextView} レイアウト オブジェクトで隣のコントロールがフォーカスを受け取るよう定義する方法を示します。
+</p>
+
+<pre>
+<TextView android:id="@+id/Category1"
+ android:nextFocusDown="@+id/Category2"\>
+</pre>
+
+<p>
+ 次の表では、Android ユーザー インターフェース ウィジェットで使用可能なナビゲーションの属性一覧を示します。
+</p>
+
+<table>
+ <tr>
+ <th>属性</th>
+ <th>機能</th>
+ </tr>
+ <tr>
+ <td>{@link android.R.attr#nextFocusDown}</td>
+ <td>ユーザーが下に移動したときにフォーカスを受け取る隣のビューを定義します。</td>
+ </tr>
+ <tr>
+ <td>{@link android.R.attr#nextFocusLeft}</td>
+ <td>ユーザーが左に移動したときにフォーカスを受け取る隣のビューを定義します。</td>
+ </tr>
+ <tr>
+ <td>{@link android.R.attr#nextFocusRight}</td>
+ <td>ユーザーが右に移動したときにフォーカスを受け取る隣のビューを定義します。</td>
+ </tr>
+ <tr>
+ <td>{@link android.R.attr#nextFocusUp}</td>
+ <td>ユーザーが上に移動したときにフォーカスを受け取る隣のビューを定義します。</td>
+ </tr>
+</table>
+
+<p>
+ これらの明示的なナビゲーション属性のいずれかを使用するには、レイアウト内の別のウィジェットの ID ({@code android:id} 値)に対する値を設定します。最後のコントロールが最初のコントロールにフォーカスを戻すようにするには、ナビゲーションの順序をループとしてセットアップする必要があります。
+</p>
+
+
+
+<h2 id="focus-selection">明確なフォーカスと選択を可能にする</h2>
+
+<p>
+ TV 端末でアプリのナビゲーション スキームにとって重要なのは、スクリーン上のどのユーザー インターフェース エレメントにフォーカスがあるのかを、ユーザーが簡単に判別できるようにすることです。フォーカス状態のアイテムが明確でないと、ユーザーはどのアイテムに対してアクションが可能か判別できず、ストレスを感じてアプリを終了してしまうことになります。同じ理由で、アプリが起動直後やアイドル状態にある場合でも、ユーザーのアクションが可能なフォーカス状態のアイテムを常に配置しておく必要があります。
+</p>
+
+<p>
+ アプリのレイアウトと実装においては、色、サイズ、アニメーションや、これらの属性の組み合わせを使用して、ユーザーが次に可能なアクションを簡単に判別できるようにする必要があります。アプリ内では、一貫したスキームを使用してフォーカス状態を示すようにしてください。
+</p>
+
+<p>
+ Android は<a href="{@docRoot}guide/topics/resources/drawable-resource.html#StateList">ドローアブルとしての状態リスト リソース</a>を提供しており、フォーカス状態の、そして選択済みのコントロールにハイライトを実装できます。次のコード例では、ボタンの視覚的な動作を有効にして、ユーザーがそのコントロールにナビゲートし、選択したことを表示する方法を示します。
+</p>
+
+<pre>
+<!-- res/drawable/button.xml -->
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true"
+ android:drawable="@drawable/button_pressed" /> <!-- pressed -->
+ <item android:state_focused="true"
+ android:drawable="@drawable/button_focused" /> <!-- focused -->
+ <item android:state_hovered="true"
+ android:drawable="@drawable/button_focused" /> <!-- hovered -->
+ <item android:drawable="@drawable/button_normal" /> <!-- default -->
+</selector>
+</pre>
+
+<p>
+ 次のレイアウトの XML サンプル コードは、{@link android.widget.Button} に対する 1 つ前の状態リスト ドローアブルにも該当します。
+</p>
+
+<pre>
+<Button
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:background="@drawable/button" />
+</pre>
+
+<p>
+ 周囲のハイライトがはっきりと見えるように、フォーカス可能で選択可能なコントロール内には十分なパディングを残してください。
+</p>
+
+<p>
+ TV アプリでの効率的な選択とフォーカスの設計に関する推奨事項については、<a href="{@docRoot}design/tv/patterns.html">TV のパターン</a>を参照してください。
+</p>
diff --git a/docs/html-intl/intl/ja/training/tv/start/start.jd b/docs/html-intl/intl/ja/training/tv/start/start.jd
new file mode 100755
index 0000000..bc99ff9
--- /dev/null
+++ b/docs/html-intl/intl/ja/training/tv/start/start.jd
@@ -0,0 +1,232 @@
+page.title=TV アプリのビルドを開始する
+page.tags=tv, leanback, recyclerview
+
+trainingnavtop=true
+startpage=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>学習の目的</h2>
+ <ol>
+ <li><a href="#dev-project">TV プロジェクトをセットアップする</a></li>
+ <li><a href="#tv-libraries">TV サポート ライブラリを追加する</a></li>
+ <li><a href="#build-it">TV アプリをビルドする</a></li>
+ <li><a href="#run">TV アプリを実行する</a></li>
+ </ol>
+ <h2>関連コンテンツ</h2>
+ <ol>
+ <li><a href="{@docRoot}design/tv/index.html">TV 向けデザイン</a></li>
+ <li><a href="{@docRoot}training/tv/start/layouts.html">TV 用のレイアウトをビルドする</a></li>
+ </ol>
+</div>
+</div>
+
+<p>
+ TV アプリでは、携帯電話やタブレット向けのものと同じ構造を使用します。つまり、Android アプリのビルドに関する既知の技術を使用して新たな TV アプリを作成したり、既存のアプリを TV 端末でも使用できるように編集したりできます。
+</p>
+
+<p class="note">
+ <strong>重要:</strong>Google Play で Android TV アプリを提供するには、特定の要件を満たす必要があります。詳細については、<a href="{@docRoot}distribute/essentials/quality/tv.html">TV アプリの品質</a>に記載されている要件を参照してください。
+</p>
+
+<p>
+ このレッスンでは、TV アプリのビルドの際の開発環境の準備方法と、TV 端末上でアプリを使用できるようにするために最低限必要な変更について説明します。
+</p>
+
+
+<h2 id="dev-project">TV プロジェクトをセットアップする</h2>
+
+<p>
+ このセクションでは、TV 端末向けに既存のアプリを変更したり、新しく作成する方法について説明します。TV 端末向けアプリを作成する際に使用する必要がある主なコンポーネントは次のとおりです。
+</p>
+
+<ul>
+ <li><strong>TV 用のアクティビティ</strong>(必須) - アプリのマニフェストで、TV 端末上で動作させるアクティビティを宣言します。</li>
+ <li><strong>TV サポート ライブラリ</strong>(任意) - ユーザー インターフェースのビルド用にウィジェットを提供する、TV 端末向けの<a href="#tv-libraries">サポート ライブラリ</a>をいくつか利用できます。</li>
+</ul>
+
+
+<h3 id="prerequisites">前提条件</h3>
+
+<p>TV 向けアプリのビルドを開始するには:</p>
+
+<ul>
+ <li><strong><a href="{@docRoot}sdk/installing/adding-packages.html#GetTools">SDK ツールをバージョン 24.0.0 以降にアップデートする</a></strong>
+ <br/> SDK ツールをアップデートすると、TV 向けアプリのビルドとテストができるようになります。
+ </li>
+ <li><strong><a href="{@docRoot}sdk/installing/adding-packages.html#GetTools">SDK ツールを Android 5.0(API レベル 21)以降を使用してアップデートする</a></strong>
+ <br/> アップデート後のプラットフォームのバージョンでは、TV アプリ向けの新しい API を提供しています。
+ </li>
+ <li><strong><a href="{@docRoot}sdk/installing/create-project.html">アプリのプロジェクトを作成またはアップデートする</a></strong>
+ <br/> TV 端末用の新しい API にアクセスするには、プロジェクトを作成するか、Android 5.0(API レベル 21)以降をターゲットとする既存のプロジェクトを変更する必要があります。
+ </li>
+</ul>
+
+
+<h3 id="tv-activity">TV アクティビティを宣言する</h3>
+
+<p>TV 端末向けアプリでは、{@link android.content.Intent#CATEGORY_LEANBACK_LAUNCHER} のインテント フィルタを使用して、アプリのマニフェストで TV 用ランチャーのアクティビティを宣言する必要があります。このフィルタは、アプリが TV 向けになっていることを判別しますので、Google Play 内で TV アプリと認識される上で必要です。この宣言は、ユーザーが TV のホーム スクリーンでアプリのアイコンを選択したときに、アプリ内のどのアクティビティが起動するかについても判別します。</p>
+
+<p>次のコード スニペットでは、マニフェストにインテント フィルタを含める方法を示します。</p>
+
+<pre>
+<application
+ android:banner="@drawable/banner" >
+ ...
+ <activity
+ android:name="com.example.android.MainActivity"
+ android:label="@string/app_name" >
+
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
+ <activity
+ android:name="com.example.android.<strong>TvActivity</strong>"
+ android:label="@string/app_name"
+ android:theme="@style/Theme.Leanback">
+
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="<strong>android.intent.category.LEANBACK_LAUNCHER</strong>" />
+ </intent-filter>
+
+ </activity>
+</application>
+</pre>
+
+<p>
+ この例では、2 番目のアクティビティのマニフェスト エントリが、TV 端末で起動するアクティビティを指定しています。
+</p>
+
+<p class="caution">
+ <strong>警告:</strong>アプリに {@link android.content.Intent#CATEGORY_LEANBACK_LAUNCHER} インテント フィルタを含めない場合、TV 端末で Google Play ストアを開いているユーザーにアプリが表示されません。開発者ツールを使用して TV 端末にロードする際にこのフィルタがない場合も、TV のユーザー にはアプリインターフェースが表示されません。
+</p>
+
+<p>
+ TV 向け用途で既存のアプリを変更する場合は、携帯電話やタブレットと同じアクティビティのレイアウトを使用しないでください。TV アプリや既存のアプリの TV 向け部分については、ソファでくつろぎながら TV リモコンを使用して、簡単にナビゲートできるシンプルなユーザー インターフェースを提供する必要があります。TV 向けアプリをデザインする際のガイドラインについては、<a href="{@docRoot}design/tv/index.html">TV 向けデザイン</a>ガイドを参照してください。TV のインターフェースのレイアウトに関する最低限の実装要件については<a href="{@docRoot}training/tv/start/layouts.html">TV 用のレイアウトをビルドする</a>を参照してください。
+</p>
+
+
+<h3 id="no-touchscreen">タッチスクリーンの不要を宣言する</h3>
+
+<p>
+ TV 端末向けアプリでは、入力はタッチスクリーンに依存しません 。これを明確にするために、TV アプリのマニフェストで {@code android.hardware.touchscreen} 機能が不要であることを宣言する必要があります。この設定により、アプリが TV 端末向けであると判別しますので、Google Play 内で TV アプリと認識される上で必要です。次のコード例では、マニフェストに宣言を含める方法を示します。
+</p>
+
+<pre>
+<manifest>
+ <strong><uses-feature android:name="android.hardware.touchscreen"
+ android:required="false" /></strong>
+ ...
+</manifest>
+</pre>
+
+<p class="caution">
+ <strong>警告:</strong>このコード例のようにアプリのマニフェストでタッチスクリーンが不要であると宣言しないと、アプリが TV 端末の Google Play ストアに表示されません。
+</p>
+
+<h3 id="banner">ホーム スクリーンにバナーを配置する</h3>
+
+<p>
+ アプリに Leanback ランチャーのインテント フィルタが含まれている場合は、ホーム スクリーンにバナーを配置する必要があります。バナーは、アプリやゲームの行のホーム スクリーン上に表示されるアプリの起動ポイントです。次のようにマニフェストにバナーを記述します。
+</p>
+
+<pre>
+<application
+ ...
+ android:banner="@drawable/banner" >
+
+ ...
+</application>
+</pre>
+
+<p>
+ <a href="{@docRoot}guide/topics/manifest/application-element.html#banner">{@code android:banner}</a> 属性を使用して、<a href="{@docRoot}guide/topics/manifest/application.html"><code><application></code></a> タグとともにアプリのすべてのアクティビティにデフォルトのバナーを配置するか、<a href="{@docRoot}guide/topics/manifest/activity-element.html"><code><activity></code></a> タグとともに特定のアクティビティにバナーを配置します。
+</p>
+
+<p>
+ TV 向けデザインの UI パターンガイドの<a href="{@docRoot}design/tv/patterns.html#banner">バナー</a>を参照してください。
+</p>
+
+<h2 id="tv-libraries">TV サポート ライブラリを追加する</h3>
+
+<p>
+ Android SDK には、TV アプリ向けのサポート ライブラリが用意されています。これらのライブラリでは、TV 端末向けに使用できる API とユーザー インターフェース ウィジェットを提供しています。同ライブラリは {@code <sdk>/extras/android/support/} ディレクトリにあります。ライブラリとその全般的な用途の一覧を次に示します。
+</p>
+
+<ul>
+ <li><a href="{@docRoot}tools/support-library/features.html#v17-leanback"> <strong>v17 leanback ライブラリ</strong></a> - 特にメディア再生用のアプリ向けに、TV アプリのユーザー インターフェース ウィジェットを提供します。
+ </li>
+ <li><a href="{@docRoot}tools/support-library/features.html#v7-recyclerview"> <strong>v7 recyclerview ライブラリ</strong></a> - メモリ効率に配慮した方法で、項目の多いリストの表示を管理するためのクラスを提供します。 v17 leanback ライブラリ内のクラスの一部は、このライブラリ内のクラスに依存します。
+ </li>
+ <li><a href="{@docRoot}tools/support-library/features.html#v7-cardview"> <strong>v7 cardview ライブラリ</strong></a> - メディア アイテムの画像や説明などの情報カードを表示するためのユーザー インターフェース ウィジェットを提供します。
+ </li>
+</ul>
+
+<p class="note">
+ <strong>注意:</strong>これらのサポート ライブラリは TV アプリに必須ではありませんが、特にメディア カタログのブラウジング インターフェースを提供するアプリについては使用することを強くお勧めします。
+</p>
+
+<p>
+ v17 leanback ライブラリを使用する場合、<a href="{@docRoot}tools/support-library/features.html#v4">v4 サポート ライブラリ</a> に依存していることに注意してください。つまり、leanback ライブラリを使用するアプリには、次のサポート ライブラリをすべて含める必要があります。
+</p>
+
+<ul>
+ <li>v4 サポート ライブラリ</li>
+ <li>v7 recyclerview サポート ライブラリ</li>
+ <li>v17 leanback サポート ライブラリ</li>
+</ul>
+
+<p>
+ v17 leanback ライブラリには、アプリのプロジェクトに含める際に、特定の手順を踏む必要があるリソースが含まれています。リソースを使用してサポート ライブラリをインポートする手順については、<a href="{@docRoot}tools/support-library/setup.html#libs-with-res">サポート ライブラリのセットアップ</a>を参照してください。
+</p>
+
+
+<h2 id="build-it">TV アプリをビルドする</h2>
+
+<p>上記の手順を完了したら、TV 向けアプリのビルドに取りかかりましょう。TV アプリのビルドに役立つ次の補足的なトピックに目を通してください。 <ul>
+ <li>
+ <a href="{@docRoot}training/tv/playback/index.html">TV 再生アプリのビルド</a> - TV は娯楽用途に特化されていますので、Android では、ユーザーがビデオや音楽を再生したり、必要なコンテンツをブラウズできたりする TV アプリのビルド向けに、ユーザー インターフェース ツールとウィジェット一式を提供しています。
+ </li>
+ <li>
+ <a href="{@docRoot}training/tv/search/index.html">TV でのコンテンツの露出</a> - ユーザーがすべてのコンテンツを見ながら、お目当てのコンテンツを探し出せるようにすることは、コンテンツ自体の提供と同程度に重要です。このトレーニングでは、TV 端末上にコンテンツを露出させる方法について説明します。
+ </li>
+ <li>
+ <a href="{@docRoot}training/tv/games/index.html">TV 向けゲーム</a> - TV 端末は、ゲームに非常に適したプラットフォームです。TV 向けの優れたゲーム エクスペリエンスのビルド方法については、このトピックを参照してください。
+ </li>
+</ul>
+
+
+<h2 id="run">TV アプリを実行する</h2>
+
+<p>
+ アプリの実行は、開発プロセスの重要な一部です。Android SDK の AVD Manager では端末定義を提供しており、アプリの実行やテスト用の仮想 TV 端末を作成することができます。
+</p>
+
+<p>仮想 TV 端末を作成するには:</p>
+
+<ol>
+ <li>AVD Manager を起動します。詳細については、<a href="{@docRoot}tools/help/avd-manager.html">AVD Manager</a> のヘルプを参照してください。</li>
+ <li>[AVD Manager] ダイアログで [<strong>端末定義</strong>] タブをクリックします。</li>
+ <li>Android の TV 端末定義を選択し、[<strong>AVD の作成</strong>] をクリックします。</li>
+ <li>エミュレータのオプションを選択して、[<strong>OK</strong>] をクリックして AVD を作成します。 <p class="note">
+ <strong>注意:</strong>TV 用のエミュレータ端末で最高のパフォーマンスを得るには、[<strong>ホスト GPU を使用</strong>] オプションを有効にし、サポートされている場合には、仮想端末のアクセラレーションを使用します。エミュレータのハードウェア アクセラレーションについては、<a href="{@docRoot}tools/devices/emulator.html#acceleration">エミュレータを使用する</a>を参照してください。
+ </p>
+ </li>
+</ol>
+
+<p>仮想 TV 端末上でアプリをテストするには:</p>
+
+<ol>
+ <li>自分の開発環境に TV アプリをコンパイルします。</li>
+ <li>自分の開発環境からアプリを実行し、ターゲットの TV 仮想端末を選択します。</li>
+</ol>
+
+<p>
+ エミュレータの使用方法については、<a href="{@docRoot}tools/devices/emulator.html">エミュレータを使用する</a>を参照してください。Android Studio から仮想端末へのアプリのデプロイについては、<a href="{@docRoot}sdk/installing/studio-debug.html">Android Studio を使用してデバッグする</a>を参照してください。ADT を使用した Eclipse からエミュレータへのアプリのデプロイについては、<a href="{@docRoot}tools/building/building-eclipse.html">Eclipse から ADT を使用してビルド、実行する</a>を参照してください。
+</p>
diff --git a/docs/html/about/dashboards/index.jd b/docs/html/about/dashboards/index.jd
index 063084d..5265f20 100644
--- a/docs/html/about/dashboards/index.jd
+++ b/docs/html/about/dashboards/index.jd
@@ -57,7 +57,7 @@
</div>
-<p style="clear:both"><em>Data collected during a 7-day period ending on December 1, 2014.
+<p style="clear:both"><em>Data collected during a 7-day period ending on January 5, 2015.
<br/>Any versions with less than 0.1% distribution are not shown.</em>
</p>
@@ -88,7 +88,7 @@
</div>
-<p style="clear:both"><em>Data collected during a 7-day period ending on December 1, 2014.
+<p style="clear:both"><em>Data collected during a 7-day period ending on January 5, 2015.
<br/>Any screen configurations with less than 0.1% distribution are not shown.</em></p>
@@ -108,7 +108,7 @@
<img alt="" style="float:right"
-src="//chart.googleapis.com/chart?chl=GL%202.0%7CGL%203.0&chf=bg%2Cs%2C00000000&chd=t%3A72.2%2C27.8&chco=c4df9b%2C6fad0c&cht=p&chs=400x250" />
+src="//chart.googleapis.com/chart?chl=GL%202.0%7CGL%203.0&chf=bg%2Cs%2C00000000&chd=t%3A69.9%2C30.1&chco=c4df9b%2C6fad0c&cht=p&chs=400x250" />
<p>To declare which version of OpenGL ES your application requires, you should use the {@code
@@ -127,17 +127,17 @@
</tr>
<tr>
<td>2.0</td>
-<td>72.2%</td>
+<td>69.9%</td>
</tr>
<tr>
<td>3.0</td>
-<td>27.8%</td>
+<td>30.1%</td>
</tr>
</table>
-<p style="clear:both"><em>Data collected during a 7-day period ending on December 1, 2014</em></p>
+<p style="clear:both"><em>Data collected during a 7-day period ending on January 5, 2015</em></p>
@@ -155,42 +155,42 @@
var VERSION_DATA =
[
{
- "chart": "//chart.googleapis.com/chart?chl=Froyo%7CGingerbread%7CIce%20Cream%20Sandwich%7CJelly%20Bean%7CKitKat&chf=bg%2Cs%2C00000000&chd=t%3A0.5%2C9.1%2C7.8%2C48.7%2C33.9&chco=c4df9b%2C6fad0c&cht=p&chs=500x250",
+ "chart": "//chart.googleapis.com/chart?cht=p&chs=500x250&chco=c4df9b%2C6fad0c&chd=t%3A0.4%2C7.8%2C6.7%2C46.0%2C39.1&chf=bg%2Cs%2C00000000&chl=Froyo%7CGingerbread%7CIce%20Cream%20Sandwich%7CJelly%20Bean%7CKitKat",
"data": [
{
"api": 8,
"name": "Froyo",
- "perc": "0.5"
+ "perc": "0.4"
},
{
"api": 10,
"name": "Gingerbread",
- "perc": "9.1"
+ "perc": "7.8"
},
{
"api": 15,
"name": "Ice Cream Sandwich",
- "perc": "7.8"
+ "perc": "6.7"
},
{
"api": 16,
"name": "Jelly Bean",
- "perc": "21.3"
+ "perc": "19.2"
},
{
"api": 17,
"name": "Jelly Bean",
- "perc": "20.4"
+ "perc": "20.3"
},
{
"api": 18,
"name": "Jelly Bean",
- "perc": "7.0"
+ "perc": "6.5"
},
{
"api": 19,
"name": "KitKat",
- "perc": "33.9"
+ "perc": "39.1"
}
]
}
@@ -203,29 +203,29 @@
"data": {
"Large": {
"hdpi": "0.6",
- "ldpi": "0.5",
- "mdpi": "4.6",
- "tvdpi": "2.0",
+ "ldpi": "0.6",
+ "mdpi": "5.4",
+ "tvdpi": "2.3",
"xhdpi": "0.6"
},
"Normal": {
- "hdpi": "36.9",
- "mdpi": "9.4",
- "tvdpi": "0.2",
- "xhdpi": "18.8",
+ "hdpi": "37.5",
+ "mdpi": "8.8",
+ "tvdpi": "0.1",
+ "xhdpi": "18.4",
"xxhdpi": "16.3"
},
"Small": {
- "ldpi": "5.4"
+ "ldpi": "4.8"
},
"Xlarge": {
"hdpi": "0.3",
- "mdpi": "3.8",
+ "mdpi": "3.7",
"xhdpi": "0.6"
}
},
- "densitychart": "//chart.googleapis.com/chart?chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi&chf=bg%2Cs%2C00000000&chd=t%3A5.9%2C17.8%2C2.2%2C37.8%2C20.0%2C16.3&chco=c4df9b%2C6fad0c&cht=p&chs=400x250",
- "layoutchart": "//chart.googleapis.com/chart?chl=Xlarge%7CLarge%7CNormal%7CSmall&chf=bg%2Cs%2C00000000&chd=t%3A4.7%2C8.3%2C81.6%2C5.4&chco=c4df9b%2C6fad0c&cht=p&chs=400x250"
+ "densitychart": "//chart.googleapis.com/chart?cht=p&chs=400x250&chco=c4df9b%2C6fad0c&chd=t%3A5.4%2C17.9%2C2.4%2C38.4%2C19.6%2C16.3&chf=bg%2Cs%2C00000000&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi",
+ "layoutchart": "//chart.googleapis.com/chart?cht=p&chs=400x250&chco=c4df9b%2C6fad0c&chd=t%3A4.6%2C9.5%2C81.1%2C4.8&chf=bg%2Cs%2C00000000&chl=Xlarge%7CLarge%7CNormal%7CSmall"
}
];
diff --git a/docs/html/about/versions/lollipop.jd b/docs/html/about/versions/lollipop.jd
index 458de49..1ad5d24 100644
--- a/docs/html/about/versions/lollipop.jd
+++ b/docs/html/about/versions/lollipop.jd
@@ -84,7 +84,7 @@
</div>
-<p>Ripple animations are available for buttons, checkboxes, and other touch controls in your app.
+<p>Ripple animations are available for buttons, checkboxes, and other touch controls in your app.
<p>You can also define vector drawables in XML and animate them in a variety of ways. Vector drawables scale without losing definition, so they are perfect for single-color in-app icons.</p>
@@ -189,7 +189,9 @@
<p>Android 5.0 introduces <strong>all new camera APIs</strong> that let you capture raw formats such as YUV and Bayer RAW, and control parameters such as exposure time, ISO sensitivity, and frame duration on a per-frame basis. The new fully-synchronized camera pipeline allows you to capture uncompressed full-resolution YUV images at 30 FPS on supported devices.</p>
-<p>Along with images, you can also capture metadata like noise models and optical information from the camera.</p>
+<p>In addition to giving greater control over image capture, the new APIs also
+expose detailed information about the camera's properties and capabilities and
+provide metadata that describes the capture settings of each frame.</p>
<p>Apps sending video streams over the network can now take advantage of H.265 <strong>High Efficiency Video Coding (HEVC)</strong> for optimized encoding and decoding of video data. </p>
diff --git a/docs/html/design/tv/index.jd b/docs/html/design/tv/index.jd
index d79e279..def1286 100644
--- a/docs/html/design/tv/index.jd
+++ b/docs/html/design/tv/index.jd
@@ -38,7 +38,7 @@
<p>To learn more about searching within your app, see
<a href="{@docRoot}training/tv/discovery/in-app-search.html">Searching within TV Apps</a>.
-<h2>Recommendations</h2>
+<h2 id="recommendations">Recommendations</h2>
<p>The recommendations row on Android TV is a central feature of the Home Screen that allows
users quick access to dynamic and relevant content for their media-consumption activities. The
diff --git a/docs/html/design/tv/patterns.jd b/docs/html/design/tv/patterns.jd
index be7ae31..e786ee5 100644
--- a/docs/html/design/tv/patterns.jd
+++ b/docs/html/design/tv/patterns.jd
@@ -15,24 +15,16 @@
<img src="{@docRoot}design/tv/images/focus.png" alt="TV navigation and focus diagram" />
-<p>A key aspect of making your application work well with a D-Pad controller is to make sure
+<p>A key aspect of making your application work well with a D-pad controller is to make sure
that there is always an object that is obviously in focus. Your app must clearly indicate
what object is focused, so users can easily see what action they can take. Use scale, shadow
brightness, opacity, animation or a combination of these attributes to help users see a focused
object.</p>
+<h2 id="banner">App and Game Banners</h3>
-<h2>Icons</h2>
-
-<p>Apps on TV devices require some additional icon images for presentation in the system
- user interface, including home screen launcher images (banners) and recommendation icons.
- The visual specifications for these icons are shown below.</p>
-
-
-<h3 id="banner">Banners</h3>
-
-<p>App Banners represent your app on the home screen of TV devices and serve and as a way for
- users to launch your app. Here are specific requirements for a banner image:
+<p>App Banners represent your app or game on the home screens of TV devices and serve and as a way for
+ users to launch your app. Here are the specific requirements for a banner image:
</p>
<ul>
@@ -44,45 +36,97 @@
<p>See <a href="{@docRoot}training/tv/start/start.html#banner">Provide a home screen banner</a>
in Get Started with TV Apps for more information.</p>
-<h3>Recommendation Icons</h3>
+<h2 id="recommendation">Recommendations</h2>
-<p>Recommendation cards include a small icon that is imposed over a colored background.
- An example and specifications for this icon are shown below:</p>
+<p>The first row of the Android TV home screen displays cards for content recommended by applications.
+Your application provides these recommendations, as described in <a href="{@docRoot}training/tv/discovery/recommendations.html">
+</a>. For a visual overview of recommendations, see <a href="design/tv/index.html#recommendations">
+Design for Android TV</a>.</p>
-<img src="{@docRoot}design/tv/images/icon.png" alt="Recommendation icon examples" />
+<div class="layout-content-row">
+ <div class="layout-content-col span-8 with-callouts">
-<p>Here are the requirements for recommendation icons:</p>
+ <p>The design elements of the recommendation card are as follows:</p>
+ <ol>
+ <li><strong>Large icon</strong></li>
+ <li><strong>Content title</strong></li>
+ <li><strong>Content text</strong></li>
+ <li><strong>Small icon</strong></li>
+ </ol>
+
+ <p>The design specifications for these elements are described below.</p>
+
+ <p>You can also set a background image (not shown) and the color of the card's text area in the
+ recommendation notification. See <a href="{@docRoot}training/tv/discovery/recommendations.html">
+ Recommendations</a> for more information.</p>
+
+ </div>
+ <div class="layout-content-col span-5">
+
+ <img src="{@docRoot}images/tv/recommend-card.png">
+
+ </div>
+</div>
+
+<h3>Background Image</h3>
+
+<p>The background image also appears behind the recommendations
+row and fills the Android TV home screen when the user selects the recommendation card. This image
+should be different than the one provided for the large icon, and meet the following specifications:</p>
<ul>
- <li>Monocolor: size 16x16dp, white (#fff) icon with transparent background, PNG format</li>
- <li>Graphics should be centered within the icon image</li>
+ <li>Measure 2016 x 1134 pixels (1920 x 1080 plus 5% margin for for motion)</li>
+ <li id="solid-background">Must not be transparent</li>
</ul>
<p class="note">
- <strong>Note:</strong> Your app icon image may be desaturated and blended for some card
- displays.
+ <strong>Note:</strong> If the background image does not meet the size requirements, the system
+ scales it to fit.
</p>
-
-<h2>Background Images</h2>
-
-<p>Background images are displayed in the background of your app to provide additional visual
- interest, information, or branding. The user interface widgets provided in the <a href="{@docRoot}tools/support-library/features.html#v17-leanback">v17 leanback support
+<p>The user interface widgets provided in the
+ <a href="{@docRoot}tools/support-library/features.html#v17-leanback">v17 leanback support
library</a> provide specific support for background images and for updating them as items gain
- and lose focus. The specific requirements for background images on TV devices is that they
- should be full color and a size of 1920 x 1080 pixels.
+ and lose focus.
</p>
-<p class="note" id="solid-background">
- <strong>Important:</strong> Background images must not be transparent. Your must not allow any
- portion of another app to be seen through your app.
-</p>
+<h3 id="icons">Icons</h3>
+
+<h4>Large icon</h4>
+
+<p>Typically, the large icon is an image of the content for the recommendation. It appears
+above a colored area that contains the recommendation content title and text. This image should be
+different from that which you provide for the background image, and conform to the following
+specifications:</p>
+
+<ul>
+ <li>Height: 176dp or more</li>
+ <li>Minimum width: 2/3 of the height (117dp for an image 176dp in height)</li>
+ <li>Max width: 4/3 of the height (234dp for an image 176dp in height)</li>
+ <li>Must not be transparent</li>
+</ul>
<p class="note">
- <strong>Note:</strong> If you background image does not meet the size requirements, it is scaled
- to fit.
+ <strong>Note:</strong> If the large icon does not meet the size requirements, the system
+ scales it to fit.
</p>
+<h4>Small icon</h4>
+
+<p>Recommendation cards include a small icon that is imposed over a colored background. The icon and
+background color display at 100% opacity when the card is selected, and at 50% opacity when not
+selected.</p>
+
+<img src="{@docRoot}design/tv/images/icon.png" alt="Recommendation icon examples" />
+
+<p>Here are the requirements for recommendation small icons:</p>
+
+<ul>
+ <li>Flat image</li>
+ <li>Monocolor: size 16x16dp, white (#fff) icon with transparent background, PNG format</li>
+ <li>Graphics should be centered within the icon image</li>
+</ul>
+
<h2>Audio Feedback</h2>
<p>Sounds on Android TV bring a cinematic quality to the interaction experience. You should
diff --git a/docs/html/design/wear/watchfaces.jd b/docs/html/design/wear/watchfaces.jd
index 1a4b1f9..99dc3dd 100644
--- a/docs/html/design/wear/watchfaces.jd
+++ b/docs/html/design/wear/watchfaces.jd
@@ -112,17 +112,17 @@
in ambient mode, it will look even better in interactive mode. The opposite is not always
true.</p>
-<p>In ambient mode, the screen is only updated once every minute. Only show hours and minutes
-in ambient mode; do not show seconds in this mode.</p>
-
<h3>Interactive mode</h3>
<p>When the user moves their wrist to glance at their watch, the screen goes into interactive
mode. Your design can use full color with fluid animation in this mode.</p>
<h3>Ambient mode</h3>
-<p>Ambient mode helps the device conserve power. In this mode, the screen only displays shades
-of grey, black, and white. Your watch face is notified when the device switches to ambient mode,
-and you should thoughtfully design for it.</p>
+<p>Ambient mode helps the device conserve power. Your design should make clear to the user that
+the screen is in ambient mode by using only grayscale colors. Do not use a lot of white in ambient
+mode, since this distracting and hurts battery life on some screens. In this mode, the screen
+is only updated once every minute. Only show hours and minutes in ambient mode; do not show
+seconds. Your watch face is notified when the device switches to ambient mode, and you should
+thoughtfully design for it.</p>
diff --git a/docs/html/google/play-services/maps.jd b/docs/html/google/play-services/maps.jd
index 7a61d6c..9bf5f80 100644
--- a/docs/html/google/play-services/maps.jd
+++ b/docs/html/google/play-services/maps.jd
@@ -13,7 +13,7 @@
<div class="col-6">
<h1 itemprop="name" style="margin-bottom:0;">Google Maps Android API v2</h1>
- <p itemprop="description">Allow your users explore the world with rich maps provided by
+ <p itemprop="description">Allow your users to explore the world with rich maps provided by
Google. Identify locations with <b>custom markers</b>, augment the map data
with <b>image overlays</b>, embed <b>one or more maps</b> as fragments,
and much more.</p>
diff --git a/docs/html/google/play-services/setup.jd b/docs/html/google/play-services/setup.jd
index cb3fa17..148f5a6 100644
--- a/docs/html/google/play-services/setup.jd
+++ b/docs/html/google/play-services/setup.jd
@@ -66,8 +66,8 @@
...
dependencies {
- compile 'com.android.support:appcompat-v7:20.+'
- <strong>compile 'com.google.android.gms:play-services:6.5.+'</strong>
+ compile 'com.android.support:appcompat-v7:21.0.3'
+ <strong>compile 'com.google.android.gms:play-services:6.5.87'</strong>
}
</pre>
<p>Be sure you update this version number each time Google Play services is updated.</p>
@@ -106,14 +106,14 @@
<code>build.gradle</code> file:</p>
<pre class="no-pretty-print">
-compile 'com.google.android.gms:play-services:6.5.+'
+compile 'com.google.android.gms:play-services:6.5.87'
</pre>
<p>with these lines:</p>
<pre class="no-pretty-print">
-compile 'com.google.android.gms:play-services-fitness:6.5.+'
-compile 'com.google.android.gms:play-services-wearable:6.5.+'
+compile 'com.google.android.gms:play-services-fitness:6.5.87'
+compile 'com.google.android.gms:play-services-wearable:6.5.87'
</pre>
<p>Table 1 shows a list of the separate APIs that you can include when compiling your app, and
@@ -131,55 +131,55 @@
</tr>
<tr>
<td>Google+</td>
- <td>com.google.android.gms:play-services-plus:6.5.+</td>
+ <td>com.google.android.gms:play-services-plus:6.5.87</td>
</tr>
<tr>
<td>Google Account Login</td>
- <td>com.google.android.gms:play-services-identity:6.5.+</td>
+ <td>com.google.android.gms:play-services-identity:6.5.87</td>
</tr>
<tr>
<td>Google Activity Recognition</td>
- <td>com.google.android.gms:play-services-location:6.5.+</td>
+ <td>com.google.android.gms:play-services-location:6.5.87</td>
</tr>
<tr>
<td>Google App Indexing</td>
- <td>com.google.android.gms:play-services-appindexing:6.5.+</td>
+ <td>com.google.android.gms:play-services-appindexing:6.5.87</td>
</tr>
<tr>
<td>Google Cast</td>
- <td>com.google.android.gms:play-services-cast:6.5.+</td>
+ <td>com.google.android.gms:play-services-cast:6.5.87</td>
</tr>
<tr>
<td>Google Drive</td>
- <td>com.google.android.gms:play-services-drive:6.5.+</td>
+ <td>com.google.android.gms:play-services-drive:6.5.87</td>
</tr>
<tr>
<td>Google Fit</td>
- <td>com.google.android.gms:play-services-fitness:6.5.+</td>
+ <td>com.google.android.gms:play-services-fitness:6.5.87</td>
</tr>
<tr>
<td>Google Maps</td>
- <td>com.google.android.gms:play-services-maps:6.5.+</td>
+ <td>com.google.android.gms:play-services-maps:6.5.87</td>
</tr>
<tr>
<td>Google Mobile Ads</td>
- <td>com.google.android.gms:play-services-ads:6.5.+</td>
+ <td>com.google.android.gms:play-services-ads:6.5.87</td>
</tr>
<tr>
<td>Google Panorama Viewer</td>
- <td>com.google.android.gms:play-services-panorama:6.5.+</td>
+ <td>com.google.android.gms:play-services-panorama:6.5.87</td>
</tr>
<tr>
<td>Google Play Game services</td>
- <td>com.google.android.gms:play-services-games:6.5.+</td>
+ <td>com.google.android.gms:play-services-games:6.5.87</td>
</tr>
<tr>
<td>Google Wallet</td>
- <td>com.google.android.gms:play-services-wallet:6.5.+</td>
+ <td>com.google.android.gms:play-services-wallet:6.5.87</td>
</tr>
<tr>
<td>Android Wear</td>
- <td>com.google.android.gms:play-services-wearable:6.5.+</td>
+ <td>com.google.android.gms:play-services-wearable:6.5.87</td>
</tr>
<tr>
<td>
@@ -187,7 +187,7 @@
Google Analytics<br>
Google Cloud Messaging<br>
</td>
- <td>com.google.android.gms:play-services-base:6.5.+</td>
+ <td>com.google.android.gms:play-services-base:6.5.87</td>
</tr>
</table>
diff --git a/docs/html/guide/components/intents-common.jd b/docs/html/guide/components/intents-common.jd
index 5238cd9..16965b3 100644
--- a/docs/html/guide/components/intents-common.jd
+++ b/docs/html/guide/components/intents-common.jd
@@ -1754,7 +1754,7 @@
</div>
<p>To call a taxi, use the
-<a href="{@docRoot}com/google/android/gms/actions/ReserveIntents.html#ACTION_RESERVE_TAXI_RESERVATION"><code>ACTION_RESERVE_TAXI_RESERVATION</code></a>
+<a href="{@docRoot}reference/com/google/android/gms/actions/ReserveIntents.html#ACTION_RESERVE_TAXI_RESERVATION"><code>ACTION_RESERVE_TAXI_RESERVATION</code></a>
action.</p>
<p class="note"><strong>Note:</strong> Apps must ask for confirmation from the user
@@ -1762,7 +1762,7 @@
<dl>
<dt><b>Action</b></dt>
- <dd><a href="{@docRoot}com/google/android/gms/actions/ReserveIntents.html#ACTION_RESERVE_TAXI_RESERVATION"><code>ACTION_RESERVE_TAXI_RESERVATION</code></a></dd>
+ <dd><a href="{@docRoot}reference/com/google/android/gms/actions/ReserveIntents.html#ACTION_RESERVE_TAXI_RESERVATION"><code>ACTION_RESERVE_TAXI_RESERVATION</code></a></dd>
<dt><b>Data URI</b></dt>
<dd>None</dd>
diff --git a/docs/html/guide/topics/manifest/uses-feature-element.jd b/docs/html/guide/topics/manifest/uses-feature-element.jd
index 59bf71c..2385592 100644
--- a/docs/html/guide/topics/manifest/uses-feature-element.jd
+++ b/docs/html/guide/topics/manifest/uses-feature-element.jd
@@ -27,12 +27,12 @@
</div>
</div>
- <div class="sidebox-wrapper">
+ <div class="sidebox-wrapper">
<div class="sidebox">
- <img src="{@docRoot}assets/images/icon_play.png" style="float:left;margin:0;padding:0;">
- <p style="color:#669999;padding-top:1em;">Google Play Filtering</p>
+ <img src="{@docRoot}assets/images/icon_play.png" style="float:left;margin:0;padding:0;">
+ <p style="color:#669999;padding-top:1em;">Google Play Filtering</p>
<p style="padding-top:1em;">Google Play uses the <code><uses-feature></code>
- elements declared in your app manifest to filter your app from devices
+ elements declared in your app manifest to filter your app from devices
that do not meet it's hardware and software feature requirements. </p>
<p style="margin-top:1em;">By specifying the features that your application requires,
@@ -98,7 +98,7 @@
<p>Declared <code><uses-feature></code> elements are informational only, meaning
that the Android system itself does not check for matching feature support on
the device before installing an application. However, other services
-(such as Google Play) or applications may check your application's
+(such as Google Play) or applications may check your application's
<code><uses-feature></code> declarations as part of handling or interacting
with your application. For this reason, it's very important that you declare all of
the features (from the list below) that your application uses. </p>
@@ -124,7 +124,7 @@
software, while declaring the features used by your application ensures proper
device compatibility.</p>
-</dd>
+</dd>
<dt>attributes:</dt>
@@ -352,7 +352,7 @@
<p>If you don't want Google Play to filter based on a specific implied
feature, you can disable that behavior. To do so, declare the feature explicitly
-in a <code><uses-feature></code> element and include an
+in a <code><uses-feature></code> element and include an
<code>android:required="false"</code> attribute. For example, to disable
filtering derived from the <code>CAMERA</code> permission, you would declare
the feature as shown below.</p>
@@ -560,7 +560,7 @@
<td></td>
</tr>
<tr>
- <td rowspan="10">Camera</td>
+ <td rowspan="6">Camera</td>
<td><code>android.hardware.camera</code></td>
<td>The application uses the device's camera. If the device supports
multiple cameras, the application uses the camera that facing
@@ -757,9 +757,9 @@
<td>Television</td>
<td><code>android.hardware.type.television</code></td>
<td>The application is designed for a television user experience.</td>
- <td>This feature defines "television" to be a typical living room television experience:
- displayed on a big screen, where the user is sitting far away and the dominant form of
- input is something like a d-pad, and generally not through touch or a
+ <td>This feature defines "television" to be a typical living room television experience:
+ displayed on a big screen, where the user is sitting far away and the dominant form of
+ input is something like a d-pad, and generally not through touch or a
mouse/pointer-device.</td>
</tr>
@@ -896,9 +896,9 @@
<table>
-<tr>
+<tr>
<th>Feature</th>
- <th>Attribute Value</th>
+ <th>Attribute Value</th>
<th>Description</th>
</tr>
<tr>
@@ -981,7 +981,7 @@
<pre><uses-feature android:name="android.hardware.camera" android:required="false" /></pre>
<table id="permissions-features" >
- <tr>
+ <tr>
<th>Category</th>
<th>This Permission...</th>
<th>Implies This Feature Requirement</th>
diff --git a/docs/html/guide/topics/search/searchable-config.jd b/docs/html/guide/topics/search/searchable-config.jd
index e38024c..4874bb4 100644
--- a/docs/html/guide/topics/search/searchable-config.jd
+++ b/docs/html/guide/topics/search/searchable-config.jd
@@ -32,26 +32,26 @@
<pre class="stx">
<?xml version="1.0" encoding="utf-8"?>
<<a href="#searchable-element">searchable</a> xmlns:android="http://schemas.android.com/apk/res/android"
- android:label="<em>string resource</em>"
- android:hint="<em>string resource</em>"
- android:searchMode=["queryRewriteFromData" | "queryRewriteFromText"]
- android:searchButtonText="<em>string resource</em>"
- android:inputType="<em>{@link android.R.attr#inputType}</em>"
- android:imeOptions="<em>{@link android.R.attr#imeOptions}</em>"
- android:searchSuggestAuthority="<em>string</em>"
- android:searchSuggestPath="<em>string</em>"
- android:searchSuggestSelection="<em>string</em>"
- android:searchSuggestIntentAction="<em>string</em>"
- android:searchSuggestIntentData="<em>string</em>"
- android:searchSuggestThreshold="<em>int</em>"
- android:includeInGlobalSearch=["true" | "false"]
- android:searchSettingsDescription="<em>string resource</em>"
- android:queryAfterZeroResults=["true" | "false"]
- android:voiceSearchMode=["showVoiceSearchButton" | "launchWebSearch" | "launchRecognizer"]
- android:voiceLanguageModel=["free-form" | "web_search"]
- android:voicePromptText="<em>string resource</em>"
- android:voiceLanguage="<em>string</em>"
- android:voiceMaxResults="<em>int</em>"
+ android:<a href="#label">label</a>="<em>string resource</em>"
+ android:<a href="#hint">hint</a>="<em>string resource</em>"
+ android:<a href="#searchMode">searchMode</a>=["queryRewriteFromData" | "queryRewriteFromText"]
+ android:<a href="#searchButtonText">searchButtonText</a>="<em>string resource</em>"
+ android:<a href="#inputType">inputType</a>="<em>{@link android.R.attr#inputType}</em>"
+ android:<a href="#imeOptions">imeOptions</a>="<em>{@link android.R.attr#imeOptions}</em>"
+ android:<a href="#searchSuggestAuthority">searchSuggestAuthority</a>="<em>string</em>"
+ android:<a href="#searchSuggestPath">searchSuggestPath</a>="<em>string</em>"
+ android:<a href="#searchSuggestSelection">searchSuggestSelection</a>="<em>string</em>"
+ android:<a href="#searchSuggestIntentAction">searchSuggestIntentAction</a>="<em>string</em>"
+ android:<a href="#searchSuggestIntentData">searchSuggestIntentData</a>="<em>string</em>"
+ android:<a href="#searchSuggestThreshold">searchSuggestThreshold</a>="<em>int</em>"
+ android:<a href="#includeInGlobalSearch">includeInGlobalSearch</a>=["true" | "false"]
+ android:<a href="#searchSettingsDescription">searchSettingsDescription</a>="<em>string resource</em>"
+ android:<a href="#queryAfterZeroResults">queryAfterZeroResults</a>=["true" | "false"]
+ android:<a href="#voiceSearchMode">voiceSearchMode</a>=["showVoiceSearchButton" | "launchWebSearch" | "launchRecognizer"]
+ android:<a href="#voiceLanguageModel">voiceLanguageModel</a>=["free-form" | "web_search"]
+ android:<a href="#voicePromptText">voicePromptText</a>="<em>string resource</em>"
+ android:<a href="#voiceLanguage">voiceLanguage</a>="<em>string</em>"
+ android:<a href="#voiceMaxResults">voiceMaxResults</a>="<em>int</em>"
>
<<a href="#actionkey-element">actionkey</a>
android:keycode="<em>{@link android.view.KeyEvent KEYCODE}</em>"
@@ -69,7 +69,7 @@
<dd>Defines all search configurations used by the Android system to provide assisted search.
<p class="caps">attributes:</p>
<dl class="atn-list">
- <dt><code>android:label</code></dt>
+ <dt><a name="label"></a><code>android:label</code></dt>
<dd><em>String resource</em>. (Required.) The name of your application.
It should be the same as the name applied to the {@code android:label} attribute of your <a
href="{@docRoot}guide/topics/manifest/activity-element.html#label">{@code <activity>}</a> or
@@ -78,14 +78,14 @@
<code>android:includeInGlobalSearch</code> to "true", in which case, this label is used to identify
your application as a searchable item in the system's search settings.</dd>
- <dt><code>android:hint</code></dt>
+ <dt><a name="hint"></a><code>android:hint</code></dt>
<dd><em>String resource</em>. (Recommended.) The text to display in the search text field when
no text has been entered. It provides a hint to the user about what
content is searchable. For consistency with other Android applications, you should format the
string for {@code android:hint} as "Search <em><content-or-product></em>". For example,
"Search songs and artists" or "Search YouTube".</dd>
- <dt><code>android:searchMode</code></dt>
+ <dt><a name="searchMode"></a><code>android:searchMode</code></dt>
<dd><em>Keyword</em>. Sets additional modes that control the search presentation.
Currently available modes define how the query text should be rewritten when a custom suggestion
receives focus. The following mode values are accepted:
@@ -109,19 +109,19 @@
href="adding-custom-suggestions.html#RewritingQueryText">Adding Custom Suggestions</a>.</p>
</dd>
- <dt><code>android:searchButtonText</code></dt>
+ <dt><a name="searchButtonText"></a><code>android:searchButtonText</code></dt>
<dd><em>String resource</em>. The text to display in the button that executes search. By
default, the button shows a search icon (a magnifying glass), which is ideal for
internationalization, so you should not use this attribute to change the button unless the
behavior is something other than a search (such as a URL request in a web browser).</dd>
- <dt><code>android:inputType</code></dt>
+ <dt><a name="inputType"></a><code>android:inputType</code></dt>
<dd><em>Keyword</em>. Defines the type of input method (such as the type of soft keyboard)
-to use. For most searches, in which free-form text is expected, you don't
+to use. For most searches, in which free-form text is expected, you don't
need this attribute. See {@link android.R.attr#inputType} for a list of suitable values for this
attribute.</dd>
- <dt><code>android:imeOptions</code></dt>
+ <dt><a name="imeOptions"></a><code>android:imeOptions</code></dt>
<dd><em>Keyword</em>. Supplies additional options for the input method.
For most searches, in which free-form text is expected, you don't need this attribute. The
default IME is "actionSearch" (provides the "search" button instead of a carriage
@@ -139,12 +139,12 @@
{@code <searchable>} attributes:</p><br/>
<dl class="atn-list">
- <dt><code>android:searchSuggestAuthority</code></dt>
+ <dt><a name="searchSuggestAuthority"></a><code>android:searchSuggestAuthority</code></dt>
<dd><em>String</em>. (Required to provide search suggestions.)
This value must match the authority string provided in the {@code android:authorities}
attribute of the Android manifest {@code <provider>} element.</dd>
- <dt><code>android:searchSuggestPath</code></dt>
+ <dt><a name="searchSuggestPath"></a><code>android:searchSuggestPath</code></dt>
<dd><em>String</em>. This path is used as a portion of the suggestions
query {@link android.net.Uri}, after the prefix and authority, but before
the standard suggestions path.
@@ -152,7 +152,7 @@
of suggestions (such as for different data types) and you need
a way to disambiguate the suggestions queries when you receive them.</dd>
- <dt><code>android:searchSuggestSelection</code></dt>
+ <dt><a name="searchSuggestSelection"></a><code>android:searchSuggestSelection</code></dt>
<dd><em>String</em>. This value is passed into your
query function as the {@code selection} parameter. Typically this is a WHERE clause
for your database, and should contain a single question mark, which is a placeholder for the
@@ -160,22 +160,22 @@
can also use any non-null value to trigger the delivery of the query text via the {@code
selectionArgs} parameter (and then ignore the {@code selection} parameter).</dd>
- <dt><code>android:searchSuggestIntentAction</code></dt>
+ <dt><a name="searchSuggestIntentAction"></a><code>android:searchSuggestIntentAction</code></dt>
<dd><em>String</em>. The default intent action to be used when a user
clicks on a custom search suggestion (such as {@code "android.intent.action.VIEW"}).
If this is not overridden by the selected suggestion (via the {@link
android.app.SearchManager#SUGGEST_COLUMN_INTENT_ACTION} column), this value is placed in the action
field of the {@link android.content.Intent} when the user clicks a suggestion.</dd>
- <dt><code>android:searchSuggestIntentData</code></dt>
+ <dt><a name="searchSuggestIntentData"></a><code>android:searchSuggestIntentData</code></dt>
<dd><em>String</em>. The default intent data to be used when a user
clicks on a custom search suggestion.
If not overridden by the selected suggestion (via the {@link
android.app.SearchManager#SUGGEST_COLUMN_INTENT_DATA} column), this value is
- placed in the data field of the {@link android.content.Intent} when the user clicks
+ placed in the data field of the {@link android.content.Intent} when the user clicks
a suggestion.</dd>
- <dt><code>android:searchSuggestThreshold</code></dt>
+ <dt><a name="searchSuggestThreshold"></a><code>android:searchSuggestThreshold</code></dt>
<dd><em>Integer</em>. The minimum number of characters needed to
trigger a suggestion look-up. Only guarantees that the system will not query your
content provider for anything shorter than the threshold. The default value is 0.</dd>
@@ -192,20 +192,20 @@
following {@code <searchable>} attributes:</p><br/>
<dl class="atn-list">
- <dt><code>android:includeInGlobalSearch</code></dt>
+ <dt><a name="includeInGlobalSearch"></a><code>android:includeInGlobalSearch</code></dt>
<dd><em>Boolean</em>. (Required to provide search suggestions in
Quick Search Box.) Set to "true" if you want your suggestions to be
included in the globally accessible Quick Search Box. The user must
still enable your application as a searchable item in the system search settings before
your suggestions will appear in Quick Search Box.</dd>
- <dt><code>android:searchSettingsDescription</code></dt>
+ <dt><a name="searchSettingsDescription"></a><code>android:searchSettingsDescription</code></dt>
<dd><em>String</em>. Provides a brief description of the search suggestions that you provide
to Quick Search Box, which is displayed in the searchable items entry for your application.
Your description should concisely describe the content that is searchable. For example, "Artists,
albums, and tracks" for a music application, or "Saved notes" for a notepad application.</dd>
- <dt><code>android:queryAfterZeroResults</code></dt>
+ <dt><a name="queryAfterZeroResults"></a><code>android:queryAfterZeroResults</code></dt>
<dd><em>Boolean</em>. Set to "true" if you want your content provider to be invoked for
supersets of queries that have returned zero results in the past. For example, if
your content provider returned zero results for "bo", it should be requiried for "bob". If set to
@@ -222,7 +222,7 @@
following {@code <searchable>} attributes:</p><br/>
<dl class="atn-list">
- <dt><code>android:voiceSearchMode</code></dt>
+ <dt><a name="voiceSearchMode"></a><code>android:voiceSearchMode</code></dt>
<dd><em>Keyword</em>. (Required to provide voice search capabilities.)
Enables voice search, with a specific mode for voice search.
(Voice search may not be provided by the device, in which case these flags
@@ -252,7 +252,7 @@
</table>
</dd>
- <dt><code>android:voiceLanguageModel</code></dt>
+ <dt><a name="voiceLanguageModel"></a><code>android:voiceLanguageModel</code></dt>
<dd><em>Keyword</em>. The language model that
should be used by the voice recognition system. The following values are accepted:
<table>
@@ -268,20 +268,20 @@
available in more languages than "free_form".</td>
</tr>
</table>
- <p>Also see
+ <p>Also see
{@link android.speech.RecognizerIntent#EXTRA_LANGUAGE_MODEL} for more
information.</p></dd>
- <dt><code>android:voicePromptText</code></dt>
+ <dt><a name="voicePromptText"></a><code>android:voicePromptText</code></dt>
<dd><em>String</em>. An additional message to display in the voice input dialog.</dd>
- <dt><code>android:voiceLanguage</code></dt>
+ <dt><a name="voiceLanguage"></a><code>android:voiceLanguage</code></dt>
<dd><em>String</em>. The spoken language to be expected, expressed as the string value of
a constants in {@link java.util.Locale} (such as {@code "de"} for German or {@code "fr"} for
French). This is needed only if it is different from the current value of {@link
java.util.Locale#getDefault() Locale.getDefault()}.</dd>
- <dt><code>android:voiceMaxResults</code></dt>
+ <dt><a name="voiceMaxResults"></a><code>android:voiceMaxResults</code></dt>
<dd><em>Integer</em>. Forces the maximum number of results to return,
including the "best" result which is always provided as the {@link
android.content.Intent#ACTION_SEARCH} intent's primary
@@ -308,7 +308,7 @@
other three attributes in order to define the search action.</p>
<p class="caps">attributes:</p>
<dl class="atn-list">
- <dt><code>android:keycode</code></dt>
+ <dt><a name="keycode"></a><code>android:keycode</code></dt>
<dd><em>String</em>. (Required.) A key code from {@link
android.view.KeyEvent} that represents the action key
you wish to respond to (for example {@code "KEYCODE_CALL"}). This is added to the
@@ -318,7 +318,7 @@
keys are supported for a search action, as many of them are used for typing, navigation, or system
functions.</dd>
- <dt><code>android:queryActionMsg</code></dt>
+ <dt><a name="queryActionMsg"></a><code>android:queryActionMsg</code></dt>
<dd><em>String</em>. An action message to be sent if the action key is pressed while the
user is entering query text. This is added to the
{@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} intent that the system
@@ -326,17 +326,17 @@
{@link android.content.Intent#getStringExtra
getStringExtra(SearchManager.ACTION_MSG)}.</dd>
- <dt><code>android:suggestActionMsg</code></dt>
+ <dt><a name="suggestActionMsg"></a><code>android:suggestActionMsg</code></dt>
<dd><em>String</em>. An action message to be sent if the action key is pressed while a
suggestion is in focus. This is added to the
intent that the system passes to your searchable activity (using the action
you've defined for the suggestion). To examine the string,
- use {@link android.content.Intent#getStringExtra
+ use {@link android.content.Intent#getStringExtra
getStringExtra(SearchManager.ACTION_MSG)}. This should only be used if all your
suggestions support this action key. If not all suggestions can handle the same action key, then
you must instead use the following {@code android:suggestActionMsgColumn} attribute.</dd>
- <dt><code>android:suggestActionMsgColumn</code></dt>
+ <dt><a name="suggestActionMsgColumn"></a><code>android:suggestActionMsgColumn</code></dt>
<dd><em>String</em>. The name of the column in your content provider that defines the
action message for this action key, which is to be sent if the user presses the action key while a
suggestion is in focus. This attribute lets you control the
diff --git a/docs/html/images/tv/recommend-card.png b/docs/html/images/tv/recommend-card.png
new file mode 100644
index 0000000..1cc4311
--- /dev/null
+++ b/docs/html/images/tv/recommend-card.png
Binary files differ
diff --git a/docs/html/preview/images/ActivitySceneTransitionBasic.png b/docs/html/preview/images/ActivitySceneTransitionBasic.png
deleted file mode 100644
index ea58641..0000000
--- a/docs/html/preview/images/ActivitySceneTransitionBasic.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/ActivitySceneTransitionBasic@2x.png b/docs/html/preview/images/ActivitySceneTransitionBasic@2x.png
deleted file mode 100644
index cd28ade..0000000
--- a/docs/html/preview/images/ActivitySceneTransitionBasic@2x.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/BasicManagedProfile.png b/docs/html/preview/images/BasicManagedProfile.png
deleted file mode 100644
index 7354842..0000000
--- a/docs/html/preview/images/BasicManagedProfile.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/BasicManagedProfile@2x.png b/docs/html/preview/images/BasicManagedProfile@2x.png
deleted file mode 100644
index c232809..0000000
--- a/docs/html/preview/images/BasicManagedProfile@2x.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/JobSchedulerSample.png b/docs/html/preview/images/JobSchedulerSample.png
deleted file mode 100644
index ee57bdb..0000000
--- a/docs/html/preview/images/JobSchedulerSample.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/JobSchedulerSample@2x.png b/docs/html/preview/images/JobSchedulerSample@2x.png
deleted file mode 100644
index 3d543db..0000000
--- a/docs/html/preview/images/JobSchedulerSample@2x.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/art.png b/docs/html/preview/images/art.png
deleted file mode 100644
index c48f039..0000000
--- a/docs/html/preview/images/art.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/battery_historian.png b/docs/html/preview/images/battery_historian.png
deleted file mode 100644
index f1d4e40..0000000
--- a/docs/html/preview/images/battery_historian.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/battery_historian@2x.png b/docs/html/preview/images/battery_historian@2x.png
deleted file mode 100644
index 8c8a87f..0000000
--- a/docs/html/preview/images/battery_historian@2x.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/bugs.png b/docs/html/preview/images/bugs.png
deleted file mode 100644
index 46adf05..0000000
--- a/docs/html/preview/images/bugs.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/hun-example.png b/docs/html/preview/images/hun-example.png
deleted file mode 100644
index 251b938..0000000
--- a/docs/html/preview/images/hun-example.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/hun-example@2x.png b/docs/html/preview/images/hun-example@2x.png
deleted file mode 100644
index 5b98a361..0000000
--- a/docs/html/preview/images/hun-example@2x.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/l-dev-prev.png b/docs/html/preview/images/l-dev-prev.png
deleted file mode 100644
index eae6ede..0000000
--- a/docs/html/preview/images/l-dev-prev.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/managed_apps_launcher.png b/docs/html/preview/images/managed_apps_launcher.png
deleted file mode 100644
index b5ef407..0000000
--- a/docs/html/preview/images/managed_apps_launcher.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/managed_apps_launcher@2x.png b/docs/html/preview/images/managed_apps_launcher@2x.png
deleted file mode 100644
index 90d7d51..0000000
--- a/docs/html/preview/images/managed_apps_launcher@2x.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/material-layers.png b/docs/html/preview/images/material-layers.png
deleted file mode 100644
index 9b01ede..0000000
--- a/docs/html/preview/images/material-layers.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/AntiSample1.png b/docs/html/preview/images/notifications/AntiSample1.png
deleted file mode 100644
index b06c644..0000000
--- a/docs/html/preview/images/notifications/AntiSample1.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/AntiSample3.png b/docs/html/preview/images/notifications/AntiSample3.png
deleted file mode 100644
index df5f4e7..0000000
--- a/docs/html/preview/images/notifications/AntiSample3.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/ExpandedImage.png b/docs/html/preview/images/notifications/ExpandedImage.png
deleted file mode 100644
index 81bb1d8..0000000
--- a/docs/html/preview/images/notifications/ExpandedImage.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/Headsup.png b/docs/html/preview/images/notifications/Headsup.png
deleted file mode 100644
index a6f497d..0000000
--- a/docs/html/preview/images/notifications/Headsup.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/Largelogo.png b/docs/html/preview/images/notifications/Largelogo.png
deleted file mode 100644
index 90cd6bf..0000000
--- a/docs/html/preview/images/notifications/Largelogo.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/LockScreen.png b/docs/html/preview/images/notifications/LockScreen.png
deleted file mode 100644
index c204a81..0000000
--- a/docs/html/preview/images/notifications/LockScreen.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/MusicPlayback.png b/docs/html/preview/images/notifications/MusicPlayback.png
deleted file mode 100644
index 9e7c98b..0000000
--- a/docs/html/preview/images/notifications/MusicPlayback.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/ProductIcons.png b/docs/html/preview/images/notifications/ProductIcons.png
deleted file mode 100644
index ae3bb03..0000000
--- a/docs/html/preview/images/notifications/ProductIcons.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/Productlogos.png b/docs/html/preview/images/notifications/Productlogos.png
deleted file mode 100644
index 09169e1..0000000
--- a/docs/html/preview/images/notifications/Productlogos.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/ReplyAction.png b/docs/html/preview/images/notifications/ReplyAction.png
deleted file mode 100644
index 78fc048..0000000
--- a/docs/html/preview/images/notifications/ReplyAction.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/Stack.png b/docs/html/preview/images/notifications/Stack.png
deleted file mode 100644
index c6d76b0..0000000
--- a/docs/html/preview/images/notifications/Stack.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/Summarise_Do.png b/docs/html/preview/images/notifications/Summarise_Do.png
deleted file mode 100644
index 0117e14..0000000
--- a/docs/html/preview/images/notifications/Summarise_Do.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/Summarise_Dont.png b/docs/html/preview/images/notifications/Summarise_Dont.png
deleted file mode 100644
index 6bda159..0000000
--- a/docs/html/preview/images/notifications/Summarise_Dont.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/Summary_Do.png b/docs/html/preview/images/notifications/Summary_Do.png
deleted file mode 100644
index 6ba17d9..0000000
--- a/docs/html/preview/images/notifications/Summary_Do.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/TimeSensitive.png b/docs/html/preview/images/notifications/TimeSensitive.png
deleted file mode 100644
index c56487c..0000000
--- a/docs/html/preview/images/notifications/TimeSensitive.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/Triggered.png b/docs/html/preview/images/notifications/Triggered.png
deleted file mode 100644
index 8366fac..0000000
--- a/docs/html/preview/images/notifications/Triggered.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/WearBasic.png b/docs/html/preview/images/notifications/WearBasic.png
deleted file mode 100644
index 8482cd6..0000000
--- a/docs/html/preview/images/notifications/WearBasic.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/action_combo.png b/docs/html/preview/images/notifications/action_combo.png
deleted file mode 100644
index 5400218..0000000
--- a/docs/html/preview/images/notifications/action_combo.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/basic_combo.png b/docs/html/preview/images/notifications/basic_combo.png
deleted file mode 100644
index 01a0239..0000000
--- a/docs/html/preview/images/notifications/basic_combo.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/expandedtext_combo.png b/docs/html/preview/images/notifications/expandedtext_combo.png
deleted file mode 100644
index 1bc276f..0000000
--- a/docs/html/preview/images/notifications/expandedtext_combo.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/notifications_pattern_priority.png b/docs/html/preview/images/notifications/notifications_pattern_priority.png
deleted file mode 100644
index af2d725..0000000
--- a/docs/html/preview/images/notifications/notifications_pattern_priority.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/notifications/stack_combo.png b/docs/html/preview/images/notifications/stack_combo.png
deleted file mode 100644
index ad22926..0000000
--- a/docs/html/preview/images/notifications/stack_combo.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/opt-in.png b/docs/html/preview/images/opt-in.png
deleted file mode 100644
index 7151253..0000000
--- a/docs/html/preview/images/opt-in.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/images/updates.png b/docs/html/preview/images/updates.png
deleted file mode 100644
index f165c5a..0000000
--- a/docs/html/preview/images/updates.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/notifications.jd b/docs/html/preview/notifications.jd
deleted file mode 100644
index 44f46ea5..0000000
--- a/docs/html/preview/notifications.jd
+++ /dev/null
@@ -1,710 +0,0 @@
-page.title=Design for Notifications
-page.tags="notifications","design","L"
-@jd:body
-
-<style>
- .col-5, .col-6, .col-7 {
- margin-left:0px;
- }
-</style>
-
-<p>The notification system allows users to keep informed about relevant and timely
-events in your app, such as new chat messages from a friend or a calendar event.
-Think of notifications as a news channel that alerts the user to important events as
-they happen or a log that chronicles events while the user is not paying attention -
-and one that is synced as appropriate across all their Android devices.</p>
-
-<h4 id="New"><strong>New in L</strong></h4>
-
-<p>In L, notifications receive an important structural visual and functional update:</p>
-
-<ul>
- <li> Visual changes to notifications as part of material design</li>
- <li> Notifications are now available on the device lockscreen, yet sensitive content can still
- be hidden behind it</li>
- <li> A new presentation format called Heads-up for receiving high priority notifications while
- using the device</li>
- <li> Cloud-synced notifications - act on a notification on your Android tablet and it is also
- dismissed on your phone.</li>
- <li> And starting now (in Android 4.4W, API Level 20, the platform release for Android Wear),
- your notifications will bridge to Android Wear devices. You can extend the functionality of
- notifications on Wear in two different ways. First, you can add speech input and canned responses
- to Actions on Wear, allowing users to complete tasks from their wrists. Second, you can write
- Wear apps that hook into your notifications to go even further in terms of creating interactive
- experiences for users.</li>
-</ul>
-
-<h2 id="Anatomy">Anatomy of a notification</h2>
-
-<p>This section goes over basic parts of a notification and how they can
-appear on different types of devices.</p>
-
-<h3 id="BaseLayout">Base Layout</h3>
-
-<p>At a minimum, all notifications consist of a base layout, including:</p>
-
-<ul>
- <li> The notification's <strong>icon</strong>, symbolizing the originating app, and also
- potentially the kind of notification if the app has several substantially different sorts of
- notifications it can post</li>
- <li> A notification <strong>title</strong> and additional <strong>text</strong></li>
- <li> A <strong>timestamp</strong></li>
-</ul>
-
-<p>Notifications created with <code>Notification.Builder</code> for versions of Android earlier
-than L will look and work the same in L, with only minor stylistic changes that the system handles
-for you.</p>
-
-
- <img style="margin:20px 0 0 0" src="{@docRoot}preview/images/notifications/basic_combo.png"
- alt="" width="700px" />
-
-
-<div style="clear:both;margin-top:20px">
- <p class="img-caption">
- Base layout of a handheld notification and the same notification on Wear,
- with a user photo and a notification icon
- </p>
- </div>
-</div>
-
-<h3 id="ExpandedLayouts">Expanded layouts</h3>
-
-
-<p>You have the option to provide more details on notifications. You can use this to show the first
-few lines of a message or show a larger image preview. This provides the user with additional
-context, and - in some cases - may allow the user to read a message in its entirety. The user can
-pinch-zoom or perform a single-finger glide in order to toggle between compact and expanded layouts.
- For single event notifications, Android provides three expanded layout templates (text, inbox, and
- image) for you to re-use in your application. The following images show you how they look on
- handhelds and wearables.</p>
-
-<img style="margin-top:30px" src="{@docRoot}preview/images/notifications/expandedtext_combo.png"
- alt="" width="700px" height;="284px" />
-<img style="margin-top:30px" src="{@docRoot}preview/images/notifications/stack_combo.png"
- alt="" width="700px" height;="284px" />
-<img style="margin-top:30px" src="{@docRoot}preview/images/notifications/ExpandedImage.png"
- alt="" width="311px" height;="450px" />
-
-<h3 id="actions" style="clear:both; margin-top:40px">Actions</h3>
-
-<p>Android has supported optional actions that are displayed at the bottom of the notification, as
-far back as Jelly Bean. With actions, users can handle the most common tasks for a particular
-notification from within the notification shade without having to open the originating application.
-This speeds up interaction and, in conjunction with "swipe-to-dismiss", helps users to streamline
-their notification triaging experience.</p>
-
-
- <img src="{@docRoot}preview/images/notifications/action_combo.png"
- alt="" width="700px" />
-
-
-
-<p style="clear:both">Be judicious with how many actions you include with a notification. The more
-actions you include, the more cognitive complexity you create. Limit yourself to the fewest number
-of actions possible by only including the most imminently important and meaningful ones.</p>
-
-<p>Good candidates for actions on notifications are actions that:</p>
-
-<ul>
- <li> Are essential, frequent and typical for the content type you're displaying
- <li> Allow the user to accomplish tasks quickly
-</ul>
-
-<p>Avoid actions that are:</p>
-
-<ul>
- <li> Ambiguous
- <li> Duplicative of the default action of the notification (such as "Read" or "Open")
-</ul>
-
-
-
-<p>You can specify a maximum of three actions, each consisting of an action icon and an action name.
- Adding actions to a simple base layout will make the notification expandable, even if the
- notification doesn't have an expanded layout. Since actions are only shown for expanded
- notifications and are otherwise hidden, you must make sure that any action a user can invoke from
- a notification is available from within the associated application as well.</p>
-
-<h2 id="notifications_on_android_wear">Notifications on Android Wear</h2>
-
-<p>Additionally, notifications and their actions are bridged over to Wear devices by default.
-Developers have control to control which notifications from bridging from the phone to the watch
-and vice versa. And developers can control which actions bridge as well. If your app includes
-actions that can't be accomplished with a single tap, either hide these actions on your Wear
-notification or consider hooking them up to a Wear app to allow the user to finish the action on
-their watch.</p>
-
-<h4>Bridging notifications</h4>
-
-<p><strong>Notifications that should be bridged</strong></p>
-
-<ul>
- <li> New instant messages</li>
-</ul>
-
-<img src="{@docRoot}preview/images/notifications/WearBasic.png" width="156px" height="156px"
- alt="" />
-
-<p><strong>Don't bridge</strong></p>
-
-<ul>
- <li> If a podcasting app has new episodes available for download,
- keep this notification on the phone.</li>
-</ul>
-
-
-
-<h4 style="clear:both">Bridging actions</h4></p>
-
-<p><strong>Actions to bridge</strong></p>
-
-<ul>
- <li> Single tap actions such as +1, Like, Heart</li>
-</ul>
-
-<p><strong>Actions not to bridge</strong></p>
-
-<ul>
- <li> Actions that map to features that aren't possible on the watch</li>
-</ul>
-
-
-
-<p><b>Unique actions to define for Wear</b></p>
-
-<ul>
- <li> Quick lists of canned responses such as "Be right back"</li>
- <li> Open on phone</li>
- <li> A "Comment" or "Reply" action that brings up the speech input screen</li>
- <li> Actions that can launch Wear-specific apps</li>
-</ul>
-
-<img src="{@docRoot}preview/images/notifications/ReplyAction.png" width="156px" height="156px"
- alt="" />
-
-
-</div>
-
-
-
-<h2 style="clear:left">Heads-up Notification</h2>
-<div class="figure" style="width:311px">
- <img src="{@docRoot}preview/images/notifications/Headsup.png"
- alt="" width="311px" />
- <p class="img-caption">
- Example of a Heads-up notification (incoming phone call, high priority) coming in on top of an
- immersive app
- </p>
-</div>
-
-<p>When notifications with priority set to High (see right) arrives, it is presented to users for a
-short period of time on the device with an expanded layout with its actions exposed.</p>
-<p> After this period of time, it retreats back to the Notification shade. If a notification is
-flagged as High or Max or a full-screen takeover, it gets a HUN in L.</p>
-
-<p><b>Good examples of Heads-up notifications</b></p>
-
-<ul>
- <li> Incoming phone call when using device</li>
- <li> Alarm when using device</li>
- <li> New SMS message</li>
- <li> Low battery</li>
-</ul>
-
-<h2 style="clear:both" id="guidelines">Guidelines</h2>
-
-
-<h3 id="MakeItPersonal">Make it personal</h3>
-
-<p>For notifications of items sent by another person (such as a message or status update), include
-that person's image using setLargeIcon. Also attach information about the person to the
-notification's metadata (see EXTRA_PEOPLE).</p>
-
-<p>Your notification's main icon will still be shown, so the user can associate it with the icon
-visible in the status bar.</p>
-
-
-<img src="{@docRoot}preview/images/notifications/Triggered.png"
- alt="" width="311px"/>
-<p style="margin-top:10px" class="img-caption">
- Notification that shows the person who triggered it and the content they are sending you
-</p>
-
-
-<h3 id="navigate_to_the_right_place">Navigate to the right place</h3>
-
-<p>When the user touches the body of a notification (outside of the action buttons), open your app
-to the place where the user can view and act upon the data referenced in the notification. In most
-cases this will be the detail view of a single data item such as a message, but it might also be a
-summary view if the notification is stacked (see <em>Stacked notifications</em> below) and
-references multiple items. If in any of those cases the user is taken to a hierarchy level below
-your app's top-level, insert navigation into your app's back stack to allow them to navigate to
-your app's top level using the system back button. For more information, see the chapter on
-<em>System-to-app navigation</em> in the <a href="/design/patterns/navigation.html">Navigation</a>
-design pattern.</p>
-
-<h3 id="correctly_set_and_manage_notification_priority">Correctly set and manage notification
-priority</h3>
-
-<p>Starting with Jelly Bean, Android supported a priority flag for notifications. It allows you to
-influence where your notification will appear in comparison to other notifications and help to make
-sure that users always see their most important notifications first. You can choose from the
-following priority levels when posting a notification:</p>
-<table>
- <tr>
- <td class="tab0">
-<p><strong>Priority</strong></p>
-</td>
- <td class="tab0">
-<p><strong>Use</strong></p>
-</td>
- </tr>
- <tr>
- <td class="tab1">
-<p><code>MAX</code></p>
-</td>
- <td class="tab1">
-<p>Use for critical and urgent notifications that alert the user to a condition that is
-time-critical or needs to be resolved before they can continue with a particular task.</p>
-</td>
- </tr>
- <tr>
- <td class="tab1">
-<p><code>HIGH</code></p>
-</td>
- <td class="tab1">
-<p>Use high priority notifications primarily for important communication, such as message or chat
-events with content that is particularly interesting for the user. High priority notifications will get the Heads-Up Notification display starting in L.</p>
-</td>
- </tr>
- <tr>
- <td class="tab1">
-<p><code>DEFAULT</code></p>
-</td>
- <td class="tab1">
-<p>The default priority. Keep all notifications that don't fall into any of the other categories at
-this priority level.</p>
-</td>
- </tr>
- <tr>
- <td class="tab1">
-<p><code>LOW</code></p>
-</td>
- <td class="tab1">
-<p>Use for notifications that you still want the user to be informed about, but that rate low in
-urgency. LOW notifications will tend to show up at the bottom of the list, which makes them a good
-choice for things like pubic/undirected social updates: the user has asked to be notified about
-them, but they should never take precedence over urgent or direct communication.</p>
-</td>
- </tr>
- <tr>
- <td class="tab1">
-<p><code>MIN</code></p>
-</td>
- <td class="tab1">
-<p>Contextual/background information (e.g. weather information, contextual location information).
-Minimum priority notifications will not show in the status bar. The user will only discover them
-when they expand the notification shade.</p>
-</td>
- </tr>
-</table>
-
-
-<h4 id="how_to_choose_an_appropriate_priority"><strong>How to choose an appropriate
-priority</strong></h4>
-
-<p>Default, High, and Max priority are interruptive priority levels and risk interrupting the user
-from what they are doing. This should not be taken lightly, so these levels should be reserved
-for notifications that:</p>
-
-<ul>
- <li> Involve another person</li>
- <li> Are time-sensitive</li>
- <li> Might immediately change the user's behavior in the real world</li>
-</ul>
-
-<p>Notifications set to <code>LOW</code> and <code>MIN</code> can still be very valuable for the
-user. Many if not most notifications just don't need to command the user's immediate attention, or
-vibrate the user's wrist, yet contain information that they will find valuable when they choose to
-look for notifications. Criteria for <code>LOW</code> and <code>MIN</code> priority notifications:</p>
-
-<ul>
- <li> Don't involve other people</li>
- <li> Aren't time sensitive</li>
- <li> Is content the user might be interested in but could choose to browse at their leisure</li>
-</ul>
-
-
- <img src="{@docRoot}preview/images/notifications/notifications_pattern_priority.png"
- alt="" width="700"/>
-
-
-<h3 style="clear:both" id="set_a_notification_category">Set a notification category</h3>
-
-<p>If your notification falls into one of the predefined categories (see below), assign it
-accordingly. Aspects of the system UI such as the notification shade (or any other notification
-listener) may use this information to make ranking and filtering decisions.</p>
-<table>
- <tr>
- <td>
-<p><code>Notification.CATEGORY_CALL</code></p>
-</td>
- <td>
-<p>Incoming call (voice or video) or similar synchronous communication request</p>
-</td>
- </tr>
- <tr>
- <td>
-<p><code>Notification.CATEGORY_MESSAGE</code></p>
-</td>
- <td>
-<p>Incoming direct message (SMS, instant message, etc.)</p>
-</td>
- </tr>
- <tr>
- <td>
-<p><code>Notification.CATEGORY_EMAIL</code></p>
-</td>
- <td>
-<p>Asynchronous bulk message (email)</p>
-</td>
- </tr>
- <tr>
- <td>
-<p><code>Notification.CATEGORY_EVENT</code></p>
-</td>
- <td>
-<p>Calendar event</p>
-</td>
- </tr>
- <tr>
- <td>
-<p><code>Notification.CATEGORY_PROMO</code></p>
-</td>
- <td>
-<p>Promotion or advertisement</p>
-</td>
- </tr>
- <tr>
- <td>
-<p><code>Notification.CATEGORY_ALARM</code></p>
-</td>
- <td>
-<p>Alarm or timer</p>
-</td>
- </tr>
- <tr>
- <td>
-<p><code>Notification.CATEGORY_PROGRESS</code></p>
-</td>
- <td>
-<p>Progress of a long-running background operation</p>
-</td>
- </tr>
- <tr>
- <td>
-<p><code>Notification.CATEGORY_SOCIAL</code></p>
-</td>
- <td>
-<p>Social network or sharing update</p>
-</td>
- </tr>
- <tr>
- <td>
-<p><code>Notification.CATEGORY_ERROR</code></p>
-</td>
- <td>
-<p>Error in background operation or authentication status</p>
-</td>
- </tr>
- <tr>
- <td>
-<p><code>Notification.CATEGORY_TRANSPORT</code></p>
-</td>
- <td>
-<p>Media transport control for playback</p>
-</td>
- </tr>
- <tr>
- <td>
-<p><code>Notification.CATEGORY_SYSTEM</code></p>
-</td>
- <td>
-<p>System or device status update. Reserved for system use.</p>
-</td>
- </tr>
- <tr>
- <td>
-<p><code>Notification.CATEGORY_SERVICE</code></p>
-</td>
- <td>
-<p>Indication of running background service</p>
-</td>
- </tr>
- <tr>
- <td>
-<p><code>Notification.CATEGORY_RECOMMENDATION</code></p>
-</td>
- <td>
-<p>A specific, timely recommendation for a single thing. For example, a news app might want to
-recommend a news story it believes the user will want to read next.</p>
-</td>
- </tr>
- <tr>
- <td>
-<p><code>Notification.CATEGORY_STATUS</code></p>
-</td>
- <td>
-<p>Ongoing information about device or contextual status</p>
-</td>
- </tr>
-</table>
-
-<h3 id="summarize_your_notifications">Summarize your notifications</h3>
-
-<p>If your app creates a notification while another of the same type is still pending, avoid
-creating an altogether new notification object. Instead, turn it into a summary notification for
-the app.</p>
-
-<p>A summary notification builds a summary description and allows the user to understand how many
-notifications of a particular kind are pending.</p>
-
-<div class="col-6">
-
-<p><strong>Don't</strong></p>
- <img src="{@docRoot}preview/images/notifications/Summarise_Dont.png"
- alt="" width="311px" />
-</div>
-
-<div>
-<p><strong>Do</strong></p>
-
- <img src="{@docRoot}preview/images/notifications/Summarise_Do.png"
- alt="" width="311px"/>
-</div>
-
-<p style="clear:left; padding-top:30px; padding-bottom:20px">You can provide more detail about the individual notifications that make up a
- summary by using the expanded digest layout. This allows users to gain a better sense of which
- notifications are pending and if they are interesting enough to be read in detail within the
- associated app.</p>
-<div class="col-6">
- <img src="{@docRoot}preview/images/notifications/Stack.png" style="margin-bottom:20px"
- alt="" width="311px" />
- <p class="img-caption">
- Expanded and contracted notification that is a summary (using InboxStyle)
- </p>
-</div>
-
-<h3 style="clear:both" id="make_notifications_optional">Make notifications optional</h3>
-
-<p>Users should always be in control of notifications. Allow the user to disable your app's
-notifications or change their alert properties, such as alert sound and whether to use vibration,
-by adding a notification settings item to your application settings.</p>
-
-<h3 id="use_distinct_icons">Use distinct icons</h3>
-<p>By glancing at the notification area, the user should be able to discern what kinds of
-notifications are currently pending.</p>
-
-<div class="figure">
- <img src="{@docRoot}preview/images/notifications/ProductIcons.png"
- alt="" width="420" />
-</div>
-
- <div><p><strong>Do</strong></p>
- <p>Look at the notification icons Android apps already provide and create notification icons for
- your app that are sufficiently distinct in appearance.</p>
-
- <p><strong>Do</strong></p>
- <p>Use the proper <a href="/design/style/iconography.html#notification">notification icon
- style</a> for small icons, and the Material Light
- <a href="/design/style/iconography.html#action-bar">action bar icon style</a> for your action
- icons. Do not place any additional alpha (dimming or fading) into your small icons and action
- icons; they can have anti-aliased edges, but because L uses these icons as masks (that is, only
- the alpha channel is used), the image should generally be drawn at full opacity.</p>
-<p ><strong>Do</strong></p>
-<p >Keep your icons visually simple and avoid excessive detail that is hard to discern.</p>
-
-</div>
-<p style="clear:both"><strong>Don't</strong></p>
-
-<p>Use color to distinguish your app from others. Notification icons should only be a white-on-transparent background image.</p>
-
-
-<h3 id="pulse_the_notification_led_appropriately">Pulse the notification LED appropriately</h3>
-
-<p>Many Android devices contain a notification LED, which is used to keep the user informed about
-events while the screen is off. Notifications with a priority level of MAX, HIGH, or DEFAULT should
-cause the LED to glow, while those with lower priority (<code>LOW</code> and <code>MIN</code>) should not.</p>
-
-<p>The user's control over notifications should extend to the LED. When you use DEFAULT_LIGHTS, the
-LED will glow with a white color. Your notifications shouldn't use a different color unless the
-user has explicitly customized it.</p>
-
-<h2 id="building_notifications_that_users_care_about">Building notifications that users care about</h2>
-
-<p>To create an app that users love, it is important to design your notifications carefully.
-Notifications embody your app's voice, and contribute to your app's personality. Unwanted or
-unimportant notifications can annoy the user or make them resent how much attention the app wants
-from them, so use notifications judiciously.</p>
-
-<h3 id="when_to_display_a_notification">When to display a notification</h3>
-
-<p>To create an application that people enjoy using, it's important to recognize that the user's
-attention and focus is a resource that must be protected. While Android's notification system has
-been designed to minimize the impact of notifications on the user's attention, it is nonetheless
-still important to be aware of the fact that notifications are interrupting the user's task flow.
-As you plan your notifications, ask yourself if they are important enough to warrant an interruption. If you are unsure, allow the user to opt into a notification using your apps notification settings or adjust
-the notifications priority flag to <code>LOW</code> or <code>MIN</code> to avoid distracting the user while they are doing
-something else.</p>
-
- <img src="{@docRoot}preview/images/notifications/TimeSensitive.png"
- alt="" width="311px" />
- <p style="margin-top:10px" class="img-caption">
- Time sensitive notification examples
- </p>
-
-<p>While well behaved apps generally only speak when spoken to, there are some limited cases where an app actually should interrupt the user with an unprompted notification.</p>
-
-<p>Notifications should be used primarily for <strong>time sensitive events</strong>, and especially
- if these synchronous events <strong>involve other people</strong>. For instance, an incoming chat
- is a real time and synchronous form of communication: there is another user actively waiting on you
- to respond. Calendar events are another good example of when to use a notification and grab the
- user's attention, because the event is imminent, and calendar events often involve other people.</p>
-
-<h3 style="clear:both" id="when_not_to_display_a_notification">When not to display a notification</h3>
-
-<div class="figure" style="margin-top:60px">
- <img src="{@docRoot}preview/images/notifications/AntiSample1.png"
- alt="" width="311px" />
-</div>
-
-<p>There are however many other cases where notifications should not be used:</p>
-
-<ul>
- <li> Avoid notifying the user of information that is not directed specifically at them, or
- information that is not truly time sensitive. For instance the asynchronous and undirected updates
- flowing through a social network generally do not warrant a real time interruption. For the users
- that do care about them, allow them to opt-in.</li>
- <li> Don't create a notification if the relevant new information is currently on screen. Instead,
- use the UI of the application itself to notify the user of new information directly in context.
- For instance, a chat application should not create system notifications while the user is actively chatting with another user.</li>
- <li> Don't interrupt the user for low level technical operations, like saving or syncing information, or updating an application, if it is possible for the system to simply take care of itself without involving the user.</li>
- <li> Don't interrupt the user to inform them of an error if it is possible for the application to recover from the error on its own without the user taking any action.</li>
- <li> Don't create notifications that have no true notification content and merely advertise your
- app. A notification should provide useful, timely, new information and should not be used to
- merely launch an app.</li>
- <li> Don't create superfluous notifications just to get your brand in front of users.
- Such notifications will only frustrate and likely alienate your audience. The best way to provide
- the user with a small amount of updated information and to keep them engaged with your
- application is to develop a widget that they can choose to place on their home screen.</li>
-</ul>
-
-<h2 style="clear:left" id="interacting_with_notifications">Interacting With Notifications</h2>
-
-<p>Notifications are indicated by icons in the status bar and can be accessed by opening the
-notification drawer.</p>
-
-<p>Touching a notification opens the associated app to detailed content matching the notification.
-Swiping left or right on a notification removes it from the list.</p>
-
-<h3 id="ongoing_notifications">Ongoing notifications</h3>
-<div class="figure" style="width:311px">
- <img src="{@docRoot}preview/images/notifications/MusicPlayback.png"
- alt="" width="311px" />
- <p class="img-caption">
- Ongoing notification due to music playback
- </p>
-</div>
-<p>Ongoing notifications keep users informed about an ongoing process in the background.
-For example, music players announce the currently playing track in the notification system and
-continue to do so until the user stops the playback. They can also be used to show the user
-feedback for longer tasks like downloading a file, or encoding a video. Ongoing notifications
-cannot be manually removed from the notification drawer.</p>
-
-<p>The L lockscreen doesn't show transport controls for RCC (RemoteControlClient)s anymore. But the
-lockscreen <em>does</em> show notifications, so each app's playback notification is now the primary
-way for users to control playback from a locked state. This gives apps more control over which
-buttons to show and in what way, while providing a consistent experience for the user whether on
-the lockscreen or unlocked.</p>
-
-<h3 style="clear:both" id="dialogs_and_toasts_are_for_feedback_not_notification">Dialogs
-and toasts are for feedback not notifications</h3>
-
-<p>Your app should not create a dialog or toast if it is not currently on screen. Dialogs and Toasts
- should only be displayed as the immediate response to the user taking an action inside of your app.
-For further guidance on the use of dialogs and toasts, refer to
-<a href="/design/patterns/confirming-acknowledging.html">Confirming & Acknowledging</a>.</p>
-
-<h3>Ranking and Ordering</h3>
-
-<p>Notifications are "news" and so they are essentially shown in reverse-chronological order, with
-special consideration given to the app's stated notification priority.</p>
-
-<p>In L, notifications are now a key part of the lockscreen, and are featured prominently every
-time the device display comes on. Because space on the lockscreen is tight, it is more important
-than ever to identify the most urgent or relevant notifications.</p>
-
-<p>Therefore, L has a more sophisticated sorting algorithm for notifications, taking into account:</p>
-
-<ul>
- <li> The timestamp and application's stated priority, as before.</li>
- <li> Whether the notification has recently disturbed the user with sound or vibration. (That is,
- if the phone just made noise, and the user wants to know "what just happened?" the lockscreen
- should answer that at a glance.)</li>
- <li> Any people that are attached to the notification using <code>EXTRA_PEOPLE</code>, and in
- particular whether those are starred contacts.</li>
-</ul>
-
-<p>To best take advantage of this sorting, developers should focus on the user experience they want
-to create rather than aiming for any particular spot on the list.</p>
-
- <img src="{@docRoot}preview/images/notifications/AntiSample3.png"
- alt="" width="700px" />
-
- <p class="img-caption" style="margin-top:10px">Gmail notifications are default priority, so they
- normally sort below messages from an instant messaging app like Hangouts, but Gmail will get a
- temporary bump when new messages come in.
- </p>
-
-
-<h3>On the lockscreen</h3>
-
-<p>Starting in L, notifications are visible on the lockscreen, and so we must consider the user's
-privacy. Notifications often contain sensitive information, and we must take care when showing it to
-anyone who picks up the device and turns on the display.</p>
-
-<ul>
- <li> For devices without a secure lockscreen, a simple slide gesture unlocks the whole device.
- Therefore, Android will always show the complete contents of all notifications on insecure lockscreens.</li>
- <li> When a device has a secure lockscreen (PIN, pattern, or password), however, it divides the
- interface into two spheres: "public", the things that are displayed atop a secure lockscreen and
- can therefore be seen by anyone; and "private", the world behind that lockscreen, which can only
- be accessed by supplying the correct authentication.</li>
-</ul>
-
-<h3>The user decides what shows on the secure lockscreen</h3>
-<div class="figure" style="width:311px">
- <img src="{@docRoot}preview/images/notifications/LockScreen.png"
- alt="" width="311px" />
- <p class="img-caption">
- Notifications on the lockscreen followed by the Pattern Unlock when the user attempts to unlock the phone.
- </p>
-</div>
-
-<p>When setting up a secure lockscreen, the user can choose to conceal sensitive details from atop the secure lockscreen. In this case the SystemUI considers the notification's <em>visibility level</em> to figure out what can safely be shown.</p>
-<p> To control the visibility level, call
-<code>Notification.Builder.setVisibility()</code> and specify one of these values:</p>
-
-<ul>
- <li><code>Notification.VISIBILITY_PUBLIC</code>. Shows the notification's full content.
- This is the system default if visibility is left unspecified.</li>
- <li><code>Notification.VISIBILITY_PRIVATE</code>. The lockscreen will reveal basic information about the existence of this notification, including its icon and the name of the app that posted it. The rest of the notification's details, however, are not displayed.
- <ul>
- <li> If you want to provide a different public version of your notification for the system to display on a secure lockscreen, supply a replacement Notification object in the <code>Notification.publicVersion</code> field.
- <li> This is an app's opportunity to create a redacted version of the content that is still useful but does not reveal personal information.
- <li> <strong>Example: </strong>An SMS app whose notifications include the text of the SMS and the sender's name and contact icon. This notification should be <code>VISIBILITY_PRIVATE</code>, but the <code>publicVersion</code> could still contain useful information like "3 new messages" without any other identifying details.
- </ul>
- </li>
- <li><code>Notification.VISIBILITY_SECRET</code>. Shows only the most minimal information, excluding even the notification's icon.</li>
-</ul>
\ No newline at end of file
diff --git a/docs/html/preview/preview_toc.cs b/docs/html/preview/preview_toc.cs
deleted file mode 100644
index 3564b16..0000000
--- a/docs/html/preview/preview_toc.cs
+++ /dev/null
@@ -1,111 +0,0 @@
-<ul id="nav">
-
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="<?cs var:toroot ?>preview/setup-sdk.html">Set up the SDK
- </a></div>
- </li>
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="<?cs var:toroot ?>preview/api-overview.html">API Overview
- </a></div>
- </li>
- <li class="nav-section">
-
- <div class="nav-section-header"><a href="<?cs var:toroot ?>preview/material/index.html">Material Design
- </a></div>
- <ul>
- <li><a href="<?cs var:toroot ?>preview/material/get-started.html">Get Started</a></li>
- <li><a href="<?cs var:toroot ?>preview/material/theme.html">Material Theme</a></li>
- <li><a href="<?cs var:toroot ?>preview/material/ui-widgets.html">UI Widgets</a></li>
- <li><a href="<?cs var:toroot ?>preview/material/views-shadows.html">Views and Shadows</a></li>
- <li><a href="<?cs var:toroot ?>preview/material/animations.html">Animations</a></li>
- <li><a href="<?cs var:toroot ?>preview/material/compatibility.html">Compatibility</a></li>
- </ul>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty">
- <a href="<?cs var:toroot ?>preview/notifications.html">Notification Design</a></div>
- </li>
-
-
- <li class="nav-section">
- <div class="nav-section-header">
- <a href="<?cs var:toroot ?>preview/tv/index.html">TV</a>
- </div>
- <ul>
- <li><a href="<?cs var:toroot ?>preview/tv/start/index.html">
- Get Started</a></li>
- <li class="nav-section">
- <div class="nav-section-header">
- <a href="<?cs var:toroot ?>preview/tv/design/index.html">
- Design</a></div>
- <ul>
- <li><a href="<?cs var:toroot ?>preview/tv/design/principles.html">
- Creative Vision</a></li>
- <li><a href="<?cs var:toroot ?>preview/tv/design/patterns.html">
- UI Patterns</a></li>
- <li><a href="<?cs var:toroot ?>preview/tv/design/style.html">
- Style</a></li>
- </ul>
- </li>
- <li class="nav-section">
- <div class="nav-section-header">
- <a href="<?cs var:toroot ?>preview/tv/ui/index.html">
- User Interface</a></div>
- <ul>
- <li><a href="<?cs var:toroot ?>preview/tv/ui/layouts.html">
- Layouts</a></li>
- <li><a href="<?cs var:toroot ?>preview/tv/ui/navigation.html">
- Navigation</a></li>
- <li><a href="<?cs var:toroot ?>preview/tv/ui/browse.html">
- BrowseFragment</a></li>
- <li><a href="<?cs var:toroot ?>preview/tv/ui/details.html">
- DetailsFragment</a></li>
- <li><a href="<?cs var:toroot ?>preview/tv/ui/in-app-search.html">
- In-App Search</a></li>
- <li><a href="<?cs var:toroot ?>preview/tv/ui/recommendations.html">
- Recommendations</a></li>
- </ul>
- </li>
- <li><a href="<?cs var:toroot ?>preview/tv/tif/index.html">
- TV Input Framework</a></li>
- <li><a href="<?cs var:toroot ?>preview/tv/games/index.html">
- Games on TV</a></li>
- <li><a href="<?cs var:toroot ?>preview/tv/start/hardware-features.html">
- Hardware Features</a></li>
- <li><a href="<?cs var:toroot ?>preview/tv/adt-1/index.html">
- ADT-1</a></li>
- <li><a href="<?cs var:toroot ?>preview/tv/publish/index.html">
- Publishing TV Apps</a></li>
- </ul>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty">
- <a href="<?cs var:toroot ?>preview/samples.html">Samples</a>
- </div>
- </li>
- <li class="nav-section">
- <div class="nav-section-header empty">
-
- <a href="<?cs var:toroot ?>preview/reference.html">Reference</a>
-
- </div>
- </li>
- <li class="nav-section">
- <div class="nav-section-header empty">
- <a href="<?cs var:toroot ?>preview/support.html">Support</a>
- </div>
- </li>
- <li class="nav-section">
- <div class="nav-section-header empty">
- <a href="<?cs var:toroot ?>preview/license.html">License Agreement</a>
- </div>
- </li>
- <li class="nav-section" style="margin: 20px 0 0 -10px;">
- <div class="nav-section-header empty">
- <a href="<?cs var:toroot ?>index.html" class="back-link">Developer Home</a>
- </div>
- </li>
-</ul>
diff --git a/docs/html/preview/tv/index.jd b/docs/html/preview/tv/index.jd
deleted file mode 100644
index dd35908..0000000
--- a/docs/html/preview/tv/index.jd
+++ /dev/null
@@ -1,22 +0,0 @@
-page.title=Android TV Apps
-
-@jd:body
-
-<p>Android offers a rich user experience that's optimized for apps running on large screen
- devices, such as high-definition televisions. Apps on TV offer new opportunities to
- delight your users from the comfort of their couch.</p>
-
-<p>This guide helps you build apps for TV devices, including:</p>
-
-<ul>
- <li>How to set up your development environment</li>
- <li>How to build user interfaces for TV</li>
- <li>Guidelines for building games for TV</li>
-</ul>
-
-<p>Prepare your app for its big screen debut!</p>
-
-<p>
- <strong><a href="{@docRoot}preview/tv/start/index.html">Get Started ></a></strong>
-</p>
-
diff --git a/docs/html/preview/tv/ui/index.jd b/docs/html/preview/tv/ui/index.jd
deleted file mode 100644
index c861ec2..0000000
--- a/docs/html/preview/tv/ui/index.jd
+++ /dev/null
@@ -1,40 +0,0 @@
-page.title=User Interfaces for TV
-
-@jd:body
-
-
-<p>
- Building an effective and engaging user interface for TV devices requires a firm understanding of what works well
- in the context of a living room. Imagine a large screen that can be seen by many people at the
- same time, controlled with a few buttons by users with limited attention, and you start to see the
- challenges and opportunities of building an app for TV. Building apps for this environment
- requires a different approach and different tools.</p>
-
-<p>This section discusses how to build a living room experience with your app, including
- implementation instructions and creating user interface widgets built for TV. Also check out
- <a href="{@docRoot}design/tv/index.html">Design for TV</a> for information and inspiration
- on creating engaging user interfaces for TV devices.</p>
-
-<h2>Topics</h2>
-
-<dl>
- <dt><b><a href="layouts.html">Layouts</a></b></dt>
- <dd>Learn how to build app layouts for TV screens.</dd>
-
- <dt><b><a href="navigation.html">Navigation</a></b></dt>
- <dd>Learn how to build navigation for TV devices.</dd>
-
- <dt><b><a href="browse.html">BrowseFragment</a></b></dt>
- <dd>Learn how to use this fragment to build a browsing interface for media catalogs.</dd>
-
- <dt><b><a href="details.html">DetailsFragment</a></b></dt>
- <dd>Learn how to use this fragment to build a details page for media items.</dd>
-
- <dt><b><a href="in-app-search.html">In-App Search</a></b></dt>
- <dd>Learn how to use a built-for-TV user interface for searching within your app.</dd>
-
- <dt><b><a href="recommendations.html">Recommendations</a></b></dt>
- <dd>Learn how your app can contribute to the list of recommendations appearing on the home
- screen and get your content noticed by users.</dd>
-</dl>
-
diff --git a/docs/html/reference/android/preview/support/package-summary.html b/docs/html/reference/android/preview/support/package-summary.html
deleted file mode 100644
index 2f50871..0000000
--- a/docs/html/reference/android/preview/support/package-summary.html
+++ /dev/null
@@ -1,481 +0,0 @@
-<!DOCTYPE html>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<html>
-<head>
-
-
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="viewport" content="width=device-width" />
-
-<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
-<title>Preview Notifications Reference | Android Developers</title>
-
-<!-- STYLESHEETS -->
-<link rel="stylesheet"
-href="//fonts.googleapis.com/css?family=Roboto+Condensed">
-<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold"
- title="roboto">
-<link href="/assets/css/default.css" rel="stylesheet" type="text/css">
-
-
-
-<!-- JAVASCRIPT -->
-<script src="//www.google.com/jsapi" type="text/javascript"></script>
-<script src="/assets/js/android_3p-bundle.js" type="text/javascript"></script>
-<script type="text/javascript">
- var toRoot = "/";
- var metaTags = [];
- var devsite = false;
-</script>
-<script src="/assets/js/docs.js" type="text/javascript"></script>
-
-<script type="text/javascript">
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', 'UA-5831155-1']);
- _gaq.push(['_trackPageview']);
-
- (function() {
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
- })();
-</script>
-</head>
-
-
-<body class="gc-documentation
- preview">
- <div id="doc-api-level" class="" style="display:none"></div>
- <a name="top"></a>
-
-
-
-<a name="top"></a>
-
-<!-- Header -->
-<div id="header-wrapper">
- <div id="header">
- <div class="wrap" id="header-wrap">
- <div class="col_3 logo wear-logo">
- <a href="/wear/index.html">
- <img src="/wear/images/android-wear.png" height="16" alt="Android Wear" />
- </a>
- </div>
- <div class="col-8" style="margin:0"><h1 style="margin:1px 0 0 20px;padding:0;line-height:16px;
-color:#666;font-weight:100;font-size:24px;">Developer Preview</h1></div>
-
-
-
-<div class="menu-container">
- <div class="moremenu">
- <div id="more-btn"></div>
- </div>
- <div class="morehover" id="moremenu">
- <div class="top"></div>
- <div class="mid">
- <div class="header">Links</div>
- <ul>
- <li><a href="https://play.google.com/apps/publish/" target="_googleplay">Google Play Developer Console</a></li>
- <li><a href="http://android-developers.blogspot.com/">Android Developers Blog</a></li>
- <li><a href="/about/index.html">About Android</a></li>
- </ul>
- <div class="header">Android Sites</div>
- <ul>
- <li><a href="http://www.android.com">Android.com</a></li>
- <li class="active"><a>Android Developers</a></li>
- <li><a href="http://source.android.com">Android Open Source Project</a></li>
- </ul>
-
-
-
- <div class="header">Language</div>
- <div id="language" class="locales">
- <select name="language" onChange="changeLangPref(this.value, true)">
- <option value="en">English</option>
- <option value="es">Español</option>
- <option value="ja">日本語</option>
- <option value="ko">한국어</option>
- <option value="ru">Русский</option>
- <option value="zh-cn">中文 (中国)</option>
- <option value="zh-tw">中文 (台灣)</option>
- </select>
- </div>
- <script type="text/javascript">
- <!--
- loadLangPref();
- //-->
- </script>
-
-
- <br class="clearfix" />
- </div><!-- end 'mid' -->
- <div class="bottom"></div>
- </div><!-- end 'moremenu' -->
-
- <div class="search" id="search-container">
- <div class="search-inner">
- <div id="search-btn"></div>
- <div class="left"></div>
- <form onsubmit="return submit_search()">
- <input id="search_autocomplete" type="text" value="" autocomplete="off" name="q"
- onfocus="search_focus_changed(this, true)" onblur="search_focus_changed(this, false)"
- onkeydown="return search_changed(event, true, '/')"
- onkeyup="return search_changed(event, false, '/')" />
- </form>
- <div class="right"></div>
- <a class="close hide">close</a>
- <div class="left"></div>
- <div class="right"></div>
- </div><!-- end search-inner -->
- </div><!-- end search-container -->
-
- <div class="search_filtered_wrapper reference">
- <div class="suggest-card reference no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- </div>
-
- <div class="search_filtered_wrapper docs">
- <div class="suggest-card dummy no-display"> </div>
- <div class="suggest-card develop no-display">
- <ul class="search_filtered">
- </ul>
- <div class="child-card guides no-display">
- </div>
- <div class="child-card training no-display">
- </div>
- <div class="child-card samples no-display">
- </div>
- </div>
- <div class="suggest-card design no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- <div class="suggest-card distribute no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- </div>
-</div><!-- end menu-container (search and menu widget) -->
-
-
- </div><!-- end header-wrap -->
- </div><!-- /Header -->
-
-
- <div id="searchResults" class="wrap" style="display:none;">
- <h2 id="searchTitle">Results</h2>
- <div id="leftSearchControl" class="search-control">Loading...</div>
- </div>
-</div> <!--end header-wrapper -->
-
-<div id="sticky-header">
- <div>
- <a class="logo" href="#top"></a>
- <a class="top" href="#top"></a>
- <ul class="breadcrumb">
-
- <li class="current">Preview Notifications Reference</li>
- </ul>
- </div>
-</div>
-
-
-
-
- <div class="wrap clearfix" id="body-content">
- <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
- <div id="devdoc-nav" class="scroll-pane">
-
-<ul id="nav">
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/preview/start.html">Get Started
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/design/user-interface.html">UI Overview
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/design/index.html">Design Principles
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/creating.html">Creating Notifications for Android Wear
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/remote-input.html">Receiving Voice Input from a Notification
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/pages.html">Adding Pages to a Notification
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/stacks.html">Stacking Notifications
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header"><a href="/reference/android/preview/support/package-summary.html">Notification Reference</a></div>
- <ul class="tree-list-children">
-<li class="nav-section">
-<div class="nav-section-header-ref"><span class="tree-list-subtitle package" title="android.preview.support.v4.app">android.preview.support.v4.app</span></div>
- <ul>
-<li><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html">NotificationManagerCompat</a></li>
- </ul>
-</li>
-
-<li class="nav-section">
-<div class="nav-section-header-ref"><span class="tree-list-subtitle package" title="android.preview.support.wearable.notifications">android.preview.support.wearable.notifications</span></div>
-<ul>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></li>
-<li><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html" >RemoteInput.Builder</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html">WearableNotifications</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html">WearableNotifications.Action.Builder</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></li>
- </ul>
- </li>
-</ul>
-</li>
-
-
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/license.html">License Agreement</a></div>
- </li>
-
-
-</ul>
-
-
-
- </div>
- </div> <!-- end side-nav -->
- <script>
- $(document).ready(function() {
- scrollIntoView("devdoc-nav");
- });
- </script>
-
-
-
-
-<div class="col-12" id="doc-col">
-
-<div id="api-info-block">
-<div class="api-level">
-
-
-
-
-</div>
-</div>
-
-
-<div id="naMessage"></div>
-
-<div id="jd-content" class="api apilevel-">
-
-
-
-
-
-
- <h2>android.preview.support.v4.app</h2>
- <div class="jd-sumtable">
-
- <table class="jd-sumtable-expando">
- <tr class=" api apilevel-" >
- <td class="jd-linkcol"><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html">NotificationManagerCompat</a></td>
- <td class="jd-descrcol" width="100%">Compatibility library for NotificationManager with fallbacks for older platforms. </td>
- </tr>
- </table>
- </div>
-
-
-
-
- <h2>android.preview.support.wearable.notifications</h2>
- <div class="jd-sumtable">
-
- <table class="jd-sumtable-expando">
- <tr class="alt-color api apilevel-" >
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></td>
- <td class="jd-descrcol" width="100%">A RemoteInput specifies a response to be collected from the user as part of an intent being
- sent. </td>
- </tr>
- <tr class=" api apilevel-" >
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html">RemoteInput.Builder</a></td>
- <td class="jd-descrcol" width="100%">Builder class for <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code> objects. </td>
- </tr>
- <tr class="alt-color api apilevel-" >
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html">WearableNotifications</a></td>
- <td class="jd-descrcol" width="100%">Helper providing extensions to android notifications for use with wearable devices. </td>
- </tr>
- <tr class=" api apilevel-" >
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></td>
- <td class="jd-descrcol" width="100%">Subclass of <code><a href="/reference/android/support/v4/app/NotificationCompat.Action.html">NotificationCompat.Action</a></code> which adds support for additional
- wearable extensions. </td>
- </tr>
- <tr class="alt-color api apilevel-" >
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html">WearableNotifications.Action.Builder</a></td>
- <td class="jd-descrcol" width="100%">Builder class for <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></code> objects. </td>
- </tr>
- <tr class=" api apilevel-" >
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></td>
- <td class="jd-descrcol" width="100%">Builder object that wraps a <code><a href="/reference/android/support/v4/app/NotificationCompat.Builder.html">NotificationCompat.Builder</a></code> to provide
- methods for adding wearable extensions to a notification. </td>
- </tr>
- </table>
- </div>
-
-
-
-
-
-
-
-
-
-
-
-
-<div id="footer" class="wrap" >
-
-
- <div id="copyright">
-
- Except as noted, this content is licensed under <a
- href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>.
- For details and restrictions, see the <a href="/license.html">
- Content License</a>.
- </div>
- <div id="build_info">
-
- Android r —
-<script src="/timestamp.js" type="text/javascript"></script>
-<script>document.write(BUILD_TIMESTAMP)</script>
-
- </div>
-
-
- <div id="footerlinks">
-
- <p>
- <a href="/about/index.html">About Android</a> |
- <a href="/legal.html">Legal</a> |
- <a href="/support.html">Support</a>
- </p>
- </div>
-
-</div> <!-- end footer -->
-</div><!-- end jd-content -->
-</div><!-- doc-content -->
-
-</div> <!-- end body-content -->
-
-
-
-
-
-
-</body>
-</html>
diff --git a/docs/html/reference/android/preview/support/v4/app/NotificationManagerCompat.html b/docs/html/reference/android/preview/support/v4/app/NotificationManagerCompat.html
deleted file mode 100644
index 8322ab2..0000000
--- a/docs/html/reference/android/preview/support/v4/app/NotificationManagerCompat.html
+++ /dev/null
@@ -1,1340 +0,0 @@
-<!DOCTYPE html>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<html>
-<head>
-
-
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="viewport" content="width=device-width" />
-
-<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
-<title>NotificationManagerCompat | Android Developers</title>
-
-<!-- STYLESHEETS -->
-<link rel="stylesheet"
-href="//fonts.googleapis.com/css?family=Roboto+Condensed">
-<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold"
- title="roboto">
-<link href="/assets/css/default.css" rel="stylesheet" type="text/css">
-
-
-
-<!-- JAVASCRIPT -->
-<script src="//www.google.com/jsapi" type="text/javascript"></script>
-<script src="/assets/js/android_3p-bundle.js" type="text/javascript"></script>
-<script type="text/javascript">
- var toRoot = "/";
- var metaTags = [];
- var devsite = false;
-</script>
-<script src="/assets/js/docs.js" type="text/javascript"></script>
-
-<script type="text/javascript">
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', 'UA-5831155-1']);
- _gaq.push(['_trackPageview']);
-
- (function() {
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
- })();
-</script>
-</head>
-
-<body class="gc-documentation
- preview" itemscope itemtype="http://schema.org/Article">
- <div id="doc-api-level" class="" style="display:none"></div>
- <a name="top"></a>
-
-
-
-<a name="top"></a>
-
-<!-- Header -->
-<div id="header-wrapper">
- <div id="header">
- <div class="wrap" id="header-wrap">
- <div class="col_3 logo wear-logo">
- <a href="/wear/index.html">
- <img src="/wear/images/android-wear.png" height="16" alt="Android Wear" />
- </a>
- </div>
- <div class="col-8" style="margin:0"><h1 style="margin:1px 0 0 20px;padding:0;line-height:16px;
-color:#666;font-weight:100;font-size:24px;">Developer Preview</h1></div>
-
-
-
-<div class="menu-container">
- <div class="moremenu">
- <div id="more-btn"></div>
- </div>
- <div class="morehover" id="moremenu">
- <div class="top"></div>
- <div class="mid">
- <div class="header">Links</div>
- <ul>
- <li><a href="https://play.google.com/apps/publish/" target="_googleplay">Google Play Developer Console</a></li>
- <li><a href="http://android-developers.blogspot.com/">Android Developers Blog</a></li>
- <li><a href="/about/index.html">About Android</a></li>
- </ul>
- <div class="header">Android Sites</div>
- <ul>
- <li><a href="http://www.android.com">Android.com</a></li>
- <li class="active"><a>Android Developers</a></li>
- <li><a href="http://source.android.com">Android Open Source Project</a></li>
- </ul>
-
-
-
- <div class="header">Language</div>
- <div id="language" class="locales">
- <select name="language" onChange="changeLangPref(this.value, true)">
- <option value="en">English</option>
- <option value="es">Español</option>
- <option value="ja">日本語</option>
- <option value="ko">한국어</option>
- <option value="ru">Русский</option>
- <option value="zh-cn">中文 (中国)</option>
- <option value="zh-tw">中文 (台灣)</option>
- </select>
- </div>
- <script type="text/javascript">
- <!--
- loadLangPref();
- //-->
- </script>
-
-
- <br class="clearfix" />
- </div><!-- end 'mid' -->
- <div class="bottom"></div>
- </div><!-- end 'moremenu' -->
-
- <div class="search" id="search-container">
- <div class="search-inner">
- <div id="search-btn"></div>
- <div class="left"></div>
- <form onsubmit="return submit_search()">
- <input id="search_autocomplete" type="text" value="" autocomplete="off" name="q"
- onfocus="search_focus_changed(this, true)" onblur="search_focus_changed(this, false)"
- onkeydown="return search_changed(event, true, '/')"
- onkeyup="return search_changed(event, false, '/')" />
- </form>
- <div class="right"></div>
- <a class="close hide">close</a>
- <div class="left"></div>
- <div class="right"></div>
- </div><!-- end search-inner -->
- </div><!-- end search-container -->
-
- <div class="search_filtered_wrapper reference">
- <div class="suggest-card reference no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- </div>
-
- <div class="search_filtered_wrapper docs">
- <div class="suggest-card dummy no-display"> </div>
- <div class="suggest-card develop no-display">
- <ul class="search_filtered">
- </ul>
- <div class="child-card guides no-display">
- </div>
- <div class="child-card training no-display">
- </div>
- <div class="child-card samples no-display">
- </div>
- </div>
- <div class="suggest-card design no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- <div class="suggest-card distribute no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- </div>
-</div><!-- end menu-container (search and menu widget) -->
-
-
- </div><!-- end header-wrap -->
- </div><!-- /Header -->
-
-
- <div id="searchResults" class="wrap" style="display:none;">
- <h2 id="searchTitle">Results</h2>
- <div id="leftSearchControl" class="search-control">Loading...</div>
- </div>
-</div> <!--end header-wrapper -->
-
-<div id="sticky-header">
- <div>
- <a class="logo" href="#top"></a>
- <a class="top" href="#top"></a>
- <ul class="breadcrumb">
-
- <li class="current">NotificationManagerCompat</li>
- </ul>
- </div>
-</div>
-
-
-
-
- <div class="wrap clearfix" id="body-content">
- <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
- <div id="devdoc-nav" class="scroll-pane">
-
-<ul id="nav">
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/preview/start.html">Get Started
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/design/user-interface.html">UI Overview
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/design/index.html">Design Principles
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/creating.html">Creating Notifications for Android Wear
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/remote-input.html">Receiving Voice Input from a Notification
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/pages.html">Adding Pages to a Notification
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/stacks.html">Stacking Notifications
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header"><a href="/reference/android/preview/support/package-summary.html">Notification Reference</a></div>
- <ul class="tree-list-children">
-<li class="nav-section">
-<div class="nav-section-header-ref"><span class="tree-list-subtitle package" title="android.preview.support.v4.app">android.preview.support.v4.app</span></div>
- <ul>
-<li><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html">NotificationManagerCompat</a></li>
- </ul>
-</li>
-
-<li class="nav-section">
-<div class="nav-section-header-ref"><span class="tree-list-subtitle package" title="android.preview.support.wearable.notifications">android.preview.support.wearable.notifications</span></div>
-<ul>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></li>
-<li><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html" >RemoteInput.Builder</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html">WearableNotifications</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html">WearableNotifications.Action.Builder</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></li>
- </ul>
- </li>
-</ul>
-</li>
-
-
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/license.html">License Agreement</a></div>
- </li>
-
-
-</ul>
-
-
-
- </div>
- </div> <!-- end side-nav -->
- <script>
- $(document).ready(function() {
- scrollIntoView("devdoc-nav");
- });
- </script>
-
-
-
-
-
-<div class="col-12" id="doc-col">
-
-<div id="api-info-block">
-
-
-
-
-
-
-
-
-
-
-
-<div class="sum-details-links">
-
-Summary:
-
-
-
-
-
- <a href="#constants">Constants</a>
-
-
-
-
-
-
-
-
- | <a href="#pubmethods">Methods</a>
-
-
-
-
- | <a href="#inhmethods">Inherited Methods</a>
-
-| <a href="#" onclick="return toggleAllClassInherited()" id="toggleAllClassInherited">[Expand All]</a>
-
-</div><!-- end sum-details-links -->
-<div class="api-level">
-
-
-
-
-</div>
-</div><!-- end api-info-block -->
-
-
-<!-- ======== START OF CLASS DATA ======== -->
-
-<div id="jd-header">
- public
-
-
-
- class
-<h1 itemprop="name">NotificationManagerCompat</h1>
-
-
-
-
- extends <a href="http://developer.android.com/reference/java/lang/Object.html">Object</a><br/>
-
-
-
-
-
-
-
-
-
-</div><!-- end header -->
-
-<div id="naMessage"></div>
-
-<div id="jd-content" class="api apilevel-">
-<table class="jd-inheritance-table">
-
-
- <tr>
-
- <td colspan="2" class="jd-inheritance-class-cell"><a href="http://developer.android.com/reference/java/lang/Object.html">java.lang.Object</a></td>
- </tr>
-
-
- <tr>
-
- <td class="jd-inheritance-space"> ↳</td>
-
- <td colspan="1" class="jd-inheritance-class-cell">android.preview.support.v4.app.NotificationManagerCompat</td>
- </tr>
-
-
-</table>
-
-
-
-
-
-
-
-<div class="jd-descr">
-
-
-<h2>Class Overview</h2>
-<p itemprop="articleBody">Compatibility library for NotificationManager with fallbacks for older platforms.
-
- <p>To use this class, call the static function <code><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html#from(android.content.Context)">from(Context)</a></code> to get a
- <code><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html">NotificationManagerCompat</a></code> object, and then call one of its
- methods to post or cancel notifications.
-</p>
-
-
-
-
-
-</div><!-- jd-descr -->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<div class="jd-descr">
-
-
-<h2>Summary</h2>
-
-
-
-
-
-
-
-
-
-
-
-
-
-<!-- =========== ENUM CONSTANT SUMMARY =========== -->
-<table id="constants" class="jd-sumtable"><tr><th colspan="12">Constants</th></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><a href="http://developer.android.com/reference/java/lang/String.html">String</a></td>
- <td class="jd-linkcol"><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html#ACTION_BIND_SIDE_CHANNEL">ACTION_BIND_SIDE_CHANNEL</a></td>
- <td class="jd-descrcol" width="100%">Intent action to register for on a service to receive side channel
- notifications.</td>
- </tr>
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><a href="http://developer.android.com/reference/java/lang/String.html">String</a></td>
- <td class="jd-linkcol"><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html#EXTRA_USE_SIDE_CHANNEL">EXTRA_USE_SIDE_CHANNEL</a></td>
- <td class="jd-descrcol" width="100%">Notification extras key: if set to true, the posted notification should use
- the side channel for delivery instead of using notification manager.</td>
- </tr>
-
-
-
-</table>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-<table id="pubmethods" class="jd-sumtable"><tr><th colspan="12">Public Methods</th></tr>
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html#cancel(int)">cancel</a></span>(int id)</nobr>
-
- <div class="jd-descrdiv">Cancel a previously shown notification.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html#cancel(java.lang.String, int)">cancel</a></span>(<a href="http://developer.android.com/reference/java/lang/String.html">String</a> tag, int id)</nobr>
-
- <div class="jd-descrdiv">Cancel a previously shown notification.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html#cancelAll()">cancelAll</a></span>()</nobr>
-
- <div class="jd-descrdiv">Cancel all previously shown notifications.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- <a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html">NotificationManagerCompat</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html#from(android.content.Context)">from</a></span>(<a href="http://developer.android.com/reference/android/content/Context.html">Context</a> context)</nobr>
-
- <div class="jd-descrdiv">Get a <code><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html">NotificationManagerCompat</a></code> instance for a provided context.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- <a href="http://developer.android.com/reference/java/util/Set.html">Set</a><<a href="http://developer.android.com/reference/java/lang/String.html">String</a>></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html#getEnabledListenerPackages(android.content.Context)">getEnabledListenerPackages</a></span>(<a href="http://developer.android.com/reference/android/content/Context.html">Context</a> context)</nobr>
-
- <div class="jd-descrdiv">Get the list of packages that have an enabled notification listener component within them,
- with caching for performance.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html#notify(int, android.app.Notification)">notify</a></span>(int id, <a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notification)</nobr>
-
- <div class="jd-descrdiv">Post a notification to be shown in the status bar, stream, etc.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html#notify(java.lang.String, int, android.app.Notification)">notify</a></span>(<a href="http://developer.android.com/reference/java/lang/String.html">String</a> tag, int id, <a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notification)</nobr>
-
- <div class="jd-descrdiv">Post a notification to be shown in the status bar, stream, etc.</div>
-
- </td></tr>
-
-
-
-</table>
-
-
-
-
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-<table id="inhmethods" class="jd-sumtable"><tr><th>
- <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
- <div style="clear:left;">Inherited Methods</div></th></tr>
-
-
-<tr class="api apilevel-" >
-<td colspan="12">
- <a href="#" onclick="return toggleInherited(this, null)" id="inherited-methods-java.lang.Object" class="jd-expando-trigger closed"
- ><img id="inherited-methods-java.lang.Object-trigger"
- src="/assets/images/triangle-closed.png"
- class="jd-expando-trigger-img" /></a>
-From class
-
- <a href="http://developer.android.com/reference/java/lang/Object.html">java.lang.Object</a>
-
-<div id="inherited-methods-java.lang.Object">
- <div id="inherited-methods-java.lang.Object-list"
- class="jd-inheritedlinks">
- </div>
- <div id="inherited-methods-java.lang.Object-summary" style="display: none;">
- <table class="jd-sumtable-expando">
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/java/lang/Object.html">Object</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">clone</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- boolean</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">equals</span>(<a href="http://developer.android.com/reference/java/lang/Object.html">Object</a> arg0)</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">finalize</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- <a href="http://developer.android.com/reference/java/lang/Class.html">Class</a><?></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">getClass</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- int</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">hashCode</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">notify</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">notifyAll</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/java/lang/String.html">String</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">toString</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>(long arg0, int arg1)</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>(long arg0)</nobr>
-
- </td></tr>
-
-
-</table>
- </div>
-</div>
-</td></tr>
-
-
-</table>
-
-
-</div><!-- jd-descr (summary) -->
-
-<!-- Details -->
-
-
-
-
-
-
-
-
-<!-- XML Attributes -->
-
-
-<!-- Enum Values -->
-
-
-<!-- Constants -->
-
-
-<!-- ========= ENUM CONSTANTS DETAIL ======== -->
-<h2>Constants</h2>
-
-
-
-
-<A NAME="ACTION_BIND_SIDE_CHANNEL"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
- final
- <a href="http://developer.android.com/reference/java/lang/String.html">String</a>
- </span>
- ACTION_BIND_SIDE_CHANNEL
- </h4>
- <div class="api-level">
-
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Intent action to register for on a service to receive side channel
- notifications. The listening service must be in the same package as an enabled
- <code><a href="/">ERROR(/android.service.notification.NotificationListenerService)</a></code>.
-</p></div>
-
-
- <div class="jd-tagdata">
- <span class="jd-tagtitle">Constant Value: </span>
- <span>
-
- "android.support.app.notification.BIND_SIDE_CHANNEL"
-
- </span>
- </div>
-
- </div>
-</div>
-
-
-
-<A NAME="EXTRA_USE_SIDE_CHANNEL"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
- final
- <a href="http://developer.android.com/reference/java/lang/String.html">String</a>
- </span>
- EXTRA_USE_SIDE_CHANNEL
- </h4>
- <div class="api-level">
-
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Notification extras key: if set to true, the posted notification should use
- the side channel for delivery instead of using notification manager.
-</p></div>
-
-
- <div class="jd-tagdata">
- <span class="jd-tagtitle">Constant Value: </span>
- <span>
-
- "android.preview.support.useSideChannel"
-
- </span>
- </div>
-
- </div>
-</div>
-
-
-
-
-<!-- Fields -->
-
-
-<!-- Public ctors -->
-
-
-
-<!-- ========= CONSTRUCTOR DETAIL ======== -->
-<!-- Protected ctors -->
-
-
-
-<!-- ========= METHOD DETAIL ======== -->
-<!-- Public methdos -->
-
-<h2>Public Methods</h2>
-
-
-
-<A NAME="cancel(int)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- void
- </span>
- <span class="sympad">cancel</span>
- <span class="normal">(int id)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Cancel a previously shown notification.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>id</td>
- <td>the ID of the notification
-</td>
- </tr>
- </table>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="cancel(java.lang.String, int)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- void
- </span>
- <span class="sympad">cancel</span>
- <span class="normal">(<a href="http://developer.android.com/reference/java/lang/String.html">String</a> tag, int id)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Cancel a previously shown notification.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>tag</td>
- <td>the string identifier of the notification.</td>
- </tr>
- <tr>
- <th>id</td>
- <td>the ID of the notification
-</td>
- </tr>
- </table>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="cancelAll()"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- void
- </span>
- <span class="sympad">cancelAll</span>
- <span class="normal">()</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Cancel all previously shown notifications. </p></div>
-
- </div>
-</div>
-
-
-<A NAME="from(android.content.Context)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- <a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html">NotificationManagerCompat</a>
- </span>
- <span class="sympad">from</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/content/Context.html">Context</a> context)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Get a <code><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html">NotificationManagerCompat</a></code> instance for a provided context. </p></div>
-
- </div>
-</div>
-
-
-<A NAME="getEnabledListenerPackages(android.content.Context)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- <a href="http://developer.android.com/reference/java/util/Set.html">Set</a><<a href="http://developer.android.com/reference/java/lang/String.html">String</a>>
- </span>
- <span class="sympad">getEnabledListenerPackages</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/content/Context.html">Context</a> context)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Get the list of packages that have an enabled notification listener component within them,
- with caching for performance.
-</p></div>
-
- </div>
-</div>
-
-
-<A NAME="notify(int, android.app.Notification)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- void
- </span>
- <span class="sympad">notify</span>
- <span class="normal">(int id, <a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notification)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Post a notification to be shown in the status bar, stream, etc.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>id</td>
- <td>the ID of the notification</td>
- </tr>
- <tr>
- <th>notification</td>
- <td>the notification to post to the system
-</td>
- </tr>
- </table>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="notify(java.lang.String, int, android.app.Notification)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- void
- </span>
- <span class="sympad">notify</span>
- <span class="normal">(<a href="http://developer.android.com/reference/java/lang/String.html">String</a> tag, int id, <a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notification)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Post a notification to be shown in the status bar, stream, etc.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>tag</td>
- <td>the string identifier for a notification. Can be <code>null</code>.</td>
- </tr>
- <tr>
- <th>id</td>
- <td>the ID of the notification. The pair (tag, id) must be unique within your app.</td>
- </tr>
- <tr>
- <th>notification</td>
- <td>the notification to post to the system
-</td>
- </tr>
- </table>
- </div>
-
- </div>
-</div>
-
-
-
-
-
-<!-- ========= METHOD DETAIL ======== -->
-
-
-
-<!-- ========= END OF CLASS DATA ========= -->
-<A NAME="navbar_top"></A>
-
-<div id="footer" class="wrap" >
-
-
- <div id="copyright">
-
- Except as noted, this content is licensed under <a
- href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>.
- For details and restrictions, see the <a href="/license.html">
- Content License</a>.
- </div>
- <div id="build_info">
-
- Android r —
-<script src="/timestamp.js" type="text/javascript"></script>
-<script>document.write(BUILD_TIMESTAMP)</script>
-
- </div>
-
-
- <div id="footerlinks">
-
- <p>
- <a href="/about/index.html">About Android</a> |
- <a href="/legal.html">Legal</a> |
- <a href="/support.html">Support</a>
- </p>
- </div>
-
-</div> <!-- end footer -->
-</div> <!-- jd-content -->
-
-</div><!-- end doc-content -->
-
-</div> <!-- end body-content -->
-
-
-
-
-
-
-</body>
-</html>
diff --git a/docs/html/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html b/docs/html/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html
deleted file mode 100644
index 77807e4..0000000
--- a/docs/html/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html
+++ /dev/null
@@ -1,1152 +0,0 @@
-<!DOCTYPE html>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<html>
-<head>
-
-
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="viewport" content="width=device-width" />
-
-<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
-<title>RemoteInput.Builder | Android Developers</title>
-
-<!-- STYLESHEETS -->
-<link rel="stylesheet"
-href="//fonts.googleapis.com/css?family=Roboto+Condensed">
-<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold"
- title="roboto">
-<link href="/assets/css/default.css" rel="stylesheet" type="text/css">
-
-
-
-<!-- JAVASCRIPT -->
-<script src="//www.google.com/jsapi" type="text/javascript"></script>
-<script src="/assets/js/android_3p-bundle.js" type="text/javascript"></script>
-<script type="text/javascript">
- var toRoot = "/";
- var metaTags = [];
- var devsite = false;
-</script>
-<script src="/assets/js/docs.js" type="text/javascript"></script>
-
-<script type="text/javascript">
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', 'UA-5831155-1']);
- _gaq.push(['_trackPageview']);
-
- (function() {
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
- })();
-</script>
-</head>
-
-<body class="gc-documentation
- preview" itemscope itemtype="http://schema.org/Article">
- <div id="doc-api-level" class="" style="display:none"></div>
- <a name="top"></a>
-
-
-
-<a name="top"></a>
-
-<!-- Header -->
-<div id="header-wrapper">
- <div id="header">
- <div class="wrap" id="header-wrap">
- <div class="col_3 logo wear-logo">
- <a href="/wear/index.html">
- <img src="/wear/images/android-wear.png" height="16" alt="Android Wear" />
- </a>
- </div>
- <div class="col-8" style="margin:0"><h1 style="margin:1px 0 0 20px;padding:0;line-height:16px;
-color:#666;font-weight:100;font-size:24px;">Developer Preview</h1></div>
-
-
-
-<div class="menu-container">
- <div class="moremenu">
- <div id="more-btn"></div>
- </div>
- <div class="morehover" id="moremenu">
- <div class="top"></div>
- <div class="mid">
- <div class="header">Links</div>
- <ul>
- <li><a href="https://play.google.com/apps/publish/" target="_googleplay">Google Play Developer Console</a></li>
- <li><a href="http://android-developers.blogspot.com/">Android Developers Blog</a></li>
- <li><a href="/about/index.html">About Android</a></li>
- </ul>
- <div class="header">Android Sites</div>
- <ul>
- <li><a href="http://www.android.com">Android.com</a></li>
- <li class="active"><a>Android Developers</a></li>
- <li><a href="http://source.android.com">Android Open Source Project</a></li>
- </ul>
-
-
-
- <div class="header">Language</div>
- <div id="language" class="locales">
- <select name="language" onChange="changeLangPref(this.value, true)">
- <option value="en">English</option>
- <option value="es">Español</option>
- <option value="ja">日本語</option>
- <option value="ko">한국어</option>
- <option value="ru">Русский</option>
- <option value="zh-cn">中文 (中国)</option>
- <option value="zh-tw">中文 (台灣)</option>
- </select>
- </div>
- <script type="text/javascript">
- <!--
- loadLangPref();
- //-->
- </script>
-
-
- <br class="clearfix" />
- </div><!-- end 'mid' -->
- <div class="bottom"></div>
- </div><!-- end 'moremenu' -->
-
- <div class="search" id="search-container">
- <div class="search-inner">
- <div id="search-btn"></div>
- <div class="left"></div>
- <form onsubmit="return submit_search()">
- <input id="search_autocomplete" type="text" value="" autocomplete="off" name="q"
- onfocus="search_focus_changed(this, true)" onblur="search_focus_changed(this, false)"
- onkeydown="return search_changed(event, true, '/')"
- onkeyup="return search_changed(event, false, '/')" />
- </form>
- <div class="right"></div>
- <a class="close hide">close</a>
- <div class="left"></div>
- <div class="right"></div>
- </div><!-- end search-inner -->
- </div><!-- end search-container -->
-
- <div class="search_filtered_wrapper reference">
- <div class="suggest-card reference no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- </div>
-
- <div class="search_filtered_wrapper docs">
- <div class="suggest-card dummy no-display"> </div>
- <div class="suggest-card develop no-display">
- <ul class="search_filtered">
- </ul>
- <div class="child-card guides no-display">
- </div>
- <div class="child-card training no-display">
- </div>
- <div class="child-card samples no-display">
- </div>
- </div>
- <div class="suggest-card design no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- <div class="suggest-card distribute no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- </div>
-</div><!-- end menu-container (search and menu widget) -->
-
-
- </div><!-- end header-wrap -->
- </div><!-- /Header -->
-
-
- <div id="searchResults" class="wrap" style="display:none;">
- <h2 id="searchTitle">Results</h2>
- <div id="leftSearchControl" class="search-control">Loading...</div>
- </div>
-</div> <!--end header-wrapper -->
-
-<div id="sticky-header">
- <div>
- <a class="logo" href="#top"></a>
- <a class="top" href="#top"></a>
- <ul class="breadcrumb">
-
- <li class="current">RemoteInput.Builder</li>
- </ul>
- </div>
-</div>
-
-
-
-
- <div class="wrap clearfix" id="body-content">
- <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
- <div id="devdoc-nav" class="scroll-pane">
-
-<ul id="nav">
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/preview/start.html">Get Started
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/design/user-interface.html">UI Overview
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/design/index.html">Design Principles
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/creating.html">Creating Notifications for Android Wear
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/remote-input.html">Receiving Voice Input from a Notification
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/pages.html">Adding Pages to a Notification
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/stacks.html">Stacking Notifications
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header"><a href="/reference/android/preview/support/package-summary.html">Notification Reference</a></div>
- <ul class="tree-list-children">
-<li class="nav-section">
-<div class="nav-section-header-ref"><span class="tree-list-subtitle package" title="android.preview.support.v4.app">android.preview.support.v4.app</span></div>
- <ul>
-<li><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html">NotificationManagerCompat</a></li>
- </ul>
-</li>
-
-<li class="nav-section">
-<div class="nav-section-header-ref"><span class="tree-list-subtitle package" title="android.preview.support.wearable.notifications">android.preview.support.wearable.notifications</span></div>
-<ul>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></li>
-<li><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html" >RemoteInput.Builder</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html">WearableNotifications</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html">WearableNotifications.Action.Builder</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></li>
- </ul>
- </li>
-</ul>
-</li>
-
-
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/license.html">License Agreement</a></div>
- </li>
-
-
-</ul>
-
-
-
- </div>
- </div> <!-- end side-nav -->
- <script>
- $(document).ready(function() {
- scrollIntoView("devdoc-nav");
- });
- </script>
-
-
-
-
-
-<div class="col-12" id="doc-col">
-
-<div id="api-info-block">
-
-
-
-
-
-
-
-
-
-
-
-<div class="sum-details-links">
-
-Summary:
-
-
-
-
-
-
-
-
-
- <a href="#pubctors">Ctors</a>
-
-
-
-
- | <a href="#pubmethods">Methods</a>
-
-
-
-
- | <a href="#inhmethods">Inherited Methods</a>
-
-| <a href="#" onclick="return toggleAllClassInherited()" id="toggleAllClassInherited">[Expand All]</a>
-
-</div><!-- end sum-details-links -->
-<div class="api-level">
-
-
-
-
-</div>
-</div><!-- end api-info-block -->
-
-
-<!-- ======== START OF CLASS DATA ======== -->
-
-<div id="jd-header">
- public
- static
-
-
- class
-<h1 itemprop="name">RemoteInput.Builder</h1>
-
-
-
-
- extends <a href="http://developer.android.com/reference/java/lang/Object.html">Object</a><br/>
-
-
-
-
-
-
-
-
-
-</div><!-- end header -->
-
-<div id="naMessage"></div>
-
-<div id="jd-content" class="api apilevel-">
-<table class="jd-inheritance-table">
-
-
- <tr>
-
- <td colspan="2" class="jd-inheritance-class-cell"><a href="http://developer.android.com/reference/java/lang/Object.html">java.lang.Object</a></td>
- </tr>
-
-
- <tr>
-
- <td class="jd-inheritance-space"> ↳</td>
-
- <td colspan="1" class="jd-inheritance-class-cell">android.preview.support.wearable.notifications.RemoteInput.Builder</td>
- </tr>
-
-
-</table>
-
-
-
-
-
-
-
-<div class="jd-descr">
-
-
-<h2>Class Overview</h2>
-<p itemprop="articleBody">Builder class for <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code> objects.
-</p>
-
-
-
-
-
-</div><!-- jd-descr -->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<div class="jd-descr">
-
-
-<h2>Summary</h2>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<!-- ======== CONSTRUCTOR SUMMARY ======== -->
-<table id="pubctors" class="jd-sumtable"><tr><th colspan="12">Public Constructors</th></tr>
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- </nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html#RemoteInput.Builder(java.lang.String)">RemoteInput.Builder</a></span>(<a href="http://developer.android.com/reference/java/lang/String.html">String</a> returnKey)</nobr>
-
- <div class="jd-descrdiv">Create a builder object for <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code> objects.</div>
-
- </td></tr>
-
-
-
-</table>
-
-
-
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-<table id="pubmethods" class="jd-sumtable"><tr><th colspan="12">Public Methods</th></tr>
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html#build()">build</a></span>()</nobr>
-
- <div class="jd-descrdiv">Combine all of the options that have been set and return a new <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code>
- object.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html">RemoteInput.Builder</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html#setAllowFreeFormInput(boolean)">setAllowFreeFormInput</a></span>(boolean allowFreeFormInput)</nobr>
-
- <div class="jd-descrdiv">Specifies whether the user can provide arbitrary values.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html">RemoteInput.Builder</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html#setChoices(java.lang.String[])">setChoices</a></span>(<a href="http://developer.android.com/reference/java/lang/String.html">String[]</a> choices)</nobr>
-
- <div class="jd-descrdiv">Specifies choices available to the user to satisfy this input.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html">RemoteInput.Builder</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html#setLabel(java.lang.String)">setLabel</a></span>(<a href="http://developer.android.com/reference/java/lang/String.html">String</a> label)</nobr>
-
- <div class="jd-descrdiv">Set a label to be displayed to the user when collecting this input.</div>
-
- </td></tr>
-
-
-
-</table>
-
-
-
-
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-<table id="inhmethods" class="jd-sumtable"><tr><th>
- <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
- <div style="clear:left;">Inherited Methods</div></th></tr>
-
-
-<tr class="api apilevel-" >
-<td colspan="12">
- <a href="#" onclick="return toggleInherited(this, null)" id="inherited-methods-java.lang.Object" class="jd-expando-trigger closed"
- ><img id="inherited-methods-java.lang.Object-trigger"
- src="/assets/images/triangle-closed.png"
- class="jd-expando-trigger-img" /></a>
-From class
-
- <a href="http://developer.android.com/reference/java/lang/Object.html">java.lang.Object</a>
-
-<div id="inherited-methods-java.lang.Object">
- <div id="inherited-methods-java.lang.Object-list"
- class="jd-inheritedlinks">
- </div>
- <div id="inherited-methods-java.lang.Object-summary" style="display: none;">
- <table class="jd-sumtable-expando">
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/java/lang/Object.html">Object</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">clone</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- boolean</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">equals</span>(<a href="http://developer.android.com/reference/java/lang/Object.html">Object</a> arg0)</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">finalize</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- <a href="http://developer.android.com/reference/java/lang/Class.html">Class</a><?></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">getClass</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- int</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">hashCode</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">notify</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">notifyAll</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/java/lang/String.html">String</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">toString</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>(long arg0, int arg1)</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>(long arg0)</nobr>
-
- </td></tr>
-
-
-</table>
- </div>
-</div>
-</td></tr>
-
-
-</table>
-
-
-</div><!-- jd-descr (summary) -->
-
-<!-- Details -->
-
-
-
-
-
-
-
-
-<!-- XML Attributes -->
-
-
-<!-- Enum Values -->
-
-
-<!-- Constants -->
-
-
-<!-- Fields -->
-
-
-<!-- Public ctors -->
-
-
-<!-- ========= CONSTRUCTOR DETAIL ======== -->
-<h2>Public Constructors</h2>
-
-
-
-<A NAME="RemoteInput.Builder(java.lang.String)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
-
- </span>
- <span class="sympad">RemoteInput.Builder</span>
- <span class="normal">(<a href="http://developer.android.com/reference/java/lang/String.html">String</a> returnKey)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Create a builder object for <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code> objects.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>returnKey</td>
- <td>the intent extras key that refers to the input collected from the user</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>this object for method chaining
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-
-
-
-<!-- ========= CONSTRUCTOR DETAIL ======== -->
-<!-- Protected ctors -->
-
-
-
-<!-- ========= METHOD DETAIL ======== -->
-<!-- Public methdos -->
-
-<h2>Public Methods</h2>
-
-
-
-<A NAME="build()"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a>
- </span>
- <span class="sympad">build</span>
- <span class="normal">()</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Combine all of the options that have been set and return a new <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code>
- object.
-</p></div>
-
- </div>
-</div>
-
-
-<A NAME="setAllowFreeFormInput(boolean)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html">RemoteInput.Builder</a>
- </span>
- <span class="sympad">setAllowFreeFormInput</span>
- <span class="normal">(boolean allowFreeFormInput)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Specifies whether the user can provide arbitrary values.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>allowFreeFormInput</td>
- <td>The default is <code>true</code>.
- If you specify <code>false</code>, you must
- provide a non-null and non-empty array to <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html#setChoices(java.lang.String[])">setChoices(String[])</a></code> or
- an <code><a href="http://developer.android.com/reference/java/lang/IllegalArgumentException.html">IllegalArgumentException</a></code> is thrown.</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>this object for method chaining
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setChoices(java.lang.String[])"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html">RemoteInput.Builder</a>
- </span>
- <span class="sympad">setChoices</span>
- <span class="normal">(<a href="http://developer.android.com/reference/java/lang/String.html">String[]</a> choices)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Specifies choices available to the user to satisfy this input.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>choices</td>
- <td>an array of pre-defined choices for users input.
- You must provide a non-null and non-empty array if
- you set <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html#allowFreeFormInput">allowFreeFormInput</a></code> to <code>false</code>.</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>this object for method chaining
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setLabel(java.lang.String)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html">RemoteInput.Builder</a>
- </span>
- <span class="sympad">setLabel</span>
- <span class="normal">(<a href="http://developer.android.com/reference/java/lang/String.html">String</a> label)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Set a label to be displayed to the user when collecting this input.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>label</td>
- <td>The label to show to users when they input a response.</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>this object for method chaining
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-
-
-
-<!-- ========= METHOD DETAIL ======== -->
-
-
-
-<!-- ========= END OF CLASS DATA ========= -->
-<A NAME="navbar_top"></A>
-
-<div id="footer" class="wrap" >
-
-
- <div id="copyright">
-
- Except as noted, this content is licensed under <a
- href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>.
- For details and restrictions, see the <a href="/license.html">
- Content License</a>.
- </div>
- <div id="build_info">
-
- Android r —
-<script src="/timestamp.js" type="text/javascript"></script>
-<script>document.write(BUILD_TIMESTAMP)</script>
-
- </div>
-
-
- <div id="footerlinks">
-
- <p>
- <a href="/about/index.html">About Android</a> |
- <a href="/legal.html">Legal</a> |
- <a href="/support.html">Support</a>
- </p>
- </div>
-
-</div> <!-- end footer -->
-</div> <!-- jd-content -->
-
-</div><!-- end doc-content -->
-
-</div> <!-- end body-content -->
-
-
-
-
-
-
-</body>
-</html>
diff --git a/docs/html/reference/android/preview/support/wearable/notifications/RemoteInput.html b/docs/html/reference/android/preview/support/wearable/notifications/RemoteInput.html
deleted file mode 100644
index 43fd36e..0000000
--- a/docs/html/reference/android/preview/support/wearable/notifications/RemoteInput.html
+++ /dev/null
@@ -1,1314 +0,0 @@
-<!DOCTYPE html>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<html>
-<head>
-
-
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="viewport" content="width=device-width" />
-
-<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
-<title>RemoteInput | Android Developers</title>
-
-<!-- STYLESHEETS -->
-<link rel="stylesheet"
-href="//fonts.googleapis.com/css?family=Roboto+Condensed">
-<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold"
- title="roboto">
-<link href="/assets/css/default.css" rel="stylesheet" type="text/css">
-
-
-
-<!-- JAVASCRIPT -->
-<script src="//www.google.com/jsapi" type="text/javascript"></script>
-<script src="/assets/js/android_3p-bundle.js" type="text/javascript"></script>
-<script type="text/javascript">
- var toRoot = "/";
- var metaTags = [];
- var devsite = false;
-</script>
-<script src="/assets/js/docs.js" type="text/javascript"></script>
-
-<script type="text/javascript">
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', 'UA-5831155-1']);
- _gaq.push(['_trackPageview']);
-
- (function() {
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
- })();
-</script>
-</head>
-
-<body class="gc-documentation
- preview" itemscope itemtype="http://schema.org/Article">
- <div id="doc-api-level" class="" style="display:none"></div>
- <a name="top"></a>
-
-
-
-<a name="top"></a>
-
-<!-- Header -->
-<div id="header-wrapper">
- <div id="header">
- <div class="wrap" id="header-wrap">
- <div class="col_3 logo wear-logo">
- <a href="/wear/index.html">
- <img src="/wear/images/android-wear.png" height="16" alt="Android Wear" />
- </a>
- </div>
- <div class="col-8" style="margin:0"><h1 style="margin:1px 0 0 20px;padding:0;line-height:16px;
-color:#666;font-weight:100;font-size:24px;">Developer Preview</h1></div>
-
-
-
-<div class="menu-container">
- <div class="moremenu">
- <div id="more-btn"></div>
- </div>
- <div class="morehover" id="moremenu">
- <div class="top"></div>
- <div class="mid">
- <div class="header">Links</div>
- <ul>
- <li><a href="https://play.google.com/apps/publish/" target="_googleplay">Google Play Developer Console</a></li>
- <li><a href="http://android-developers.blogspot.com/">Android Developers Blog</a></li>
- <li><a href="/about/index.html">About Android</a></li>
- </ul>
- <div class="header">Android Sites</div>
- <ul>
- <li><a href="http://www.android.com">Android.com</a></li>
- <li class="active"><a>Android Developers</a></li>
- <li><a href="http://source.android.com">Android Open Source Project</a></li>
- </ul>
-
-
-
- <div class="header">Language</div>
- <div id="language" class="locales">
- <select name="language" onChange="changeLangPref(this.value, true)">
- <option value="en">English</option>
- <option value="es">Español</option>
- <option value="ja">日本語</option>
- <option value="ko">한국어</option>
- <option value="ru">Русский</option>
- <option value="zh-cn">中文 (中国)</option>
- <option value="zh-tw">中文 (台灣)</option>
- </select>
- </div>
- <script type="text/javascript">
- <!--
- loadLangPref();
- //-->
- </script>
-
-
- <br class="clearfix" />
- </div><!-- end 'mid' -->
- <div class="bottom"></div>
- </div><!-- end 'moremenu' -->
-
- <div class="search" id="search-container">
- <div class="search-inner">
- <div id="search-btn"></div>
- <div class="left"></div>
- <form onsubmit="return submit_search()">
- <input id="search_autocomplete" type="text" value="" autocomplete="off" name="q"
- onfocus="search_focus_changed(this, true)" onblur="search_focus_changed(this, false)"
- onkeydown="return search_changed(event, true, '/')"
- onkeyup="return search_changed(event, false, '/')" />
- </form>
- <div class="right"></div>
- <a class="close hide">close</a>
- <div class="left"></div>
- <div class="right"></div>
- </div><!-- end search-inner -->
- </div><!-- end search-container -->
-
- <div class="search_filtered_wrapper reference">
- <div class="suggest-card reference no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- </div>
-
- <div class="search_filtered_wrapper docs">
- <div class="suggest-card dummy no-display"> </div>
- <div class="suggest-card develop no-display">
- <ul class="search_filtered">
- </ul>
- <div class="child-card guides no-display">
- </div>
- <div class="child-card training no-display">
- </div>
- <div class="child-card samples no-display">
- </div>
- </div>
- <div class="suggest-card design no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- <div class="suggest-card distribute no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- </div>
-</div><!-- end menu-container (search and menu widget) -->
-
-
- </div><!-- end header-wrap -->
- </div><!-- /Header -->
-
-
- <div id="searchResults" class="wrap" style="display:none;">
- <h2 id="searchTitle">Results</h2>
- <div id="leftSearchControl" class="search-control">Loading...</div>
- </div>
-</div> <!--end header-wrapper -->
-
-<div id="sticky-header">
- <div>
- <a class="logo" href="#top"></a>
- <a class="top" href="#top"></a>
- <ul class="breadcrumb">
-
- <li class="current">RemoteInput</li>
- </ul>
- </div>
-</div>
-
-
-
-
- <div class="wrap clearfix" id="body-content">
- <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
- <div id="devdoc-nav" class="scroll-pane">
-
-<ul id="nav">
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/preview/start.html">Get Started
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/design/user-interface.html">UI Overview
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/design/index.html">Design Principles
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/creating.html">Creating Notifications for Android Wear
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/remote-input.html">Receiving Voice Input from a Notification
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/pages.html">Adding Pages to a Notification
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/stacks.html">Stacking Notifications
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header"><a href="/reference/android/preview/support/package-summary.html">Notification Reference</a></div>
- <ul class="tree-list-children">
-<li class="nav-section">
-<div class="nav-section-header-ref"><span class="tree-list-subtitle package" title="android.preview.support.v4.app">android.preview.support.v4.app</span></div>
- <ul>
-<li><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html">NotificationManagerCompat</a></li>
- </ul>
-</li>
-
-<li class="nav-section">
-<div class="nav-section-header-ref"><span class="tree-list-subtitle package" title="android.preview.support.wearable.notifications">android.preview.support.wearable.notifications</span></div>
-<ul>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></li>
-<li><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html" >RemoteInput.Builder</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html">WearableNotifications</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html">WearableNotifications.Action.Builder</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></li>
- </ul>
- </li>
-</ul>
-</li>
-
-
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/license.html">License Agreement</a></div>
- </li>
-
-
-</ul>
-
-
-
- </div>
- </div> <!-- end side-nav -->
- <script>
- $(document).ready(function() {
- scrollIntoView("devdoc-nav");
- });
- </script>
-
-
-
-
-
-<div class="col-12" id="doc-col">
-
-<div id="api-info-block">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<div class="sum-details-links">
-
-Summary:
-
- <a href="#nestedclasses">Nested Classes</a>
-
-
-
-
-
-
-
- | <a href="#inhconstants">Inherited Constants</a>
-
-
-
- | <a href="#lfields">Fields</a>
-
-
-
-
-
-
- | <a href="#pubmethods">Methods</a>
-
-
-
-
- | <a href="#inhmethods">Inherited Methods</a>
-
-| <a href="#" onclick="return toggleAllClassInherited()" id="toggleAllClassInherited">[Expand All]</a>
-
-</div><!-- end sum-details-links -->
-<div class="api-level">
-
-
-
-
-</div>
-</div><!-- end api-info-block -->
-
-
-<!-- ======== START OF CLASS DATA ======== -->
-
-<div id="jd-header">
- public
-
-
-
- class
-<h1 itemprop="name">RemoteInput</h1>
-
-
-
-
- extends <a href="http://developer.android.com/reference/java/lang/Object.html">Object</a><br/>
-
-
-
-
-
-
- implements
-
- <a href="http://developer.android.com/reference/android/os/Parcelable.html">Parcelable</a>
-
-
-
-
-
-</div><!-- end header -->
-
-<div id="naMessage"></div>
-
-<div id="jd-content" class="api apilevel-">
-<table class="jd-inheritance-table">
-
-
- <tr>
-
- <td colspan="2" class="jd-inheritance-class-cell"><a href="http://developer.android.com/reference/java/lang/Object.html">java.lang.Object</a></td>
- </tr>
-
-
- <tr>
-
- <td class="jd-inheritance-space"> ↳</td>
-
- <td colspan="1" class="jd-inheritance-class-cell">android.preview.support.wearable.notifications.RemoteInput</td>
- </tr>
-
-
-</table>
-
-
-
-
-
-
-
-<div class="jd-descr">
-
-
-<h2>Class Overview</h2>
-<p itemprop="articleBody">A <code>RemoteInput</code> object collects a response from users and sets the
- response as an intent extra inside the <code><a href="http://developer.android.com/reference/android/app/PendingIntent.html">PendingIntent</a></code> that is sent.
- Always use <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html">RemoteInput.Builder</a></code> to create instances of this class.
- <p class="note"> See
- <a href="/wear/notifications/remote-input.html">Receiving Voice Input from
- a Notification</a> for more information on how to use this class.
-
- <p>The following example adds a <code>RemoteInput</code> to a <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></code>,
- sets the intent extra key as <code>quick_reply</code>, and sets the label as <code>Quick Reply</code>.
- Users are prompted to input a response when they trigger the action. The results are sent as an
- intent extra with the key of <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html#returnKey">returnKey</a></code> in the action's
- <code><a href="http://developer.android.com/reference/android/app/PendingIntent.html">PendingIntent</a></code>.
-
- <pre class="prettyprint">
- public static final String EXTRA_QUICK_REPLY_TEXT = "quick_reply";
- WearableNotifications.Action action = new WearableNotifications.Action.Builder(
- R.drawable.reply, "Reply", actionIntent)
- <b>.addRemoteInput(new RemoteInput.Builder(EXTRA_QUICK_REPLY_TEXT)
- .setLabel("Quick reply").build()</b>)
- .build();</pre>
-
-</p>
-
-
-
-
-
-</div><!-- jd-descr -->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<div class="jd-descr">
-
-
-<h2>Summary</h2>
-
-
-
-<!-- ======== NESTED CLASS SUMMARY ======== -->
-<table id="nestedclasses" class="jd-sumtable"><tr><th colspan="12">Nested Classes</th></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
- class</nobr></td>
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html">RemoteInput.Builder</a></td>
- <td class="jd-descrcol" width="100%">Builder class for <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code> objects. </td>
- </tr>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<!-- =========== ENUM CONSTANT SUMMARY =========== -->
-<table id="inhconstants" class="jd-sumtable"><tr><th>
- <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
- <div style="clear:left;">Inherited Constants</div></th></tr>
-
-
-
-
-<tr class="api apilevel-" >
-<td colspan="12">
-
- <a href="#" onclick="return toggleInherited(this, null)" id="inherited-constants-android.os.Parcelable" class="jd-expando-trigger closed"
- ><img id="inherited-constants-android.os.Parcelable-trigger"
- src="/assets/images/triangle-closed.png"
- class="jd-expando-trigger-img" /></a>From interface
-android.os.Parcelable
-<div id="inherited-constants-android.os.Parcelable">
- <div id="inherited-constants-android.os.Parcelable-list"
- class="jd-inheritedlinks">
- </div>
- <div id="inherited-constants-android.os.Parcelable-summary" style="display: none;">
- <table class="jd-sumtable-expando">
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol">int</td>
- <td class="jd-linkcol">CONTENTS_FILE_DESCRIPTOR</td>
- <td class="jd-descrcol" width="100%"></td>
- </tr>
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol">int</td>
- <td class="jd-linkcol">PARCELABLE_WRITE_RETURN_VALUE</td>
- <td class="jd-descrcol" width="100%"></td>
- </tr>
-
-
-</table>
- </div>
-</div>
-</td></tr>
-
-
-</table>
-
-
-
-
-<!-- =========== FIELD SUMMARY =========== -->
-<table id="lfields" class="jd-sumtable"><tr><th colspan="12">Fields</th></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
- public
- static
- final
- <a href="http://developer.android.com/reference/android/os/Parcelable.Creator.html">Creator</a><<a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a>></nobr></td>
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html#CREATOR">CREATOR</a></td>
- <td class="jd-descrcol" width="100%"></td>
- </tr>
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
- public
-
- final
- boolean</nobr></td>
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html#allowFreeFormInput">allowFreeFormInput</a></td>
- <td class="jd-descrcol" width="100%">Indicates whether or not users can provide an arbitrary value for
- input.</td>
- </tr>
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
- public
-
- final
- <a href="http://developer.android.com/reference/java/lang/String.html">String[]</a></nobr></td>
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html#choices">choices</a></td>
- <td class="jd-descrcol" width="100%">Possible input choices.</td>
- </tr>
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
- public
-
- final
- <a href="http://developer.android.com/reference/java/lang/String.html">String</a></nobr></td>
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html#label">label</a></td>
- <td class="jd-descrcol" width="100%">The label to display to users when collecting this input.</td>
- </tr>
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
- public
-
- final
- <a href="http://developer.android.com/reference/java/lang/String.html">String</a></nobr></td>
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html#returnKey">returnKey</a></td>
- <td class="jd-descrcol" width="100%">The lookup key for the intent extra that the response is set in.</td>
- </tr>
-
-
-
-</table>
-
-
-
-
-
-
-
-
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-<table id="pubmethods" class="jd-sumtable"><tr><th colspan="12">Public Methods</th></tr>
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- int</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html#describeContents()">describeContents</a></span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html#writeToParcel(android.os.Parcel, int)">writeToParcel</a></span>(<a href="http://developer.android.com/reference/android/os/Parcel.html">Parcel</a> out, int flags)</nobr>
-
- </td></tr>
-
-
-
-</table>
-
-
-
-
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-<table id="inhmethods" class="jd-sumtable"><tr><th>
- <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
- <div style="clear:left;">Inherited Methods</div></th></tr>
-
-
-<tr class="api apilevel-" >
-<td colspan="12">
- <a href="#" onclick="return toggleInherited(this, null)" id="inherited-methods-java.lang.Object" class="jd-expando-trigger closed"
- ><img id="inherited-methods-java.lang.Object-trigger"
- src="/assets/images/triangle-closed.png"
- class="jd-expando-trigger-img" /></a>
-From class
-
- <a href="http://developer.android.com/reference/java/lang/Object.html">java.lang.Object</a>
-
-<div id="inherited-methods-java.lang.Object">
- <div id="inherited-methods-java.lang.Object-list"
- class="jd-inheritedlinks">
- </div>
- <div id="inherited-methods-java.lang.Object-summary" style="display: none;">
- <table class="jd-sumtable-expando">
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/java/lang/Object.html">Object</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">clone</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- boolean</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">equals</span>(<a href="http://developer.android.com/reference/java/lang/Object.html">Object</a> arg0)</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">finalize</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- <a href="http://developer.android.com/reference/java/lang/Class.html">Class</a><?></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">getClass</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- int</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">hashCode</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">notify</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">notifyAll</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/java/lang/String.html">String</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">toString</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>(long arg0, int arg1)</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>(long arg0)</nobr>
-
- </td></tr>
-
-
-</table>
- </div>
-</div>
-</td></tr>
-
-
-
-<tr class="api apilevel-" >
-<td colspan="12">
- <a href="#" onclick="return toggleInherited(this, null)" id="inherited-methods-android.os.Parcelable" class="jd-expando-trigger closed"
- ><img id="inherited-methods-android.os.Parcelable-trigger"
- src="/assets/images/triangle-closed.png"
- class="jd-expando-trigger-img" /></a>
-From interface
-
- <a href="http://developer.android.com/reference/android/os/Parcelable.html">android.os.Parcelable</a>
-
-<div id="inherited-methods-android.os.Parcelable">
- <div id="inherited-methods-android.os.Parcelable-list"
- class="jd-inheritedlinks">
- </div>
- <div id="inherited-methods-android.os.Parcelable-summary" style="display: none;">
- <table class="jd-sumtable-expando">
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
- abstract
-
-
-
-
- int</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">describeContents</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
- abstract
-
-
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">writeToParcel</span>(<a href="http://developer.android.com/reference/android/os/Parcel.html">Parcel</a> arg0, int arg1)</nobr>
-
- </td></tr>
-
-
-</table>
- </div>
-</div>
-</td></tr>
-
-
-</table>
-
-
-</div><!-- jd-descr (summary) -->
-
-<!-- Details -->
-
-
-
-
-
-
-
-
-<!-- XML Attributes -->
-
-
-<!-- Enum Values -->
-
-
-<!-- Constants -->
-
-
-<!-- Fields -->
-
-
-<!-- ========= FIELD DETAIL ======== -->
-<h2>Fields</h2>
-
-
-
-
-<A NAME="CREATOR"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
- final
- <a href="http://developer.android.com/reference/android/os/Parcelable.Creator.html">Creator</a><<a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a>>
- </span>
- CREATOR
- </h4>
- <div class="api-level">
-
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p></p></div>
-
-
- </div>
-</div>
-
-
-
-<A NAME="allowFreeFormInput"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
- final
- boolean
- </span>
- allowFreeFormInput
- </h4>
- <div class="api-level">
-
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Indicates whether or not users can provide an arbitrary value for
- input. If you set this to <code>false</code>, users must select one of the
- provided <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html#choices">choices</a></code>. An <code><a href="http://developer.android.com/reference/java/lang/IllegalArgumentException.html">IllegalArgumentException</a></code> is thrown
- if you set this to false and <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html#choices">choices</a></code> is <code>null</code> or empty.
-</p></div>
-
-
- </div>
-</div>
-
-
-
-<A NAME="choices"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
- final
- <a href="http://developer.android.com/reference/java/lang/String.html">String[]</a>
- </span>
- choices
- </h4>
- <div class="api-level">
-
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Possible input choices. This can be <code>null</code>
- if there are no choices to present.
-</p></div>
-
-
- </div>
-</div>
-
-
-
-<A NAME="label"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
- final
- <a href="http://developer.android.com/reference/java/lang/String.html">String</a>
- </span>
- label
- </h4>
- <div class="api-level">
-
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>The label to display to users when collecting this input.
-</p></div>
-
-
- </div>
-</div>
-
-
-
-<A NAME="returnKey"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
- final
- <a href="http://developer.android.com/reference/java/lang/String.html">String</a>
- </span>
- returnKey
- </h4>
- <div class="api-level">
-
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>The lookup key for the intent extra that the response is set in. This is populated
- when the <code><a href="http://developer.android.com/reference/android/app/PendingIntent.html">PendingIntent</a></code> is sent.
-</p></div>
-
-
- </div>
-</div>
-
-
-
-
-<!-- Public ctors -->
-
-
-
-<!-- ========= CONSTRUCTOR DETAIL ======== -->
-<!-- Protected ctors -->
-
-
-
-<!-- ========= METHOD DETAIL ======== -->
-<!-- Public methdos -->
-
-<h2>Public Methods</h2>
-
-
-
-<A NAME="describeContents()"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- int
- </span>
- <span class="sympad">describeContents</span>
- <span class="normal">()</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p></p></div>
-
- </div>
-</div>
-
-
-<A NAME="writeToParcel(android.os.Parcel, int)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- void
- </span>
- <span class="sympad">writeToParcel</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/os/Parcel.html">Parcel</a> out, int flags)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p></p></div>
-
- </div>
-</div>
-
-
-
-
-
-<!-- ========= METHOD DETAIL ======== -->
-
-
-
-<!-- ========= END OF CLASS DATA ========= -->
-<A NAME="navbar_top"></A>
-
-<div id="footer" class="wrap" >
-
-
- <div id="copyright">
-
- Except as noted, this content is licensed under <a
- href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>.
- For details and restrictions, see the <a href="/license.html">
- Content License</a>.
- </div>
- <div id="build_info">
-
- Android r —
-<script src="/timestamp.js" type="text/javascript"></script>
-<script>document.write(BUILD_TIMESTAMP)</script>
-
- </div>
-
-
- <div id="footerlinks">
-
- <p>
- <a href="/about/index.html">About Android</a> |
- <a href="/legal.html">Legal</a> |
- <a href="/support.html">Support</a>
- </p>
- </div>
-
-</div> <!-- end footer -->
-</div> <!-- jd-content -->
-
-</div><!-- end doc-content -->
-
-</div> <!-- end body-content -->
-
-
-
-
-
-
-</body>
-</html>
diff --git a/docs/html/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html b/docs/html/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html
deleted file mode 100644
index 9592e27..0000000
--- a/docs/html/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html
+++ /dev/null
@@ -1,1087 +0,0 @@
-<!DOCTYPE html>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<html>
-<head>
-
-
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="viewport" content="width=device-width" />
-
-<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
-<title>WearableNotifications.Action.Builder | Android Developers</title>
-
-<!-- STYLESHEETS -->
-<link rel="stylesheet"
-href="//fonts.googleapis.com/css?family=Roboto+Condensed">
-<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold"
- title="roboto">
-<link href="/assets/css/default.css" rel="stylesheet" type="text/css">
-
-
-
-<!-- JAVASCRIPT -->
-<script src="//www.google.com/jsapi" type="text/javascript"></script>
-<script src="/assets/js/android_3p-bundle.js" type="text/javascript"></script>
-<script type="text/javascript">
- var toRoot = "/";
- var metaTags = [];
- var devsite = false;
-</script>
-<script src="/assets/js/docs.js" type="text/javascript"></script>
-
-<script type="text/javascript">
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', 'UA-5831155-1']);
- _gaq.push(['_trackPageview']);
-
- (function() {
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
- })();
-</script>
-</head>
-
-<body class="gc-documentation
- preview" itemscope itemtype="http://schema.org/Article">
- <div id="doc-api-level" class="" style="display:none"></div>
- <a name="top"></a>
-
-
-
-<a name="top"></a>
-
-<!-- Header -->
-<div id="header-wrapper">
- <div id="header">
- <div class="wrap" id="header-wrap">
- <div class="col_3 logo wear-logo">
- <a href="/wear/index.html">
- <img src="/wear/images/android-wear.png" height="16" alt="Android Wear" />
- </a>
- </div>
- <div class="col-8" style="margin:0"><h1 style="margin:1px 0 0 20px;padding:0;line-height:16px;
-color:#666;font-weight:100;font-size:24px;">Developer Preview</h1></div>
-
-
-
-<div class="menu-container">
- <div class="moremenu">
- <div id="more-btn"></div>
- </div>
- <div class="morehover" id="moremenu">
- <div class="top"></div>
- <div class="mid">
- <div class="header">Links</div>
- <ul>
- <li><a href="https://play.google.com/apps/publish/" target="_googleplay">Google Play Developer Console</a></li>
- <li><a href="http://android-developers.blogspot.com/">Android Developers Blog</a></li>
- <li><a href="/about/index.html">About Android</a></li>
- </ul>
- <div class="header">Android Sites</div>
- <ul>
- <li><a href="http://www.android.com">Android.com</a></li>
- <li class="active"><a>Android Developers</a></li>
- <li><a href="http://source.android.com">Android Open Source Project</a></li>
- </ul>
-
-
-
- <div class="header">Language</div>
- <div id="language" class="locales">
- <select name="language" onChange="changeLangPref(this.value, true)">
- <option value="en">English</option>
- <option value="es">Español</option>
- <option value="ja">日本語</option>
- <option value="ko">한국어</option>
- <option value="ru">Русский</option>
- <option value="zh-cn">中文 (中国)</option>
- <option value="zh-tw">中文 (台灣)</option>
- </select>
- </div>
- <script type="text/javascript">
- <!--
- loadLangPref();
- //-->
- </script>
-
-
- <br class="clearfix" />
- </div><!-- end 'mid' -->
- <div class="bottom"></div>
- </div><!-- end 'moremenu' -->
-
- <div class="search" id="search-container">
- <div class="search-inner">
- <div id="search-btn"></div>
- <div class="left"></div>
- <form onsubmit="return submit_search()">
- <input id="search_autocomplete" type="text" value="" autocomplete="off" name="q"
- onfocus="search_focus_changed(this, true)" onblur="search_focus_changed(this, false)"
- onkeydown="return search_changed(event, true, '/')"
- onkeyup="return search_changed(event, false, '/')" />
- </form>
- <div class="right"></div>
- <a class="close hide">close</a>
- <div class="left"></div>
- <div class="right"></div>
- </div><!-- end search-inner -->
- </div><!-- end search-container -->
-
- <div class="search_filtered_wrapper reference">
- <div class="suggest-card reference no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- </div>
-
- <div class="search_filtered_wrapper docs">
- <div class="suggest-card dummy no-display"> </div>
- <div class="suggest-card develop no-display">
- <ul class="search_filtered">
- </ul>
- <div class="child-card guides no-display">
- </div>
- <div class="child-card training no-display">
- </div>
- <div class="child-card samples no-display">
- </div>
- </div>
- <div class="suggest-card design no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- <div class="suggest-card distribute no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- </div>
-</div><!-- end menu-container (search and menu widget) -->
-
-
- </div><!-- end header-wrap -->
- </div><!-- /Header -->
-
-
- <div id="searchResults" class="wrap" style="display:none;">
- <h2 id="searchTitle">Results</h2>
- <div id="leftSearchControl" class="search-control">Loading...</div>
- </div>
-</div> <!--end header-wrapper -->
-
-<div id="sticky-header">
- <div>
- <a class="logo" href="#top"></a>
- <a class="top" href="#top"></a>
- <ul class="breadcrumb">
-
- <li class="current">WearableNotifications.Action.Builder</li>
- </ul>
- </div>
-</div>
-
-
-
-
- <div class="wrap clearfix" id="body-content">
- <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
- <div id="devdoc-nav" class="scroll-pane">
-
-<ul id="nav">
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/preview/start.html">Get Started
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/design/user-interface.html">UI Overview
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/design/index.html">Design Principles
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/creating.html">Creating Notifications for Android Wear
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/remote-input.html">Receiving Voice Input from a Notification
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/pages.html">Adding Pages to a Notification
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/stacks.html">Stacking Notifications
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header"><a href="/reference/android/preview/support/package-summary.html">Notification Reference</a></div>
- <ul class="tree-list-children">
-<li class="nav-section">
-<div class="nav-section-header-ref"><span class="tree-list-subtitle package" title="android.preview.support.v4.app">android.preview.support.v4.app</span></div>
- <ul>
-<li><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html">NotificationManagerCompat</a></li>
- </ul>
-</li>
-
-<li class="nav-section">
-<div class="nav-section-header-ref"><span class="tree-list-subtitle package" title="android.preview.support.wearable.notifications">android.preview.support.wearable.notifications</span></div>
-<ul>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></li>
-<li><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html" >RemoteInput.Builder</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html">WearableNotifications</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html">WearableNotifications.Action.Builder</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></li>
- </ul>
- </li>
-</ul>
-</li>
-
-
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/license.html">License Agreement</a></div>
- </li>
-
-
-</ul>
-
-
-
- </div>
- </div> <!-- end side-nav -->
- <script>
- $(document).ready(function() {
- scrollIntoView("devdoc-nav");
- });
- </script>
-
-
-
-
-
-<div class="col-12" id="doc-col">
-
-<div id="api-info-block">
-
-
-
-
-
-
-
-
-
-
-
-<div class="sum-details-links">
-
-Summary:
-
-
-
-
-
-
-
-
-
- <a href="#pubctors">Ctors</a>
-
-
-
-
- | <a href="#pubmethods">Methods</a>
-
-
-
-
- | <a href="#inhmethods">Inherited Methods</a>
-
-| <a href="#" onclick="return toggleAllClassInherited()" id="toggleAllClassInherited">[Expand All]</a>
-
-</div><!-- end sum-details-links -->
-<div class="api-level">
-
-
-
-
-</div>
-</div><!-- end api-info-block -->
-
-
-<!-- ======== START OF CLASS DATA ======== -->
-
-<div id="jd-header">
- public
- static
-
-
- class
-<h1 itemprop="name">WearableNotifications.Action.Builder</h1>
-
-
-
-
- extends <a href="http://developer.android.com/reference/java/lang/Object.html">Object</a><br/>
-
-
-
-
-
-
-
-
-
-</div><!-- end header -->
-
-<div id="naMessage"></div>
-
-<div id="jd-content" class="api apilevel-">
-<table class="jd-inheritance-table">
-
-
- <tr>
-
- <td colspan="2" class="jd-inheritance-class-cell"><a href="http://developer.android.com/reference/java/lang/Object.html">java.lang.Object</a></td>
- </tr>
-
-
- <tr>
-
- <td class="jd-inheritance-space"> ↳</td>
-
- <td colspan="1" class="jd-inheritance-class-cell">android.preview.support.wearable.notifications.WearableNotifications.Action.Builder</td>
- </tr>
-
-
-</table>
-
-
-
-
-
-
-
-<div class="jd-descr">
-
-
-<h2>Class Overview</h2>
-<p itemprop="articleBody">Builder class for <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></code> objects.
-</p>
-
-
-
-
-
-</div><!-- jd-descr -->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<div class="jd-descr">
-
-
-<h2>Summary</h2>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<!-- ======== CONSTRUCTOR SUMMARY ======== -->
-<table id="pubctors" class="jd-sumtable"><tr><th colspan="12">Public Constructors</th></tr>
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- </nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html#WearableNotifications.Action.Builder(int, java.lang.CharSequence, android.app.PendingIntent)">WearableNotifications.Action.Builder</a></span>(int icon, <a href="http://developer.android.com/reference/java/lang/CharSequence.html">CharSequence</a> title, <a href="http://developer.android.com/reference/android/app/PendingIntent.html">PendingIntent</a> intent)</nobr>
-
- <div class="jd-descrdiv">Construct a new builder for <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></code> object.</div>
-
- </td></tr>
-
-
-
-</table>
-
-
-
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-<table id="pubmethods" class="jd-sumtable"><tr><th colspan="12">Public Methods</th></tr>
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html">WearableNotifications.Action.Builder</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html#addRemoteInput(android.preview.support.wearable.notifications.RemoteInput)">addRemoteInput</a></span>(<a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a> remoteInput)</nobr>
-
- <div class="jd-descrdiv">Add an input to be collected from the user when this action is sent.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html#build()">build</a></span>()</nobr>
-
- <div class="jd-descrdiv">Combine all of the options that have been set and return a new <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></code>
- object.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/android/os/Bundle.html">Bundle</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html#getExtras()">getExtras</a></span>()</nobr>
-
- <div class="jd-descrdiv">Get the current metadata Bundle used by this Builder, creating a new one
- as necessary.</div>
-
- </td></tr>
-
-
-
-</table>
-
-
-
-
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-<table id="inhmethods" class="jd-sumtable"><tr><th>
- <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
- <div style="clear:left;">Inherited Methods</div></th></tr>
-
-
-<tr class="api apilevel-" >
-<td colspan="12">
- <a href="#" onclick="return toggleInherited(this, null)" id="inherited-methods-java.lang.Object" class="jd-expando-trigger closed"
- ><img id="inherited-methods-java.lang.Object-trigger"
- src="/assets/images/triangle-closed.png"
- class="jd-expando-trigger-img" /></a>
-From class
-
- <a href="http://developer.android.com/reference/java/lang/Object.html">java.lang.Object</a>
-
-<div id="inherited-methods-java.lang.Object">
- <div id="inherited-methods-java.lang.Object-list"
- class="jd-inheritedlinks">
- </div>
- <div id="inherited-methods-java.lang.Object-summary" style="display: none;">
- <table class="jd-sumtable-expando">
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/java/lang/Object.html">Object</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">clone</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- boolean</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">equals</span>(<a href="http://developer.android.com/reference/java/lang/Object.html">Object</a> arg0)</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">finalize</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- <a href="http://developer.android.com/reference/java/lang/Class.html">Class</a><?></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">getClass</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- int</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">hashCode</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">notify</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">notifyAll</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/java/lang/String.html">String</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">toString</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>(long arg0, int arg1)</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>(long arg0)</nobr>
-
- </td></tr>
-
-
-</table>
- </div>
-</div>
-</td></tr>
-
-
-</table>
-
-
-</div><!-- jd-descr (summary) -->
-
-<!-- Details -->
-
-
-
-
-
-
-
-
-<!-- XML Attributes -->
-
-
-<!-- Enum Values -->
-
-
-<!-- Constants -->
-
-
-<!-- Fields -->
-
-
-<!-- Public ctors -->
-
-
-<!-- ========= CONSTRUCTOR DETAIL ======== -->
-<h2>Public Constructors</h2>
-
-
-
-<A NAME="WearableNotifications.Action.Builder(int, java.lang.CharSequence, android.app.PendingIntent)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
-
- </span>
- <span class="sympad">WearableNotifications.Action.Builder</span>
- <span class="normal">(int icon, <a href="http://developer.android.com/reference/java/lang/CharSequence.html">CharSequence</a> title, <a href="http://developer.android.com/reference/android/app/PendingIntent.html">PendingIntent</a> intent)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Construct a new builder for <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></code> object.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>icon</td>
- <td>icon to show for this action</td>
- </tr>
- <tr>
- <th>title</td>
- <td>the title of the action</td>
- </tr>
- <tr>
- <th>intent</td>
- <td>the <code><a href="http://developer.android.com/reference/android/app/PendingIntent.html">PendingIntent</a></code> to fire when users trigger this action
-</td>
- </tr>
- </table>
- </div>
-
- </div>
-</div>
-
-
-
-
-
-<!-- ========= CONSTRUCTOR DETAIL ======== -->
-<!-- Protected ctors -->
-
-
-
-<!-- ========= METHOD DETAIL ======== -->
-<!-- Public methdos -->
-
-<h2>Public Methods</h2>
-
-
-
-<A NAME="addRemoteInput(android.preview.support.wearable.notifications.RemoteInput)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html">WearableNotifications.Action.Builder</a>
- </span>
- <span class="sympad">addRemoteInput</span>
- <span class="normal">(<a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a> remoteInput)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Add an input to be collected from the user when this action is sent.
- Response values are sent as extras to this action's pending intent when
- sent.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>remoteInput</td>
- <td>a <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code> to add to the action</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>this object for method chaining
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="build()"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a>
- </span>
- <span class="sympad">build</span>
- <span class="normal">()</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Combine all of the options that have been set and return a new <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></code>
- object.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>the built action
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="getExtras()"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="http://developer.android.com/reference/android/os/Bundle.html">Bundle</a>
- </span>
- <span class="sympad">getExtras</span>
- <span class="normal">()</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Get the current metadata Bundle used by this Builder, creating a new one
- as necessary.
-
- <p>The returned Bundle is shared with this Builder.
-</p></div>
-
- </div>
-</div>
-
-
-
-
-
-<!-- ========= METHOD DETAIL ======== -->
-
-
-
-<!-- ========= END OF CLASS DATA ========= -->
-<A NAME="navbar_top"></A>
-
-<div id="footer" class="wrap" >
-
-
- <div id="copyright">
-
- Except as noted, this content is licensed under <a
- href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>.
- For details and restrictions, see the <a href="/license.html">
- Content License</a>.
- </div>
- <div id="build_info">
-
- Android r —
-<script src="/timestamp.js" type="text/javascript"></script>
-<script>document.write(BUILD_TIMESTAMP)</script>
-
- </div>
-
-
- <div id="footerlinks">
-
- <p>
- <a href="/about/index.html">About Android</a> |
- <a href="/legal.html">Legal</a> |
- <a href="/support.html">Support</a>
- </p>
- </div>
-
-</div> <!-- end footer -->
-</div> <!-- jd-content -->
-
-</div><!-- end doc-content -->
-
-</div> <!-- end body-content -->
-
-
-
-
-
-
-</body>
-</html>
diff --git a/docs/html/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html b/docs/html/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html
deleted file mode 100644
index 8073fa8..0000000
--- a/docs/html/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html
+++ /dev/null
@@ -1,1071 +0,0 @@
-<!DOCTYPE html>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<html>
-<head>
-
-
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="viewport" content="width=device-width" />
-
-<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
-<title>WearableNotifications.Action | Android Developers</title>
-
-<!-- STYLESHEETS -->
-<link rel="stylesheet"
-href="//fonts.googleapis.com/css?family=Roboto+Condensed">
-<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold"
- title="roboto">
-<link href="/assets/css/default.css" rel="stylesheet" type="text/css">
-
-
-
-<!-- JAVASCRIPT -->
-<script src="//www.google.com/jsapi" type="text/javascript"></script>
-<script src="/assets/js/android_3p-bundle.js" type="text/javascript"></script>
-<script type="text/javascript">
- var toRoot = "/";
- var metaTags = [];
- var devsite = false;
-</script>
-<script src="/assets/js/docs.js" type="text/javascript"></script>
-
-<script type="text/javascript">
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', 'UA-5831155-1']);
- _gaq.push(['_trackPageview']);
-
- (function() {
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
- })();
-</script>
-</head>
-
-<body class="gc-documentation
- preview" itemscope itemtype="http://schema.org/Article">
- <div id="doc-api-level" class="" style="display:none"></div>
- <a name="top"></a>
-
-
-
-<a name="top"></a>
-
-<!-- Header -->
-<div id="header-wrapper">
- <div id="header">
- <div class="wrap" id="header-wrap">
- <div class="col_3 logo wear-logo">
- <a href="/wear/index.html">
- <img src="/wear/images/android-wear.png" height="16" alt="Android Wear" />
- </a>
- </div>
- <div class="col-8" style="margin:0"><h1 style="margin:1px 0 0 20px;padding:0;line-height:16px;
-color:#666;font-weight:100;font-size:24px;">Developer Preview</h1></div>
-
-
-
-<div class="menu-container">
- <div class="moremenu">
- <div id="more-btn"></div>
- </div>
- <div class="morehover" id="moremenu">
- <div class="top"></div>
- <div class="mid">
- <div class="header">Links</div>
- <ul>
- <li><a href="https://play.google.com/apps/publish/" target="_googleplay">Google Play Developer Console</a></li>
- <li><a href="http://android-developers.blogspot.com/">Android Developers Blog</a></li>
- <li><a href="/about/index.html">About Android</a></li>
- </ul>
- <div class="header">Android Sites</div>
- <ul>
- <li><a href="http://www.android.com">Android.com</a></li>
- <li class="active"><a>Android Developers</a></li>
- <li><a href="http://source.android.com">Android Open Source Project</a></li>
- </ul>
-
-
-
- <div class="header">Language</div>
- <div id="language" class="locales">
- <select name="language" onChange="changeLangPref(this.value, true)">
- <option value="en">English</option>
- <option value="es">Español</option>
- <option value="ja">日本語</option>
- <option value="ko">한국어</option>
- <option value="ru">Русский</option>
- <option value="zh-cn">中文 (中国)</option>
- <option value="zh-tw">中文 (台灣)</option>
- </select>
- </div>
- <script type="text/javascript">
- <!--
- loadLangPref();
- //-->
- </script>
-
-
- <br class="clearfix" />
- </div><!-- end 'mid' -->
- <div class="bottom"></div>
- </div><!-- end 'moremenu' -->
-
- <div class="search" id="search-container">
- <div class="search-inner">
- <div id="search-btn"></div>
- <div class="left"></div>
- <form onsubmit="return submit_search()">
- <input id="search_autocomplete" type="text" value="" autocomplete="off" name="q"
- onfocus="search_focus_changed(this, true)" onblur="search_focus_changed(this, false)"
- onkeydown="return search_changed(event, true, '/')"
- onkeyup="return search_changed(event, false, '/')" />
- </form>
- <div class="right"></div>
- <a class="close hide">close</a>
- <div class="left"></div>
- <div class="right"></div>
- </div><!-- end search-inner -->
- </div><!-- end search-container -->
-
- <div class="search_filtered_wrapper reference">
- <div class="suggest-card reference no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- </div>
-
- <div class="search_filtered_wrapper docs">
- <div class="suggest-card dummy no-display"> </div>
- <div class="suggest-card develop no-display">
- <ul class="search_filtered">
- </ul>
- <div class="child-card guides no-display">
- </div>
- <div class="child-card training no-display">
- </div>
- <div class="child-card samples no-display">
- </div>
- </div>
- <div class="suggest-card design no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- <div class="suggest-card distribute no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- </div>
-</div><!-- end menu-container (search and menu widget) -->
-
-
- </div><!-- end header-wrap -->
- </div><!-- /Header -->
-
-
- <div id="searchResults" class="wrap" style="display:none;">
- <h2 id="searchTitle">Results</h2>
- <div id="leftSearchControl" class="search-control">Loading...</div>
- </div>
-</div> <!--end header-wrapper -->
-
-<div id="sticky-header">
- <div>
- <a class="logo" href="#top"></a>
- <a class="top" href="#top"></a>
- <ul class="breadcrumb">
-
- <li class="current">WearableNotifications.Action</li>
- </ul>
- </div>
-</div>
-
-
-
-
- <div class="wrap clearfix" id="body-content">
- <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
- <div id="devdoc-nav" class="scroll-pane">
-
-<ul id="nav">
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/preview/start.html">Get Started
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/design/user-interface.html">UI Overview
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/design/index.html">Design Principles
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/creating.html">Creating Notifications for Android Wear
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/remote-input.html">Receiving Voice Input from a Notification
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/pages.html">Adding Pages to a Notification
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/stacks.html">Stacking Notifications
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header"><a href="/reference/android/preview/support/package-summary.html">Notification Reference</a></div>
- <ul class="tree-list-children">
-<li class="nav-section">
-<div class="nav-section-header-ref"><span class="tree-list-subtitle package" title="android.preview.support.v4.app">android.preview.support.v4.app</span></div>
- <ul>
-<li><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html">NotificationManagerCompat</a></li>
- </ul>
-</li>
-
-<li class="nav-section">
-<div class="nav-section-header-ref"><span class="tree-list-subtitle package" title="android.preview.support.wearable.notifications">android.preview.support.wearable.notifications</span></div>
-<ul>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></li>
-<li><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html" >RemoteInput.Builder</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html">WearableNotifications</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html">WearableNotifications.Action.Builder</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></li>
- </ul>
- </li>
-</ul>
-</li>
-
-
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/license.html">License Agreement</a></div>
- </li>
-
-
-</ul>
-
-
-
- </div>
- </div> <!-- end side-nav -->
- <script>
- $(document).ready(function() {
- scrollIntoView("devdoc-nav");
- });
- </script>
-
-
-
-
-
-<div class="col-12" id="doc-col">
-
-<div id="api-info-block">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<div class="sum-details-links">
-
-Summary:
-
- <a href="#nestedclasses">Nested Classes</a>
-
-
-
-
-
-
-
-
- | <a href="#lfields">Fields</a>
-
-
-
- | <a href="#inhfields">Inherited Fields</a>
-
-
-
-
-
- | <a href="#pubmethods">Methods</a>
-
-
-
-
- | <a href="#inhmethods">Inherited Methods</a>
-
-| <a href="#" onclick="return toggleAllClassInherited()" id="toggleAllClassInherited">[Expand All]</a>
-
-</div><!-- end sum-details-links -->
-<div class="api-level">
-
-
-
-
-</div>
-</div><!-- end api-info-block -->
-
-
-<!-- ======== START OF CLASS DATA ======== -->
-
-<div id="jd-header">
- public
- static
-
-
- class
-<h1 itemprop="name">WearableNotifications.Action</h1>
-
-
-
-
-
-
-
-
- extends NotificationCompat.Action<br/>
-
-
-
-
-
-
-
-
-
-</div><!-- end header -->
-
-<div id="naMessage"></div>
-
-<div id="jd-content" class="api apilevel-">
-<table class="jd-inheritance-table">
-
-
- <tr>
-
- <td colspan="3" class="jd-inheritance-class-cell"><a href="http://developer.android.com/reference/java/lang/Object.html">java.lang.Object</a></td>
- </tr>
-
-
- <tr>
-
- <td class="jd-inheritance-space"> ↳</td>
-
- <td colspan="2" class="jd-inheritance-class-cell">android.support.v4.app.NotificationCompat.Action</td>
- </tr>
-
-
- <tr>
-
- <td class="jd-inheritance-space"> </td>
-
- <td class="jd-inheritance-space"> ↳</td>
-
- <td colspan="1" class="jd-inheritance-class-cell">android.preview.support.wearable.notifications.WearableNotifications.Action</td>
- </tr>
-
-
-</table>
-
-
-
-
-
-
-
-<div class="jd-descr">
-
-
-<h2>Class Overview</h2>
-<p itemprop="articleBody">Subclass of <code><a href="/reference/android/support/v4/app/NotificationCompat.Action.html">NotificationCompat.Action</a></code> that adds additional
- wearable extensions for actions.
- <p>Always use the <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html">WearableNotifications.Action.Builder</a></code> to build instances of this class and call
- <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#addAction(android.preview.support.wearable.notifications.WearableNotifications.Action)">addAction(WearableNotifications.Action)</a></code> to add the action to a notification.
-
- <pre class="prettyprint">
- WearableNotifications.Builder builder = new WearableNotifications.Builder(mContext)
- .addAction(new WearableNotifications.Action.Builder(
- R.drawable.navigate, "Navigate", pendingIntent)
- .build())
- .setLocalOnly(true);
- Notification notif = builder.build();</pre>
-</p>
-
-
-
-
-
-</div><!-- jd-descr -->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<div class="jd-descr">
-
-
-<h2>Summary</h2>
-
-
-
-<!-- ======== NESTED CLASS SUMMARY ======== -->
-<table id="nestedclasses" class="jd-sumtable"><tr><th colspan="12">Nested Classes</th></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
- class</nobr></td>
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html">WearableNotifications.Action.Builder</a></td>
- <td class="jd-descrcol" width="100%">Builder class for <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></code> objects. </td>
- </tr>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<!-- =========== FIELD SUMMARY =========== -->
-<table id="lfields" class="jd-sumtable"><tr><th colspan="12">Fields</th></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
- public
-
- final
- <a href="http://developer.android.com/reference/android/os/Bundle.html">Bundle</a></nobr></td>
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html#extras">extras</a></td>
- <td class="jd-descrcol" width="100%"></td>
- </tr>
-
-
-
-</table>
-
-
-
-
-
-<!-- =========== FIELD SUMMARY =========== -->
-<table id="inhfields" class="jd-sumtable"><tr><th>
- <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
- <div style="clear:left;">Inherited Fields</div></th></tr>
-
-
-<tr class="api apilevel-" >
-<td colspan="12">
-
- <a href="#" onclick="return toggleInherited(this, null)" id="inherited-fields-android.support.v4.app.NotificationCompat.Action" class="jd-expando-trigger closed"
- ><img id="inherited-fields-android.support.v4.app.NotificationCompat.Action-trigger"
- src="/assets/images/triangle-closed.png"
- class="jd-expando-trigger-img" /></a>From class
-android.support.v4.app.NotificationCompat.Action
-<div id="inherited-fields-android.support.v4.app.NotificationCompat.Action">
- <div id="inherited-fields-android.support.v4.app.NotificationCompat.Action-list"
- class="jd-inheritedlinks">
- </div>
- <div id="inherited-fields-android.support.v4.app.NotificationCompat.Action-summary" style="display: none;">
- <table class="jd-sumtable-expando">
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
- public
-
-
- <a href="http://developer.android.com/reference/android/app/PendingIntent.html">PendingIntent</a></nobr></td>
- <td class="jd-linkcol">actionIntent</td>
- <td class="jd-descrcol" width="100%"></td>
- </tr>
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
- public
-
-
- int</nobr></td>
- <td class="jd-linkcol">icon</td>
- <td class="jd-descrcol" width="100%"></td>
- </tr>
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
- public
-
-
- <a href="http://developer.android.com/reference/java/lang/CharSequence.html">CharSequence</a></nobr></td>
- <td class="jd-linkcol">title</td>
- <td class="jd-descrcol" width="100%"></td>
- </tr>
-
-
-</table>
- </div>
-</div>
-</td></tr>
-
-
-
-
-</table>
-
-
-
-
-
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-<table id="pubmethods" class="jd-sumtable"><tr><th colspan="12">Public Methods</th></tr>
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput[]</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html#getRemoteInputs()">getRemoteInputs</a></span>()</nobr>
-
- <div class="jd-descrdiv">Get a list of inputs to be collected from the user when this action is sent.</div>
-
- </td></tr>
-
-
-
-</table>
-
-
-
-
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-<table id="inhmethods" class="jd-sumtable"><tr><th>
- <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
- <div style="clear:left;">Inherited Methods</div></th></tr>
-
-
-
-
-<tr class="api apilevel-" >
-<td colspan="12">
- <a href="#" onclick="return toggleInherited(this, null)" id="inherited-methods-java.lang.Object" class="jd-expando-trigger closed"
- ><img id="inherited-methods-java.lang.Object-trigger"
- src="/assets/images/triangle-closed.png"
- class="jd-expando-trigger-img" /></a>
-From class
-
- <a href="http://developer.android.com/reference/java/lang/Object.html">java.lang.Object</a>
-
-<div id="inherited-methods-java.lang.Object">
- <div id="inherited-methods-java.lang.Object-list"
- class="jd-inheritedlinks">
- </div>
- <div id="inherited-methods-java.lang.Object-summary" style="display: none;">
- <table class="jd-sumtable-expando">
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/java/lang/Object.html">Object</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">clone</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- boolean</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">equals</span>(<a href="http://developer.android.com/reference/java/lang/Object.html">Object</a> arg0)</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">finalize</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- <a href="http://developer.android.com/reference/java/lang/Class.html">Class</a><?></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">getClass</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- int</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">hashCode</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">notify</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">notifyAll</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/java/lang/String.html">String</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">toString</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>(long arg0, int arg1)</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>(long arg0)</nobr>
-
- </td></tr>
-
-
-</table>
- </div>
-</div>
-</td></tr>
-
-
-</table>
-
-
-</div><!-- jd-descr (summary) -->
-
-<!-- Details -->
-
-
-
-
-
-
-
-
-<!-- XML Attributes -->
-
-
-<!-- Enum Values -->
-
-
-<!-- Constants -->
-
-
-<!-- Fields -->
-
-
-<!-- ========= FIELD DETAIL ======== -->
-<h2>Fields</h2>
-
-
-
-
-<A NAME="extras"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
- final
- <a href="http://developer.android.com/reference/android/os/Bundle.html">Bundle</a>
- </span>
- extras
- </h4>
- <div class="api-level">
-
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p></p></div>
-
-
- </div>
-</div>
-
-
-
-
-<!-- Public ctors -->
-
-
-
-<!-- ========= CONSTRUCTOR DETAIL ======== -->
-<!-- Protected ctors -->
-
-
-
-<!-- ========= METHOD DETAIL ======== -->
-<!-- Public methdos -->
-
-<h2>Public Methods</h2>
-
-
-
-<A NAME="getRemoteInputs()"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput[]</a>
- </span>
- <span class="sympad">getRemoteInputs</span>
- <span class="normal">()</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Get a list of inputs to be collected from the user when this action is sent.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>the array of <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code> objects associated with this action
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-
-
-
-<!-- ========= METHOD DETAIL ======== -->
-
-
-
-<!-- ========= END OF CLASS DATA ========= -->
-<A NAME="navbar_top"></A>
-
-<div id="footer" class="wrap" >
-
-
- <div id="copyright">
-
- Except as noted, this content is licensed under <a
- href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>.
- For details and restrictions, see the <a href="/license.html">
- Content License</a>.
- </div>
- <div id="build_info">
-
- Android r —
-<script src="/timestamp.js" type="text/javascript"></script>
-<script>document.write(BUILD_TIMESTAMP)</script>
-
- </div>
-
-
- <div id="footerlinks">
-
- <p>
- <a href="/about/index.html">About Android</a> |
- <a href="/legal.html">Legal</a> |
- <a href="/support.html">Support</a>
- </p>
- </div>
-
-</div> <!-- end footer -->
-</div> <!-- jd-content -->
-
-</div><!-- end doc-content -->
-
-</div> <!-- end body-content -->
-
-
-
-
-
-
-</body>
-</html>
diff --git a/docs/html/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html b/docs/html/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html
deleted file mode 100644
index 15d3303..0000000
--- a/docs/html/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html
+++ /dev/null
@@ -1,1862 +0,0 @@
-<!DOCTYPE html>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<html>
-<head>
-
-
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="viewport" content="width=device-width" />
-
-<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
-<title>WearableNotifications.Builder | Android Developers</title>
-
-<!-- STYLESHEETS -->
-<link rel="stylesheet"
-href="//fonts.googleapis.com/css?family=Roboto+Condensed">
-<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold"
- title="roboto">
-<link href="/assets/css/default.css" rel="stylesheet" type="text/css">
-
-
-
-<!-- JAVASCRIPT -->
-<script src="//www.google.com/jsapi" type="text/javascript"></script>
-<script src="/assets/js/android_3p-bundle.js" type="text/javascript"></script>
-<script type="text/javascript">
- var toRoot = "/";
- var metaTags = [];
- var devsite = false;
-</script>
-<script src="/assets/js/docs.js" type="text/javascript"></script>
-
-<script type="text/javascript">
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', 'UA-5831155-1']);
- _gaq.push(['_trackPageview']);
-
- (function() {
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
- })();
-</script>
-</head>
-
-<body class="gc-documentation
- preview" itemscope itemtype="http://schema.org/Article">
- <div id="doc-api-level" class="" style="display:none"></div>
- <a name="top"></a>
-
-
-
-<a name="top"></a>
-
-<!-- Header -->
-<div id="header-wrapper">
- <div id="header">
- <div class="wrap" id="header-wrap">
- <div class="col_3 logo wear-logo">
- <a href="/wear/index.html">
- <img src="/wear/images/android-wear.png" height="16" alt="Android Wear" />
- </a>
- </div>
- <div class="col-8" style="margin:0"><h1 style="margin:1px 0 0 20px;padding:0;line-height:16px;
-color:#666;font-weight:100;font-size:24px;">Developer Preview</h1></div>
-
-
-
-<div class="menu-container">
- <div class="moremenu">
- <div id="more-btn"></div>
- </div>
- <div class="morehover" id="moremenu">
- <div class="top"></div>
- <div class="mid">
- <div class="header">Links</div>
- <ul>
- <li><a href="https://play.google.com/apps/publish/" target="_googleplay">Google Play Developer Console</a></li>
- <li><a href="http://android-developers.blogspot.com/">Android Developers Blog</a></li>
- <li><a href="/about/index.html">About Android</a></li>
- </ul>
- <div class="header">Android Sites</div>
- <ul>
- <li><a href="http://www.android.com">Android.com</a></li>
- <li class="active"><a>Android Developers</a></li>
- <li><a href="http://source.android.com">Android Open Source Project</a></li>
- </ul>
-
-
-
- <div class="header">Language</div>
- <div id="language" class="locales">
- <select name="language" onChange="changeLangPref(this.value, true)">
- <option value="en">English</option>
- <option value="es">Español</option>
- <option value="ja">日本語</option>
- <option value="ko">한국어</option>
- <option value="ru">Русский</option>
- <option value="zh-cn">中文 (中国)</option>
- <option value="zh-tw">中文 (台灣)</option>
- </select>
- </div>
- <script type="text/javascript">
- <!--
- loadLangPref();
- //-->
- </script>
-
-
- <br class="clearfix" />
- </div><!-- end 'mid' -->
- <div class="bottom"></div>
- </div><!-- end 'moremenu' -->
-
- <div class="search" id="search-container">
- <div class="search-inner">
- <div id="search-btn"></div>
- <div class="left"></div>
- <form onsubmit="return submit_search()">
- <input id="search_autocomplete" type="text" value="" autocomplete="off" name="q"
- onfocus="search_focus_changed(this, true)" onblur="search_focus_changed(this, false)"
- onkeydown="return search_changed(event, true, '/')"
- onkeyup="return search_changed(event, false, '/')" />
- </form>
- <div class="right"></div>
- <a class="close hide">close</a>
- <div class="left"></div>
- <div class="right"></div>
- </div><!-- end search-inner -->
- </div><!-- end search-container -->
-
- <div class="search_filtered_wrapper reference">
- <div class="suggest-card reference no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- </div>
-
- <div class="search_filtered_wrapper docs">
- <div class="suggest-card dummy no-display"> </div>
- <div class="suggest-card develop no-display">
- <ul class="search_filtered">
- </ul>
- <div class="child-card guides no-display">
- </div>
- <div class="child-card training no-display">
- </div>
- <div class="child-card samples no-display">
- </div>
- </div>
- <div class="suggest-card design no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- <div class="suggest-card distribute no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- </div>
-</div><!-- end menu-container (search and menu widget) -->
-
-
- </div><!-- end header-wrap -->
- </div><!-- /Header -->
-
-
- <div id="searchResults" class="wrap" style="display:none;">
- <h2 id="searchTitle">Results</h2>
- <div id="leftSearchControl" class="search-control">Loading...</div>
- </div>
-</div> <!--end header-wrapper -->
-
-<div id="sticky-header">
- <div>
- <a class="logo" href="#top"></a>
- <a class="top" href="#top"></a>
- <ul class="breadcrumb">
-
- <li class="current">WearableNotifications.Builder</li>
- </ul>
- </div>
-</div>
-
-
-
-
- <div class="wrap clearfix" id="body-content">
- <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
- <div id="devdoc-nav" class="scroll-pane">
-
-<ul id="nav">
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/preview/start.html">Get Started
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/design/user-interface.html">UI Overview
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/design/index.html">Design Principles
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/creating.html">Creating Notifications for Android Wear
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/remote-input.html">Receiving Voice Input from a Notification
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/pages.html">Adding Pages to a Notification
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/stacks.html">Stacking Notifications
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header"><a href="/reference/android/preview/support/package-summary.html">Notification Reference</a></div>
- <ul class="tree-list-children">
-<li class="nav-section">
-<div class="nav-section-header-ref"><span class="tree-list-subtitle package" title="android.preview.support.v4.app">android.preview.support.v4.app</span></div>
- <ul>
-<li><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html">NotificationManagerCompat</a></li>
- </ul>
-</li>
-
-<li class="nav-section">
-<div class="nav-section-header-ref"><span class="tree-list-subtitle package" title="android.preview.support.wearable.notifications">android.preview.support.wearable.notifications</span></div>
-<ul>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></li>
-<li><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html" >RemoteInput.Builder</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html">WearableNotifications</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html">WearableNotifications.Action.Builder</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></li>
- </ul>
- </li>
-</ul>
-</li>
-
-
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/license.html">License Agreement</a></div>
- </li>
-
-
-</ul>
-
-
-
- </div>
- </div> <!-- end side-nav -->
- <script>
- $(document).ready(function() {
- scrollIntoView("devdoc-nav");
- });
- </script>
-
-
-
-
-
-<div class="col-12" id="doc-col">
-
-<div id="api-info-block">
-
-
-
-
-
-
-
-
-
-
-
-<div class="sum-details-links">
-
-Summary:
-
-
-
-
-
-
-
-
-
- <a href="#pubctors">Ctors</a>
-
-
-
-
- | <a href="#pubmethods">Methods</a>
-
-
-
-
- | <a href="#inhmethods">Inherited Methods</a>
-
-| <a href="#" onclick="return toggleAllClassInherited()" id="toggleAllClassInherited">[Expand All]</a>
-
-</div><!-- end sum-details-links -->
-<div class="api-level">
-
-
-
-
-</div>
-</div><!-- end api-info-block -->
-
-
-<!-- ======== START OF CLASS DATA ======== -->
-
-<div id="jd-header">
- public
- static
- final
-
- class
-<h1 itemprop="name">WearableNotifications.Builder</h1>
-
-
-
-
- extends <a href="http://developer.android.com/reference/java/lang/Object.html">Object</a><br/>
-
-
-
-
-
-
-
-
-
-</div><!-- end header -->
-
-<div id="naMessage"></div>
-
-<div id="jd-content" class="api apilevel-">
-<table class="jd-inheritance-table">
-
-
- <tr>
-
- <td colspan="2" class="jd-inheritance-class-cell"><a href="http://developer.android.com/reference/java/lang/Object.html">java.lang.Object</a></td>
- </tr>
-
-
- <tr>
-
- <td class="jd-inheritance-space"> ↳</td>
-
- <td colspan="1" class="jd-inheritance-class-cell">android.preview.support.wearable.notifications.WearableNotifications.Builder</td>
- </tr>
-
-
-</table>
-
-
-
-
-
-
-
-<div class="jd-descr">
-
-
-<h2>Class Overview</h2>
-<p itemprop="articleBody">Builder class that wraps a <code><a href="/reference/android/support/v4/app/NotificationCompat.Builder.html">NotificationCompat.Builder</a></code> to add
- wearable extensions for a notification.
-
- <p>You can chain the "set" methods for this builder in any order,
- but you must call the <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#build()">build()</a></code> method last to build the final notification.
-</p>
-
-
-
-
-
-</div><!-- jd-descr -->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<div class="jd-descr">
-
-
-<h2>Summary</h2>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<!-- ======== CONSTRUCTOR SUMMARY ======== -->
-<table id="pubctors" class="jd-sumtable"><tr><th colspan="12">Public Constructors</th></tr>
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- </nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#WearableNotifications.Builder(android.content.Context)">WearableNotifications.Builder</a></span>(<a href="http://developer.android.com/reference/android/content/Context.html">Context</a> context)</nobr>
-
- <div class="jd-descrdiv">Construct a builder to be used for adding wearable extensions to notifications.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- </nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#WearableNotifications.Builder(android.support.v4.app.NotificationCompat.Builder)">WearableNotifications.Builder</a></span>(NotificationCompat.Builder builder)</nobr>
-
- <div class="jd-descrdiv">Construct a builder to be used for adding wearable extensions to notifications to
- a <code><a href="/reference/android/support/v4/app/NotificationCompat.Builder.html">NotificationCompat.Builder</a></code>.</div>
-
- </td></tr>
-
-
-
-</table>
-
-
-
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-<table id="pubmethods" class="jd-sumtable"><tr><th colspan="12">Public Methods</th></tr>
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#addAction(android.preview.support.wearable.notifications.WearableNotifications.Action)">addAction</a></span>(<a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a> action)</nobr>
-
- <div class="jd-descrdiv">Add an action to this notification.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#addPage(android.app.Notification)">addPage</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> page)</nobr>
-
- <div class="jd-descrdiv">Add an additional page of content to display with this notification.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#addPages(java.util.Collection<android.app.Notification>)">addPages</a></span>(<a href="http://developer.android.com/reference/java/util/Collection.html">Collection</a><<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a>> pages)</nobr>
-
- <div class="jd-descrdiv">Add additional pages of content to display with this notification.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#addRemoteInputForContentIntent(android.preview.support.wearable.notifications.RemoteInput)">addRemoteInputForContentIntent</a></span>(<a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a> input)</nobr>
-
- <div class="jd-descrdiv">Adds a <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code> for the content intent.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#build()">build</a></span>()</nobr>
-
- <div class="jd-descrdiv">Combine all of the options that have been set by both this builder and
- the wrapped <code><a href="/reference/android/support/v4/app/NotificationCompat.Builder.html">NotificationCompat.Builder</a></code> object and return a new
- <code><a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a></code> object.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- NotificationCompat.Builder</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#getCompatBuilder()">getCompatBuilder</a></span>()</nobr>
-
- <div class="jd-descrdiv">Return the <code><a href="/reference/android/support/v4/app/NotificationCompat.Builder.html">NotificationCompat.Builder</a></code> being wrapped by this object.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/android/os/Bundle.html">Bundle</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#getExtras()">getExtras</a></span>()</nobr>
-
- <div class="jd-descrdiv">Get the current metadata Bundle used by this Builder, creating a new one
- as necessary.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#setBigActionIcon(int, java.lang.CharSequence)">setBigActionIcon</a></span>(int icon, <a href="http://developer.android.com/reference/java/lang/CharSequence.html">CharSequence</a> subtext)</nobr>
-
- <div class="jd-descrdiv">Add a big action display to this notification.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#setBigActionIcon(int)">setBigActionIcon</a></span>(int icon)</nobr>
-
- <div class="jd-descrdiv">Add a big action display to this notification.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#setGroup(java.lang.String, int)">setGroup</a></span>(<a href="http://developer.android.com/reference/java/lang/String.html">String</a> groupKey, int groupOrder)</nobr>
-
- <div class="jd-descrdiv">Set this notification to be part of a group of notifications sharing the same key.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#setGroup(java.lang.String)">setGroup</a></span>(<a href="http://developer.android.com/reference/java/lang/String.html">String</a> groupKey)</nobr>
-
- <div class="jd-descrdiv">Set this notification to be part of a group of notifications sharing the same key.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#setHintHideIcon(boolean)">setHintHideIcon</a></span>(boolean hintHideIcon)</nobr>
-
- <div class="jd-descrdiv">Set a hint that this notification's icon should not be displayed.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#setLocalOnly(boolean)">setLocalOnly</a></span>(boolean localOnly)</nobr>
-
- <div class="jd-descrdiv">Set whether or not this notification is only relevant to the current device.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#setMinPriority()">setMinPriority</a></span>()</nobr>
-
- <div class="jd-descrdiv">Set the priority of this notification to be minimum priority level
- (<code><a href="http://developer.android.com/reference/android/app/Notification.html#PRIORITY_MIN">PRIORITY_MIN</a></code>).</div>
-
- </td></tr>
-
-
-
-</table>
-
-
-
-
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-<table id="inhmethods" class="jd-sumtable"><tr><th>
- <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
- <div style="clear:left;">Inherited Methods</div></th></tr>
-
-
-<tr class="api apilevel-" >
-<td colspan="12">
- <a href="#" onclick="return toggleInherited(this, null)" id="inherited-methods-java.lang.Object" class="jd-expando-trigger closed"
- ><img id="inherited-methods-java.lang.Object-trigger"
- src="/assets/images/triangle-closed.png"
- class="jd-expando-trigger-img" /></a>
-From class
-
- <a href="http://developer.android.com/reference/java/lang/Object.html">java.lang.Object</a>
-
-<div id="inherited-methods-java.lang.Object">
- <div id="inherited-methods-java.lang.Object-list"
- class="jd-inheritedlinks">
- </div>
- <div id="inherited-methods-java.lang.Object-summary" style="display: none;">
- <table class="jd-sumtable-expando">
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/java/lang/Object.html">Object</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">clone</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- boolean</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">equals</span>(<a href="http://developer.android.com/reference/java/lang/Object.html">Object</a> arg0)</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">finalize</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- <a href="http://developer.android.com/reference/java/lang/Class.html">Class</a><?></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">getClass</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- int</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">hashCode</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">notify</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">notifyAll</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/java/lang/String.html">String</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">toString</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>(long arg0, int arg1)</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>(long arg0)</nobr>
-
- </td></tr>
-
-
-</table>
- </div>
-</div>
-</td></tr>
-
-
-</table>
-
-
-</div><!-- jd-descr (summary) -->
-
-<!-- Details -->
-
-
-
-
-
-
-
-
-<!-- XML Attributes -->
-
-
-<!-- Enum Values -->
-
-
-<!-- Constants -->
-
-
-<!-- Fields -->
-
-
-<!-- Public ctors -->
-
-
-<!-- ========= CONSTRUCTOR DETAIL ======== -->
-<h2>Public Constructors</h2>
-
-
-
-<A NAME="WearableNotifications.Builder(android.content.Context)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
-
- </span>
- <span class="sympad">WearableNotifications.Builder</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/content/Context.html">Context</a> context)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Construct a builder to be used for adding wearable extensions to notifications. Both the
- wrapped builder (accessible via <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#getCompatBuilder()">getCompatBuilder()</a></code>) and this builder can be used
- simultaneously, but the build() method from this object must be called in the end.
-
- <p>Always post notifications to the notification
- system with the <code>NotificationManagerCompat.notify(...)</code> methods
- instead of the <code>NotificationManager.notify(...)</code> methods.
-
- <pre class="prettyprint">
- WearableNotifications.Builder builder = new WearableNotifications.Builder(mContext)
- .setLocalOnly(true);
- builder.getCompatBuilder()
- .setContentTitle("New mail from " + sender.toString())
- .setContentText(subject)
- .setSmallIcon(R.drawable.new_mail);
- Notification notif = builder.build();
- NotificationManagerCompat.from(mContext).notify(0, notif);</pre>
-</p></div>
-
- </div>
-</div>
-
-
-<A NAME="WearableNotifications.Builder(android.support.v4.app.NotificationCompat.Builder)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
-
- </span>
- <span class="sympad">WearableNotifications.Builder</span>
- <span class="normal">(NotificationCompat.Builder builder)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Construct a builder to be used for adding wearable extensions to notifications to
- a <code><a href="/reference/android/support/v4/app/NotificationCompat.Builder.html">NotificationCompat.Builder</a></code>. Both the wrapped builder and this
- builder can be used simultaneously, but the build() method from this object must be
- called in the end.
- <p>Always post notifications to the notification
- system with the <code>NotificationManagerCompat.notify(...)</code> methods
- instead of the <code>NotificationManager.notify(...)</code> methods.
-
- <pre class="prettyprint">
- NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext)
- .setContentTitle("New mail from " + sender.toString())
- .setContentText(subject)
- .setSmallIcon(R.drawable.new_mail);
- Notification notif = new WearableNotifications.Builder(builder)
- .setLocalOnly(true)
- .build();
- NotificationManagerCompat.from(mContext).notify(0, notif);</pre>
-</p></div>
-
- </div>
-</div>
-
-
-
-
-
-<!-- ========= CONSTRUCTOR DETAIL ======== -->
-<!-- Protected ctors -->
-
-
-
-<!-- ========= METHOD DETAIL ======== -->
-<!-- Public methdos -->
-
-<h2>Public Methods</h2>
-
-
-
-<A NAME="addAction(android.preview.support.wearable.notifications.WearableNotifications.Action)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a>
- </span>
- <span class="sympad">addAction</span>
- <span class="normal">(<a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a> action)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Add an action to this notification. Actions are typically displayed by
- the system as a button adjacent to the notification content. This method
- accepts <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></code> extension wrappers. Actions added by this function
- are appended when <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#build()">build()</a></code> is called.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>action</td>
- <td>the action to add to this notification</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>this object for method chaining</li></ul>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">See Also</h5>
- <ul class="nolist"><li><code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></code></li>
- </ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="addPage(android.app.Notification)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a>
- </span>
- <span class="sympad">addPage</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> page)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Add an additional page of content to display with this notification. The current
- notification forms the first page, and pages added using this function form
- subsequent pages. This field can be used to separate a notification into multiple
- sections.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>page</td>
- <td>the notification to add as another page</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>this object for method chaining</li></ul>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">See Also</h5>
- <ul class="nolist"><li><code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#getPages(android.app.Notification)">getPages(Notification)</a></code></li>
- </ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="addPages(java.util.Collection<android.app.Notification>)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a>
- </span>
- <span class="sympad">addPages</span>
- <span class="normal">(<a href="http://developer.android.com/reference/java/util/Collection.html">Collection</a><<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a>> pages)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Add additional pages of content to display with this notification. The current
- notification forms the first page, and pages added using this function form
- subsequent pages. This field can be used to separate a notification into multiple
- sections.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>pages</td>
- <td>a collection of notifications</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>this object for method chaining</li></ul>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">See Also</h5>
- <ul class="nolist"><li><code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#getPages(android.app.Notification)">getPages(Notification)</a></code></li>
- </ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="addRemoteInputForContentIntent(android.preview.support.wearable.notifications.RemoteInput)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a>
- </span>
- <span class="sympad">addRemoteInputForContentIntent</span>
- <span class="normal">(<a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a> input)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Adds a <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code> for the content intent. The collected
- data will be overlayed onto the content intent.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>input</td>
- <td>a <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code> object to obtain a user response</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>this object for method chaining
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="build()"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a>
- </span>
- <span class="sympad">build</span>
- <span class="normal">()</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Combine all of the options that have been set by both this builder and
- the wrapped <code><a href="/reference/android/support/v4/app/NotificationCompat.Builder.html">NotificationCompat.Builder</a></code> object and return a new
- <code><a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a></code> object.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>the notification
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="getCompatBuilder()"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- NotificationCompat.Builder
- </span>
- <span class="sympad">getCompatBuilder</span>
- <span class="normal">()</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Return the <code><a href="/reference/android/support/v4/app/NotificationCompat.Builder.html">NotificationCompat.Builder</a></code> being wrapped by this object.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>the wrapped <code><a href="/reference/android/support/v4/app/NotificationCompat.Builder.html">NotificationCompat.Builder</a></code>
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="getExtras()"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="http://developer.android.com/reference/android/os/Bundle.html">Bundle</a>
- </span>
- <span class="sympad">getExtras</span>
- <span class="normal">()</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Get the current metadata Bundle used by this Builder, creating a new one
- as necessary.
-
- <p>The returned Bundle is shared with this Builder.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>the extras bundle
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setBigActionIcon(int, java.lang.CharSequence)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a>
- </span>
- <span class="sympad">setBigActionIcon</span>
- <span class="normal">(int icon, <a href="http://developer.android.com/reference/java/lang/CharSequence.html">CharSequence</a> subtext)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Add a big action display to this notification. Big actions show a hint to users
- about the action taken when the content intent is triggered.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>icon</td>
- <td>icon to display for the content action.</td>
- </tr>
- <tr>
- <th>subtext</td>
- <td>Optional subtext to display with the big action icon.</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>this object for method chaining
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setBigActionIcon(int)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a>
- </span>
- <span class="sympad">setBigActionIcon</span>
- <span class="normal">(int icon)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Add a big action display to this notification. Big actions show a hint to users
- about the action taken when the content intent is triggered.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>icon</td>
- <td>icon to display for the content action.</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>this object for method chaining
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setGroup(java.lang.String, int)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a>
- </span>
- <span class="sympad">setGroup</span>
- <span class="normal">(<a href="http://developer.android.com/reference/java/lang/String.html">String</a> groupKey, int groupOrder)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Set this notification to be part of a group of notifications sharing the same key.
- Grouped notifications may display in a cluster or stack on devices which
- support such rendering.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>groupKey</td>
- <td>The group key of the group. Unique within a package.</td>
- </tr>
- <tr>
- <th>groupOrder</td>
- <td>The 0-indexed sort order within the group. Can also be set
- to the sentinel value <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#GROUP_ORDER_SUMMARY">GROUP_ORDER_SUMMARY</a></code> to mark this
- notification as being the group summary.</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>this object for method chaining
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setGroup(java.lang.String)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a>
- </span>
- <span class="sympad">setGroup</span>
- <span class="normal">(<a href="http://developer.android.com/reference/java/lang/String.html">String</a> groupKey)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Set this notification to be part of a group of notifications sharing the same key.
- Grouped notifications may display in a cluster or stack on devices which
- support such rendering. Use the default ordering within a group.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>groupKey</td>
- <td>The group key of the group. Unique within a package.</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>this object for method chaining
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setHintHideIcon(boolean)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a>
- </span>
- <span class="sympad">setHintHideIcon</span>
- <span class="normal">(boolean hintHideIcon)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Set a hint that this notification's icon should not be displayed.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>hintHideIcon</td>
- <td><code>true</code> to hide the icon, <code>false</code> otherwise.</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>this object for method chaining
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setLocalOnly(boolean)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a>
- </span>
- <span class="sympad">setLocalOnly</span>
- <span class="normal">(boolean localOnly)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Set whether or not this notification is only relevant to the current device.
-
- <p>Some notifications can be bridged to other devices for remote display.
- This hint can be set to recommend this notification not be bridged.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>localOnly</td>
- <td><code>true</code> to keep the notification on this device,
- <code>false</code> otherwise. Default value is <code>false</code>.</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>this object for method chaining</li></ul>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">See Also</h5>
- <ul class="nolist"><li><code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#getLocalOnly(android.app.Notification)">getLocalOnly(Notification)</a></code></li>
- </ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setMinPriority()"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
-
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a>
- </span>
- <span class="sympad">setMinPriority</span>
- <span class="normal">()</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Set the priority of this notification to be minimum priority level
- (<code><a href="http://developer.android.com/reference/android/app/Notification.html#PRIORITY_MIN">PRIORITY_MIN</a></code>). When set via WearableNotifications, these
- minimum priority notifications will bypass the notification manager on platforms
- that do not support ambient level notifications.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>this object for method chaining
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-
-
-
-<!-- ========= METHOD DETAIL ======== -->
-
-
-
-<!-- ========= END OF CLASS DATA ========= -->
-<A NAME="navbar_top"></A>
-
-<div id="footer" class="wrap" >
-
-
- <div id="copyright">
-
- Except as noted, this content is licensed under <a
- href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>.
- For details and restrictions, see the <a href="/license.html">
- Content License</a>.
- </div>
- <div id="build_info">
-
- Android r —
-<script src="/timestamp.js" type="text/javascript"></script>
-<script>document.write(BUILD_TIMESTAMP)</script>
-
- </div>
-
-
- <div id="footerlinks">
-
- <p>
- <a href="/about/index.html">About Android</a> |
- <a href="/legal.html">Legal</a> |
- <a href="/support.html">Support</a>
- </p>
- </div>
-
-</div> <!-- end footer -->
-</div> <!-- jd-content -->
-
-</div><!-- end doc-content -->
-
-</div> <!-- end body-content -->
-
-
-
-
-
-
-</body>
-</html>
diff --git a/docs/html/reference/android/preview/support/wearable/notifications/WearableNotifications.html b/docs/html/reference/android/preview/support/wearable/notifications/WearableNotifications.html
deleted file mode 100644
index c9948b8..0000000
--- a/docs/html/reference/android/preview/support/wearable/notifications/WearableNotifications.html
+++ /dev/null
@@ -1,2295 +0,0 @@
-<!DOCTYPE html>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<html>
-<head>
-
-
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="viewport" content="width=device-width" />
-
-<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
-<title>WearableNotifications | Android Developers</title>
-
-<!-- STYLESHEETS -->
-<link rel="stylesheet"
-href="//fonts.googleapis.com/css?family=Roboto+Condensed">
-<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold"
- title="roboto">
-<link href="/assets/css/default.css" rel="stylesheet" type="text/css">
-
-
-
-<!-- JAVASCRIPT -->
-<script src="//www.google.com/jsapi" type="text/javascript"></script>
-<script src="/assets/js/android_3p-bundle.js" type="text/javascript"></script>
-<script type="text/javascript">
- var toRoot = "/";
- var metaTags = [];
- var devsite = false;
-</script>
-<script src="/assets/js/docs.js" type="text/javascript"></script>
-
-<script type="text/javascript">
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', 'UA-5831155-1']);
- _gaq.push(['_trackPageview']);
-
- (function() {
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
- })();
-</script>
-</head>
-
-<body class="gc-documentation
- preview" itemscope itemtype="http://schema.org/Article">
- <div id="doc-api-level" class="" style="display:none"></div>
- <a name="top"></a>
-
-
-
-<a name="top"></a>
-
-<!-- Header -->
-<div id="header-wrapper">
- <div id="header">
- <div class="wrap" id="header-wrap">
- <div class="col_3 logo wear-logo">
- <a href="/wear/index.html">
- <img src="/wear/images/android-wear.png" height="16" alt="Android Wear" />
- </a>
- </div>
- <div class="col-8" style="margin:0"><h1 style="margin:1px 0 0 20px;padding:0;line-height:16px;
-color:#666;font-weight:100;font-size:24px;">Developer Preview</h1></div>
-
-
-
-<div class="menu-container">
- <div class="moremenu">
- <div id="more-btn"></div>
- </div>
- <div class="morehover" id="moremenu">
- <div class="top"></div>
- <div class="mid">
- <div class="header">Links</div>
- <ul>
- <li><a href="https://play.google.com/apps/publish/" target="_googleplay">Google Play Developer Console</a></li>
- <li><a href="http://android-developers.blogspot.com/">Android Developers Blog</a></li>
- <li><a href="/about/index.html">About Android</a></li>
- </ul>
- <div class="header">Android Sites</div>
- <ul>
- <li><a href="http://www.android.com">Android.com</a></li>
- <li class="active"><a>Android Developers</a></li>
- <li><a href="http://source.android.com">Android Open Source Project</a></li>
- </ul>
-
-
-
- <div class="header">Language</div>
- <div id="language" class="locales">
- <select name="language" onChange="changeLangPref(this.value, true)">
- <option value="en">English</option>
- <option value="es">Español</option>
- <option value="ja">日本語</option>
- <option value="ko">한국어</option>
- <option value="ru">Русский</option>
- <option value="zh-cn">中文 (中国)</option>
- <option value="zh-tw">中文 (台灣)</option>
- </select>
- </div>
- <script type="text/javascript">
- <!--
- loadLangPref();
- //-->
- </script>
-
-
- <br class="clearfix" />
- </div><!-- end 'mid' -->
- <div class="bottom"></div>
- </div><!-- end 'moremenu' -->
-
- <div class="search" id="search-container">
- <div class="search-inner">
- <div id="search-btn"></div>
- <div class="left"></div>
- <form onsubmit="return submit_search()">
- <input id="search_autocomplete" type="text" value="" autocomplete="off" name="q"
- onfocus="search_focus_changed(this, true)" onblur="search_focus_changed(this, false)"
- onkeydown="return search_changed(event, true, '/')"
- onkeyup="return search_changed(event, false, '/')" />
- </form>
- <div class="right"></div>
- <a class="close hide">close</a>
- <div class="left"></div>
- <div class="right"></div>
- </div><!-- end search-inner -->
- </div><!-- end search-container -->
-
- <div class="search_filtered_wrapper reference">
- <div class="suggest-card reference no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- </div>
-
- <div class="search_filtered_wrapper docs">
- <div class="suggest-card dummy no-display"> </div>
- <div class="suggest-card develop no-display">
- <ul class="search_filtered">
- </ul>
- <div class="child-card guides no-display">
- </div>
- <div class="child-card training no-display">
- </div>
- <div class="child-card samples no-display">
- </div>
- </div>
- <div class="suggest-card design no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- <div class="suggest-card distribute no-display">
- <ul class="search_filtered">
- </ul>
- </div>
- </div>
-</div><!-- end menu-container (search and menu widget) -->
-
-
- </div><!-- end header-wrap -->
- </div><!-- /Header -->
-
-
- <div id="searchResults" class="wrap" style="display:none;">
- <h2 id="searchTitle">Results</h2>
- <div id="leftSearchControl" class="search-control">Loading...</div>
- </div>
-</div> <!--end header-wrapper -->
-
-<div id="sticky-header">
- <div>
- <a class="logo" href="#top"></a>
- <a class="top" href="#top"></a>
- <ul class="breadcrumb">
-
- <li class="current">WearableNotifications</li>
- </ul>
- </div>
-</div>
-
-
-
-
- <div class="wrap clearfix" id="body-content">
- <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement">
- <div id="devdoc-nav" class="scroll-pane">
-
-<ul id="nav">
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/preview/start.html">Get Started
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/design/user-interface.html">UI Overview
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/design/index.html">Design Principles
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/creating.html">Creating Notifications for Android Wear
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/remote-input.html">Receiving Voice Input from a Notification
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/pages.html">Adding Pages to a Notification
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/notifications/stacks.html">Stacking Notifications
- </a></div>
- </li>
-
- <li class="nav-section">
- <div class="nav-section-header"><a href="/reference/android/preview/support/package-summary.html">Notification Reference</a></div>
- <ul class="tree-list-children">
-<li class="nav-section">
-<div class="nav-section-header-ref"><span class="tree-list-subtitle package" title="android.preview.support.v4.app">android.preview.support.v4.app</span></div>
- <ul>
-<li><a href="/reference/android/preview/support/v4/app/NotificationManagerCompat.html">NotificationManagerCompat</a></li>
- </ul>
-</li>
-
-<li class="nav-section">
-<div class="nav-section-header-ref"><span class="tree-list-subtitle package" title="android.preview.support.wearable.notifications">android.preview.support.wearable.notifications</span></div>
-<ul>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></li>
-<li><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.Builder.html" >RemoteInput.Builder</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html">WearableNotifications</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.Builder.html">WearableNotifications.Action.Builder</a></li>
-
-<li><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></li>
- </ul>
- </li>
-</ul>
-</li>
-
-
-
- <li class="nav-section">
- <div class="nav-section-header empty"><a href="/wear/license.html">License Agreement</a></div>
- </li>
-
-
-</ul>
-
-
-
- </div>
- </div> <!-- end side-nav -->
- <script>
- $(document).ready(function() {
- scrollIntoView("devdoc-nav");
- });
- </script>
-
-
-
-
-
-<div class="col-12" id="doc-col">
-
-<div id="api-info-block">
-
-
-
-
-
-
-
-
-
-
-
-<div class="sum-details-links">
-
-Summary:
-
- <a href="#nestedclasses">Nested Classes</a>
-
-
-
-
-
-
- | <a href="#constants">Constants</a>
-
-
-
-
-
-
-
-
- | <a href="#pubmethods">Methods</a>
-
-
-
-
- | <a href="#inhmethods">Inherited Methods</a>
-
-| <a href="#" onclick="return toggleAllClassInherited()" id="toggleAllClassInherited">[Expand All]</a>
-
-</div><!-- end sum-details-links -->
-<div class="api-level">
-
-
-
-
-</div>
-</div><!-- end api-info-block -->
-
-
-<!-- ======== START OF CLASS DATA ======== -->
-
-<div id="jd-header">
- public
-
- final
-
- class
-<h1 itemprop="name">WearableNotifications</h1>
-
-
-
-
- extends <a href="http://developer.android.com/reference/java/lang/Object.html">Object</a><br/>
-
-
-
-
-
-
-
-
-
-</div><!-- end header -->
-
-<div id="naMessage"></div>
-
-<div id="jd-content" class="api apilevel-">
-<table class="jd-inheritance-table">
-
-
- <tr>
-
- <td colspan="2" class="jd-inheritance-class-cell"><a href="http://developer.android.com/reference/java/lang/Object.html">java.lang.Object</a></td>
- </tr>
-
-
- <tr>
-
- <td class="jd-inheritance-space"> ↳</td>
-
- <td colspan="1" class="jd-inheritance-class-cell">android.preview.support.wearable.notifications.WearableNotifications</td>
- </tr>
-
-
-</table>
-
-
-
-
-
-
-
-<div class="jd-descr">
-
-
-<h2>Class Overview</h2>
-<p itemprop="articleBody">Helper class that contains wearable extensions for notifications.
- Always use the <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></code> to create instances of this class.
- <p class="note"> See
- <a href="/wear/notifications/creating.html">Creating Notifications
- for Android Wear</a> for more information on how to use this class.
- <p>
- To create a notification with wearable extensions:
- <ol>
- <li>Create a <code><a href="/reference/android/support/v4/app/NotificationCompat.Builder.html">NotificationCompat.Builder</a></code>, setting any desired
- properties.
- <li>Create a <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></code>, passing in the
- <code><a href="/reference/android/support/v4/app/NotificationCompat.Builder.html">NotificationCompat.Builder</a></code> as a starting point.
- <li>Set wearable-specific properties using the
- <code>add</code> and <code>set</code> methods of <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></code>.
- <li>Call <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html#build()">build()</a></code> to create the notification.
- <li>Post the notification to the notification
- system with the <code>NotificationManagerCompat.notify(...)</code> methods
- and not the <code>NotificationManager.notify(...)</code> methods.
- </ol>
-
- <pre class="prettyprint">
- NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext)
- .setContentTitle("New mail from " + sender.toString())
- .setContentText(subject)
- .setSmallIcon(R.drawable.new_mail);
- Notification notif = new WearableNotifications.Builder(builder)
- .setLocalOnly(true)
- .setMinPriority()
- .build();
- NotificationManagerCompat.from(mContext).notify(0, notif);</pre>
- <p>When you receive a notification object from the builder, the methods in
- this class let you access the values of various notification fields in
- a backward-compatible manner.
-</p>
-
-
-
-
-
-</div><!-- jd-descr -->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<div class="jd-descr">
-
-
-<h2>Summary</h2>
-
-
-
-<!-- ======== NESTED CLASS SUMMARY ======== -->
-<table id="nestedclasses" class="jd-sumtable"><tr><th colspan="12">Nested Classes</th></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
- class</nobr></td>
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></td>
- <td class="jd-descrcol" width="100%">Subclass of <code><a href="/reference/android/support/v4/app/NotificationCompat.Action.html">NotificationCompat.Action</a></code> that adds additional
- wearable extensions for actions. </td>
- </tr>
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
- class</nobr></td>
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Builder.html">WearableNotifications.Builder</a></td>
- <td class="jd-descrcol" width="100%">Builder class that wraps a <code><a href="/reference/android/support/v4/app/NotificationCompat.Builder.html">NotificationCompat.Builder</a></code> to add
- wearable extensions for a notification. </td>
- </tr>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<!-- =========== ENUM CONSTANT SUMMARY =========== -->
-<table id="constants" class="jd-sumtable"><tr><th colspan="12">Constants</th></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol">int</td>
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#GROUP_ORDER_DEFAULT">GROUP_ORDER_DEFAULT</a></td>
- <td class="jd-descrcol" width="100%">Default value for the group sort order.</td>
- </tr>
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol">int</td>
- <td class="jd-linkcol"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#GROUP_ORDER_SUMMARY">GROUP_ORDER_SUMMARY</a></td>
- <td class="jd-descrcol" width="100%">Sentinel value provided to the <code>groupOrder</code> parameter of the
- <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#setGroup(android.app.Notification, java.lang.String, int)">setGroup(android.app.Notification, java.lang.String, int)</a></code>
- method.</td>
- </tr>
-
-
-
-</table>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-<table id="pubmethods" class="jd-sumtable"><tr><th colspan="12">Public Methods</th></tr>
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#getAction(android.app.Notification, int)">getAction</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, int actionIndex)</nobr>
-
- <div class="jd-descrdiv">Get a <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></code> wrapper for the notification at <code>actionIndex</code>
- in the <code><a href="http://developer.android.com/reference/android/app/Notification.html#actions">actions</a></code> array.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- int</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#getActionCount(android.app.Notification)">getActionCount</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</nobr>
-
- <div class="jd-descrdiv">Get the number of actions present on this notification.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- int</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#getBigActionIcon(android.app.Notification)">getBigActionIcon</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</nobr>
-
- <div class="jd-descrdiv">Get the big action icon to be displayed with this notification.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- <a href="http://developer.android.com/reference/java/lang/CharSequence.html">CharSequence</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#getBigActionSubtext(android.app.Notification)">getBigActionSubtext</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</nobr>
-
- <div class="jd-descrdiv">Get the big action icon subtext to be shown with a big action icon.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- <a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput[]</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#getContentIntentRemoteInputs(android.app.Notification)">getContentIntentRemoteInputs</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</nobr>
-
- <div class="jd-descrdiv">Gets the <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code> objects associated with the content intent.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- <a href="http://developer.android.com/reference/android/os/Bundle.html">Bundle</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#getExtras(android.app.Notification)">getExtras</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</nobr>
-
- <div class="jd-descrdiv">Gets the <code><a href="http://developer.android.com/reference/android/app/Notification.html#extras">extras</a></code> field from a notification in a backward-compatible
- manner.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- <a href="http://developer.android.com/reference/java/lang/String.html">String</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#getGroupKey(android.app.Notification)">getGroupKey</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</nobr>
-
- <div class="jd-descrdiv">Get the key used to group this notification into a cluster or stack
- with other notifications.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- int</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#getGroupOrder(android.app.Notification)">getGroupOrder</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</nobr>
-
- <div class="jd-descrdiv">Get the sort order of this notification within a group of notifications
- with the same group key set.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- boolean</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#getHintHideIcon(android.app.Notification)">getHintHideIcon</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</nobr>
-
- <div class="jd-descrdiv">Get a hint that this notification's icon should not be displayed.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- boolean</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#getLocalOnly(android.app.Notification)">getLocalOnly</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</nobr>
-
- <div class="jd-descrdiv">Get whether or not this notification is only relevant to the current device.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- <a href="http://developer.android.com/reference/android/app/Notification.html">Notification[]</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#getPages(android.app.Notification)">getPages</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</nobr>
-
- <div class="jd-descrdiv">Get the array of additional pages of content for displaying this notification.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#setBigActionIcon(android.app.Notification, int)">setBigActionIcon</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, int icon)</nobr>
-
- <div class="jd-descrdiv">Add a big action display to this notification.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#setBigActionIcon(android.app.Notification, int, java.lang.CharSequence)">setBigActionIcon</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, int icon, <a href="http://developer.android.com/reference/java/lang/CharSequence.html">CharSequence</a> subtext)</nobr>
-
- <div class="jd-descrdiv">Add a big action display to this notification.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#setContentIntentRemoteInputs(android.app.Notification, android.preview.support.wearable.notifications.RemoteInput[])">setContentIntentRemoteInputs</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, <a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput[]</a> inputs)</nobr>
-
- <div class="jd-descrdiv">Sets <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code>s to be collected when the user triggers the
- <code>contentIntent</code>.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#setGroup(android.app.Notification, java.lang.String)">setGroup</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, <a href="http://developer.android.com/reference/java/lang/String.html">String</a> groupKey)</nobr>
-
- <div class="jd-descrdiv">Set this notification to be part of a group of notifications sharing the same key.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#setGroup(android.app.Notification, java.lang.String, int)">setGroup</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, <a href="http://developer.android.com/reference/java/lang/String.html">String</a> groupKey, int groupOrder)</nobr>
-
- <div class="jd-descrdiv">Set this notification to be part of a group of notifications sharing the same key.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#setHintHideIcon(android.app.Notification, boolean)">setHintHideIcon</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, boolean hintHideIcon)</nobr>
-
- <div class="jd-descrdiv">Set a hint that this notification's icon should not be displayed.</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#setLocalOnly(android.app.Notification, boolean)">setLocalOnly</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, boolean localOnly)</nobr>
-
- <div class="jd-descrdiv">Set whether or not this notification is only relevant to the current device.</div>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#setMinPriority(android.app.Notification)">setMinPriority</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</nobr>
-
- <div class="jd-descrdiv">Set the priority of this notification to be minimum priority level
- (<code><a href="http://developer.android.com/reference/android/app/Notification.html#PRIORITY_MIN">PRIORITY_MIN</a></code>).</div>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
- static
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad"><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#setPages(android.app.Notification, android.app.Notification[])">setPages</a></span>(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, <a href="http://developer.android.com/reference/android/app/Notification.html">Notification[]</a> pages)</nobr>
-
- <div class="jd-descrdiv">Set additional pages of content to display with this notification.</div>
-
- </td></tr>
-
-
-
-</table>
-
-
-
-
-
-
-
-<!-- ========== METHOD SUMMARY =========== -->
-<table id="inhmethods" class="jd-sumtable"><tr><th>
- <a href="#" class="toggle-all" onclick="return toggleAllInherited(this, null)">[Expand]</a>
- <div style="clear:left;">Inherited Methods</div></th></tr>
-
-
-<tr class="api apilevel-" >
-<td colspan="12">
- <a href="#" onclick="return toggleInherited(this, null)" id="inherited-methods-java.lang.Object" class="jd-expando-trigger closed"
- ><img id="inherited-methods-java.lang.Object-trigger"
- src="/assets/images/triangle-closed.png"
- class="jd-expando-trigger-img" /></a>
-From class
-
- <a href="http://developer.android.com/reference/java/lang/Object.html">java.lang.Object</a>
-
-<div id="inherited-methods-java.lang.Object">
- <div id="inherited-methods-java.lang.Object-list"
- class="jd-inheritedlinks">
- </div>
- <div id="inherited-methods-java.lang.Object-summary" style="display: none;">
- <table class="jd-sumtable-expando">
-
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/java/lang/Object.html">Object</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">clone</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- boolean</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">equals</span>(<a href="http://developer.android.com/reference/java/lang/Object.html">Object</a> arg0)</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">finalize</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- <a href="http://developer.android.com/reference/java/lang/Class.html">Class</a><?></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">getClass</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- int</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">hashCode</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">notify</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">notifyAll</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
-
-
-
- <a href="http://developer.android.com/reference/java/lang/String.html">String</a></nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">toString</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>()</nobr>
-
- </td></tr>
-
-
-
- <tr class=" api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>(long arg0, int arg1)</nobr>
-
- </td></tr>
-
-
-
- <tr class="alt-color api apilevel-" >
- <td class="jd-typecol"><nobr>
-
-
- final
-
-
- void</nobr>
- </td>
- <td class="jd-linkcol" width="100%"><nobr>
- <span class="sympad">wait</span>(long arg0)</nobr>
-
- </td></tr>
-
-
-</table>
- </div>
-</div>
-</td></tr>
-
-
-</table>
-
-
-</div><!-- jd-descr (summary) -->
-
-<!-- Details -->
-
-
-
-
-
-
-
-
-<!-- XML Attributes -->
-
-
-<!-- Enum Values -->
-
-
-<!-- Constants -->
-
-
-<!-- ========= ENUM CONSTANTS DETAIL ======== -->
-<h2>Constants</h2>
-
-
-
-
-<A NAME="GROUP_ORDER_DEFAULT"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
- final
- int
- </span>
- GROUP_ORDER_DEFAULT
- </h4>
- <div class="api-level">
-
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Default value for the group sort order.
-</p></div>
-
-
- <div class="jd-tagdata">
- <span class="jd-tagtitle">Constant Value: </span>
- <span>
-
- 0
- (0x00000000)
-
- </span>
- </div>
-
- </div>
-</div>
-
-
-
-<A NAME="GROUP_ORDER_SUMMARY"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
- final
- int
- </span>
- GROUP_ORDER_SUMMARY
- </h4>
- <div class="api-level">
-
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Sentinel value provided to the <code>groupOrder</code> parameter of the
- <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#setGroup(android.app.Notification, java.lang.String, int)">setGroup(android.app.Notification, java.lang.String, int)</a></code>
- method. This value indicates that this index of the
- notification group is the summary of the group.
-</p></div>
-
-
- <div class="jd-tagdata">
- <span class="jd-tagtitle">Constant Value: </span>
- <span>
-
- -1
- (0xffffffff)
-
- </span>
- </div>
-
- </div>
-</div>
-
-
-
-
-<!-- Fields -->
-
-
-<!-- Public ctors -->
-
-
-
-<!-- ========= CONSTRUCTOR DETAIL ======== -->
-<!-- Protected ctors -->
-
-
-
-<!-- ========= METHOD DETAIL ======== -->
-<!-- Public methdos -->
-
-<h2>Public Methods</h2>
-
-
-
-<A NAME="getAction(android.app.Notification, int)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a>
- </span>
- <span class="sympad">getAction</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, int actionIndex)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Get a <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></code> wrapper for the notification at <code>actionIndex</code>
- in the <code><a href="http://developer.android.com/reference/android/app/Notification.html#actions">actions</a></code> array.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to inspect</td>
- </tr>
- <tr>
- <th>actionIndex</td>
- <td>the index of the desired action
-</td>
- </tr>
- </table>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="getActionCount(android.app.Notification)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- int
- </span>
- <span class="sympad">getActionCount</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Get the number of actions present on this notification.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to inspect</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>the number of actions for this notification
-</li></ul>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">See Also</h5>
- <ul class="nolist"><li><code><a href="/http://developer.android.com/reference/android/app/Notification.html#actions">actions</a></code></li>
- </ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="getBigActionIcon(android.app.Notification)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- int
- </span>
- <span class="sympad">getBigActionIcon</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Get the big action icon to be displayed with this notification. Big actions show
- a hint to users about the action taken when the content intent is triggered.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to inspect</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>the icon or <code>0</code> if it wasn't set</li></ul>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">See Also</h5>
- <ul class="nolist"><li><code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#setBigActionIcon(android.app.Notification, int)">setBigActionIcon(Notification, int)</a></code></li>
- </ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="getBigActionSubtext(android.app.Notification)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- <a href="http://developer.android.com/reference/java/lang/CharSequence.html">CharSequence</a>
- </span>
- <span class="sympad">getBigActionSubtext</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Get the big action icon subtext to be shown with a big action icon.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to inspect</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>the subtext of the big action icon or <code>null</code> if it wasn't exist.</li></ul>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">See Also</h5>
- <ul class="nolist"><li><code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#setBigActionIcon(android.app.Notification, int)">setBigActionIcon(Notification, int)</a></code></li>
- </ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="getContentIntentRemoteInputs(android.app.Notification)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- <a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput[]</a>
- </span>
- <span class="sympad">getContentIntentRemoteInputs</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Gets the <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code> objects associated with the content intent.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to inspect</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>array of RemoteInput objects or <code>null</code> if it doesn't exist
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="getExtras(android.app.Notification)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- <a href="http://developer.android.com/reference/android/os/Bundle.html">Bundle</a>
- </span>
- <span class="sympad">getExtras</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Gets the <code><a href="http://developer.android.com/reference/android/app/Notification.html#extras">extras</a></code> field from a notification in a backward-compatible
- manner. Extras field was supported from JellyBean (API level 16)
- forwards. This function will return null on older API levels.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to inspect</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>the extras associated with this notification.
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="getGroupKey(android.app.Notification)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- <a href="http://developer.android.com/reference/java/lang/String.html">String</a>
- </span>
- <span class="sympad">getGroupKey</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Get the key used to group this notification into a cluster or stack
- with other notifications. This key is unique within a package.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to inspect
-</td>
- </tr>
- </table>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="getGroupOrder(android.app.Notification)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- int
- </span>
- <span class="sympad">getGroupOrder</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Get the sort order of this notification within a group of notifications
- with the same group key set. Group orders are 0-indexed integers that are used
- to sort notifications in ascending order. Can also be the sentinel value
- <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#GROUP_ORDER_SUMMARY">GROUP_ORDER_SUMMARY</a></code> if this is the summary notification for a group.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to inspect</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>the sort order of this notification within this group
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="getHintHideIcon(android.app.Notification)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- boolean
- </span>
- <span class="sympad">getHintHideIcon</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Get a hint that this notification's icon should not be displayed.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to inspect</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li><code>true</code> if this icon should not be displayed, false otherwise.
- The default value is <code>false</code> if this was never set.
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="getLocalOnly(android.app.Notification)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- boolean
- </span>
- <span class="sympad">getLocalOnly</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Get whether or not this notification is only relevant to the current device.
-
- <p>Some notifications can be bridged to other devices for remote display.
- If this hint is set, it is recommended that this notification not be bridged.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to inspect</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li><code>true</code> if this notification is local only, <code>false</code> otherwise.
- Default value is <code>false</code> if not set.
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="getPages(android.app.Notification)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- <a href="http://developer.android.com/reference/android/app/Notification.html">Notification[]</a>
- </span>
- <span class="sympad">getPages</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Get the array of additional pages of content for displaying this notification. The
- current notification forms the first page, and elements within this array form
- subsequent pages. This field can be used to separate a notification into multiple
- sections.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to inspect</td>
- </tr>
- </table>
- </div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Returns</h5>
- <ul class="nolist"><li>the pages for this notification
-</li></ul>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setBigActionIcon(android.app.Notification, int)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- void
- </span>
- <span class="sympad">setBigActionIcon</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, int icon)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Add a big action display to this notification. Big actions show a hint to users
- about the action taken when the content intent is triggered.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to modify</td>
- </tr>
- <tr>
- <th>icon</td>
- <td>icon to display for the content action.
-</td>
- </tr>
- </table>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setBigActionIcon(android.app.Notification, int, java.lang.CharSequence)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- void
- </span>
- <span class="sympad">setBigActionIcon</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, int icon, <a href="http://developer.android.com/reference/java/lang/CharSequence.html">CharSequence</a> subtext)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Add a big action display to this notification. Big actions show a hint to users
- about the action taken when the content intent is triggered.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to modify</td>
- </tr>
- <tr>
- <th>icon</td>
- <td>icon to display for the content action.</td>
- </tr>
- <tr>
- <th>subtext</td>
- <td>Optional subtext to display with the big action icon.
-</td>
- </tr>
- </table>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setContentIntentRemoteInputs(android.app.Notification, android.preview.support.wearable.notifications.RemoteInput[])"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- void
- </span>
- <span class="sympad">setContentIntentRemoteInputs</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, <a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput[]</a> inputs)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Sets <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code>s to be collected when the user triggers the
- <code>contentIntent</code>. These function just as if they were attached to
- an <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.Action.html">WearableNotifications.Action</a></code>.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to modify</td>
- </tr>
- <tr>
- <th>inputs</td>
- <td>array of <code><a href="/reference/android/preview/support/wearable/notifications/RemoteInput.html">RemoteInput</a></code> objects desired from the user.
-</td>
- </tr>
- </table>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setGroup(android.app.Notification, java.lang.String)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- void
- </span>
- <span class="sympad">setGroup</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, <a href="http://developer.android.com/reference/java/lang/String.html">String</a> groupKey)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Set this notification to be part of a group of notifications sharing the same key.
- Grouped notifications may display in a cluster or stack on devices which
- support such rendering. Use the default ordering within a group.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to modify</td>
- </tr>
- <tr>
- <th>groupKey</td>
- <td>The group key of the group. Unique within a package.
-</td>
- </tr>
- </table>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setGroup(android.app.Notification, java.lang.String, int)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- void
- </span>
- <span class="sympad">setGroup</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, <a href="http://developer.android.com/reference/java/lang/String.html">String</a> groupKey, int groupOrder)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Set this notification to be part of a group of notifications sharing the same key.
- Grouped notifications may display in a cluster or stack on devices which
- support such rendering.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to modify</td>
- </tr>
- <tr>
- <th>groupKey</td>
- <td>The group key of the group. Unique within a package.</td>
- </tr>
- <tr>
- <th>groupOrder</td>
- <td>The 0-indexed sort order within the group. Can also be set
- to the sentinel value <code><a href="/reference/android/preview/support/wearable/notifications/WearableNotifications.html#GROUP_ORDER_SUMMARY">GROUP_ORDER_SUMMARY</a></code> to mark this
- notification as being the group summary.
-</td>
- </tr>
- </table>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setHintHideIcon(android.app.Notification, boolean)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- void
- </span>
- <span class="sympad">setHintHideIcon</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, boolean hintHideIcon)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Set a hint that this notification's icon should not be displayed.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to modify</td>
- </tr>
- <tr>
- <th>hintHideIcon</td>
- <td><code>true</code> to hide this icon, <code>false</code> otherwise.
-</td>
- </tr>
- </table>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setLocalOnly(android.app.Notification, boolean)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- void
- </span>
- <span class="sympad">setLocalOnly</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, boolean localOnly)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Set whether or not this notification is only relevant to the current device.
-
- <p>Some notifications can be bridged to other devices for remote display.
- This hint can be set to recommend this notification not be bridged.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to modify</td>
- </tr>
- <tr>
- <th>localOnly</td>
- <td>set to <code>true</code> to keep the notification on this device only,
- <code>false</code> otherwise.
-</td>
- </tr>
- </table>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setMinPriority(android.app.Notification)"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- void
- </span>
- <span class="sympad">setMinPriority</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Set the priority of this notification to be minimum priority level
- (<code><a href="http://developer.android.com/reference/android/app/Notification.html#PRIORITY_MIN">PRIORITY_MIN</a></code>). When set via WearableNotifications, these
- minimum priority notifications will bypass the notification manager on platforms
- that do not support ambient level notifications.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to modify
-</td>
- </tr>
- </table>
- </div>
-
- </div>
-</div>
-
-
-<A NAME="setPages(android.app.Notification, android.app.Notification[])"></A>
-
-<div class="jd-details api apilevel-">
- <h4 class="jd-details-title">
- <span class="normal">
- public
- static
-
-
-
- void
- </span>
- <span class="sympad">setPages</span>
- <span class="normal">(<a href="http://developer.android.com/reference/android/app/Notification.html">Notification</a> notif, <a href="http://developer.android.com/reference/android/app/Notification.html">Notification[]</a> pages)</span>
- </h4>
- <div class="api-level">
- <div></div>
-
-
-
- </div>
- <div class="jd-details-descr">
-
- <div class="jd-tagdata jd-tagdescr"><p>Set additional pages of content to display with this notification. The current
- notification forms the first page, and pages set using this function form
- subsequent pages. This field can be used to separate a notification into multiple
- sections.</p></div>
- <div class="jd-tagdata">
- <h5 class="jd-tagtitle">Parameters</h5>
- <table class="jd-tagtable">
- <tr>
- <th>notif</td>
- <td>the notification to modify</td>
- </tr>
- <tr>
- <th>pages</td>
- <td>the pages to add to the current notification. Replaces any
- existing pages with this value.
-</td>
- </tr>
- </table>
- </div>
-
- </div>
-</div>
-
-
-
-
-
-<!-- ========= METHOD DETAIL ======== -->
-
-
-
-<!-- ========= END OF CLASS DATA ========= -->
-<A NAME="navbar_top"></A>
-
-<div id="footer" class="wrap" >
-
-
- <div id="copyright">
-
- Except as noted, this content is licensed under <a
- href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>.
- For details and restrictions, see the <a href="/license.html">
- Content License</a>.
- </div>
- <div id="build_info">
-
- Android r —
-<script src="/timestamp.js" type="text/javascript"></script>
-<script>document.write(BUILD_TIMESTAMP)</script>
-
- </div>
-
-
- <div id="footerlinks">
-
- <p>
- <a href="/about/index.html">About Android</a> |
- <a href="/legal.html">Legal</a> |
- <a href="/support.html">Support</a>
- </p>
- </div>
-
-</div> <!-- end footer -->
-</div> <!-- jd-content -->
-
-</div><!-- end doc-content -->
-
-</div> <!-- end body-content -->
-
-
-
-
-
-
-</body>
-</html>
diff --git a/docs/html/sdk/index.jd b/docs/html/sdk/index.jd
index e6ea11b..c85df43 100644
--- a/docs/html/sdk/index.jd
+++ b/docs/html/sdk/index.jd
@@ -16,7 +16,7 @@
studio.win_bundle_exe_download=android-studio-bundle-135.1641136.exe
studio.win_bundle_exe_bytes=868344232
-studio.win_bundle_exe_checksum=1931dbaeadb52f5e0a8ba6e2ae60d9df20b2076b
+studio.win_bundle_exe_checksum=9c1c8ea6aa17fb74e0593c62fd48ee62a8950be7
studio.win_notools_exe_download=android-studio-ide-135.1641136.exe
studio.win_notools_exe_bytes=260272840
@@ -448,7 +448,7 @@
<ul>
<li>Microsoft® Windows® 8/7/Vista/2003 (32 or 64-bit)</li>
<li>2 GB RAM minimum, 4 GB RAM recommended</li>
-<li>400 MB hard disk space + at least 1 G for Android SDK, emulator system images, and caches</li>
+<li>400 MB hard disk space + at least 1 GB for Android SDK, emulator system images, and caches</li>
<li>1280 x 800 minimum screen resolution</li>
<li>Java Development Kit (JDK) 7 </li>
<li>Optional for accelerated emulator: Intel® processor with support for Intel® VT-x, Intel® EM64T
@@ -487,7 +487,7 @@
<li>Oracle® Java Development Kit (JDK) 7 </li>
</ul>
<p>Tested on Ubuntu® 12.04, Precise Pangolin (64-bit distribution capable of running
-32-bit applications.</p>
+32-bit applications).</p>
diff --git a/docs/html/sdk/installing/create-project.jd b/docs/html/sdk/installing/create-project.jd
index a7c12d4..5082537 100644
--- a/docs/html/sdk/installing/create-project.jd
+++ b/docs/html/sdk/installing/create-project.jd
@@ -1,14 +1,58 @@
-page.title=Creating a Project
+page.title=Managing Projects from Android Studio
@jd:body
+ <div id="qv-wrapper">
+ <div id="qv">
+ <h2>In this document</h2>
+
+ <ol>
+ <li><a href="#CreatingAProject">Creating an Android Project</a></li>
+ <ol>
+ <li><a href="#Step1CreatingAProject">Create a New Project</a> </li>
+ <li><a href="#Step2SelectFormFactor">Select Form Factors and API Level</a> </li>
+ <li><a href="#Step3AddActivity">Add an Activity</a> </li>
+ <li><a href="#Step4ConfigureActivity">Configure Your App</a> </li>
+ <li><a href="#Step5DevelopYourApp">Develop Your App</a> </li>
+ </ol>
+
+ <li><a href="#CreatingAModule">Creating an Android Module</a></li>
+
+ <li><a href="#SettingUpLibraryModule">Setting up a Library Module</a></li>
+
+ <li><a href="#ReferencingLibraryModule">Referencing a Library Module</a></li>
+
+ <li><a href="#ReferencingAppEngModule">Setting up an App Eng Module</a></li>
+
+ <li><a href="#ProjectView">Using the Android Project View</a></li>
+
+ </ol>
+
+ </div>
+ </div>
+
+
+<p>Android Studio provides graphical tools for creating and managing Android projects, which
+contain everything that define your Android apps, from app source code to build configurations and
+test code. Each project contains one or more different types of modules, such as
+ application modules, library modules, and test modules.</p>
+
+<p>This guide explains how to create Android projects and different modules using
+<a href="{@docRoot}tools/studio/index.html">Android Studio</a>.
+For more information about the Android project structure and module types, read <a href=
+"{@docRoot}tools/projects/index.html">Managing Projects Overview</a>.</p>
+
+
+
+<h2 id="CreatingAProject">Creating an Android Project</h2>
+
<p>Android Studio makes it easy to create Android apps for several form factors, such as phone,
tablet, TV, Wear, and Google Glass. The <em>New Project</em> wizard lets you choose the form factors
for your app and populates the project structure with everything you need to get started.</p>
<p>Follow the steps in this section to create a project in Android Studio.</p>
-<h2>Step 1: Create a New Project</h2>
+<h3 id="Step1CreatingAProject">Step 1: Create a New Project</h2>
<p>If you didn't have a project opened, Android Studio shows the Welcome screen.
To create a new project, click <strong>New Project</strong>.</p>
@@ -22,20 +66,20 @@
<img src="{@docRoot}images/tools/wizard2.png" alt="" width="500" height="381">
<p class="img-caption"><strong>Figure 1.</strong> Choose a name for your project.</p>
-<p>Enter the values for your project and click <strong>Next</strong>.</p>
+<p>Enter the values for your project then click <strong>Next</strong>.</p>
-
-<h2>Step 2: Select Form Factors and API Level</h2>
+<h3 id="Step2SelectFormFactor">Step 2: Select Form Factors and API Level</h2>
<p>The next window lets you select the form factors supported by your app, such as phone, tablet,
-TV, Wear, and Google Glass. For each form factor, you can also select the API
-Level that your app requires. To get more information, click <strong>Help me choose</strong>.</p>
+TV, Wear, and Google Glass. The selected form factors become the application modules witin the
+project. For each form factor, you can also select the API Level for that app. To get more information,
+click <strong>Help me choose</strong>.</p>
<img src="{@docRoot}images/tools/wizard4.png" alt="" width="750" height="510">
<p class="img-caption"><strong>Figure 2.</strong> Select the API Level.</p>
<p>The API Level window shows the distribution of mobile devices running each version of Android,
-as shown in Figure 2. Click on an API level to see a list of features introduced in the corresponding
+as shown in figure 3. Click on an API level to see a list of features introduced in the corresponding
version of Android. This helps you choose the minimum API Level that has all the features that
your apps needs, so you can reach as many devices as possible. Then click <strong>OK</strong>.</p>
@@ -45,36 +89,39 @@
<p>Then, on the Form Factors Window, click <strong>Next</strong>.</p>
-<h2>Step 3: Add an Activity</h2>
+<h3 id="Step3AddActivity">Step 3: Add an Activity</h2>
-<p>The next screen lets you select an activity type to add to your app, as shown in Figure 4.
-This screen depends on the form factors you selected earlier.</p>
+<p>The next screen lets you select an activity type to add to your app, as shown in figure 4.
+This screen displays a different set of activities for each of the form factors you selected earlier.</p>
<img src="{@docRoot}images/tools/wizard5.png" alt="" width="720" height="504">
<p class="img-caption"><strong>Figure 4.</strong> Add an activity to your app.</p>
-<p>Choose an activity type and click <strong>Next</strong>.</p>
+<p>Choose an activity type then click <strong>Next</strong>.</p>
+
+ <p class="note"><strong>Note:</strong> If you choose "Add No Activity", click <strong>Finish</strong>
+ to create the project.</p>
-<h2>Step 4: Configure Your Activity</h2>
+<h3 id="Step4ConfigureActivity">Step 4: Configure Your Activity</h2>
-<p>The next screen lets you configure the activity to add to your app, as shown in Figure 6.</p>
+<p>The next screen lets you configure the activity to add to your app, as shown in figure 5.</p>
<img src="{@docRoot}images/tools/wizard6.png" alt="" width="450" height="385">
-<p class="img-caption"><strong>Figure 6.</strong> Choose a name for your activity.</p>
+<p class="img-caption"><strong>Figure 5.</strong> Choose a name for your activity.</p>
<p>Enter the activity name, the layout name, and the activity title. Then click
<strong>Finish</strong>.</p>
-<h2>Step 5: Develop Your App</h2>
+<h3 id="Step5DevelopYourApp">Step 5: Develop Your App</h2>
<p>Android Studio creates the default structure for your project and opens the development
-environment. If your app supports more than one form factor, Android Studio creates a module for
-each of them, as shown in Figure 7.</p>
+environment. If your app supports more than one form factor, Android Studio creates a module folder
+with complete source files for each of them as shown in figure 6.</p>
<img src="{@docRoot}images/tools/wizard7.png" alt="" width="750" height="509">
-<p class="img-caption"><strong>Figure 7.</strong> The default project structure for a mobile app.</p>
+<p class="img-caption"><strong>Figure 6.</strong> The default project structure for a mobile app.</p>
<p>Now you are ready to develop your app. For more information, see the following links:</p>
@@ -84,3 +131,268 @@
<li><a href="{@docRoot}tv/">Android TV</a></li>
<li><a href="https://developers.google.com/glass/">Google Glass</a></li>
</ul>
+
+
+ <h2 id="CreatingAModule">Creating an Android Module</h2>
+
+ <p>Android application modules contain the <code>src/main/</code>, <code>AndroidManifest.xml</code>,
+ <code>build.gradle</code>, build output and other files you need to generate your app's APK files.
+ Android Studio provides a <em>New Module Wizard</em> that you can use to quickly create a new
+ Android module (or a module from existing code) based on selected application settings, such as
+ minimum SDK level and activity template.</p>
+
+ <p>To create a new module, select <strong>File</strong> > <strong>New</strong> >
+ <strong>Module</strong>. Select the desire module type then click Next to enter the basic module
+ settings:</p>
+
+ <ul>
+ <li>Enter an <strong>Application Name</strong>. This name is used as the title of your
+ application launcher icon when it is installed on a device.</li>
+
+ <li>Enter a <strong>Module Name</strong>. This text is used as the name of the folder where
+ your Java-based activity files are stored.</li>
+
+ <li>Enter a <strong>Package Name</strong> and <strong>Package Location</strong>. This class
+ package namespace creates the initial
+ package structure for your applications code files and is added as the
+ <a href="{@docRoot}guide/topics/manifest/manifest-element.html#package">{@code package}</a>
+ attribute in your application's
+ <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">Android manifest file</a>.
+ This manifest value serves as the unique identifier for your application app when you
+ distribute it to users. The package name must follow the same rules as packages in the Java
+ programming language.</li>
+
+ <li>Select the <strong>Minimum required SDK</strong>.
+ This setting indicates the lowest version of the Android platform that your application
+ supports for the selected form factor. This value sets the
+ <code>minSdkVersion</code> attribute in the build.gradle file.</li>
+
+ <p class="note"><strong>Note:</strong> You can manually change the minimum and target SDK
+ for your module at any time: Double-click the module's build.gradle in the Project Explorer,
+ set the <strong>targetSdkVersion</strong> and <em>targetSdkVersion</em> in the
+ <em>defaultConfig</em> section.</p>
+
+
+ <li>Select a <strong>Target SDK</strong>. This setting indicates the highest version of
+ Android with which you have tested with your application and sets the
+ <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
+ targetSdkVersion}</a> attribute in your application's' build.gradle file.
+
+
+ <li>Select a <strong>Compile With</strong> API version. This setting specifies what version
+ of the SDK to compile your project against. We strongly recommend using the most recent
+ version of the API.</li>
+
+ <li>Select a <strong>Language Level</strong> API version. This setting specifies what version
+ of the SDK to compile your project against. We strongly recommend using the most recent
+ version of the API.</li>
+
+ <li>Select a <strong>Theme</strong>. This setting specifies which standard Android
+ <a href="{@docRoot}design/style/themes.html">visual style</a> is applied to your
+ application. Select activity template. For more information about Android code templates, see
+ <a href="{@docRoot}tools/projects/templates.html">Using Code Templates</a>Leave the <strong>
+ Create activity</strong> option checked so you can start your
+ application with some essential components. </li>
+
+ <li>Click the check box for the required Support Libraries then click <strong>Next</strong>.</li>
+
+ <li>In the <strong>Configure Launcher Icon</strong> page, create an icon and options, then click
+ <strong>Next</strong>.</li>
+
+ <li>In the <strong>Create Activity</strong> page, select activity template then click
+ <strong>Next</strong>. For more information about Android code templates, see
+ <a href="{@docRoot}tools/projects/templates.html">Using Code Templates</a>.
+ </li>
+
+ <li>Review the new module settings then click <strong>Finish</strong>.</li>
+
+ </ul>
+
+ <p>The wizard creates a new Android application module according to the options you have chosen.</p>
+
+
+
+ <h2 id="SettingUpLibraryModule">Setting up a Library Module</h2>
+
+ <p>A library module is a standard Android module, so you can create a new one in the same way
+ as you would a new application module, using the New Module wizard and selecting <em>Android
+ Library</em> as the module type. The created library module will appear in your project view
+ along with the other modules. </p>
+
+ <p> You can easily change an existing application module to a library module by changing the
+ plugin assignment in the <strong>build.gradle</strong> file to <em>com.android.libary</em>.</p>
+
+<pre>
+apply plugin: 'com.android.application'
+
+android {...}
+</pre>
+
+<pre>
+apply plugin: 'com.android.library'
+
+android {...}
+</pre>
+
+
+ <h3>Adding a dependency on a library module</h3>
+
+ <p>The library dependency can be declared in the module's manifest file or in the
+ <strong<build.gradle</strong> file. </p>
+
+ <p>A library modules's manifest file must declare all of the shared components that it includes,
+ just as would a standard Android application. For more information, see the documentation for
+ <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">AndroidManifest.xml</a>.</p>
+
+ <p>For example, the <a href=
+ "{@docRoot}resources/samples/TicTacToeLib/AndroidManifest.html">TicTacToeLib</a> example library
+ project declares the activity <code>GameActivity</code>:</p>
+ <pre>
+<manifest>
+ ...
+ <application>
+ ...
+ <activity android:name="GameActivity" />
+ ...
+ </application>
+</manifest>
+</pre>
+
+
+<p>To add the dependency declaration to the build file, edit the build file for the <code>app</code>
+module (<code>app/build.gradle</code>) and add a dependency on the <code>lib</code> module:</p>
+
+<pre>
+...
+dependencies {
+ ...
+ compile project(":lib")
+}
+</pre>
+
+<p>In this example, the <code>lib</code> module can still be built and tested independently, and
+the build system creates an AAR package for it that you could reuse in other projects.</p>
+
+<p class="note"><strong>Note:</strong> The library settings in the <code>app/build.gradle</code>
+file will override any shared library resources declared in the manifest file.</p>
+
+
+ <h2 id="ReferencingLibraryModule">Referencing a library module</h2>
+
+ <p>If you are developing an application and want to include the shared code or resources from a
+ library module, you can also do so easily by adding a reference to the library module in the
+ module's dependency page.</p>
+
+ <p>To add a reference to a library module, follow these steps:</p>
+
+ <ol>
+ <li>Make sure that both the module library and the application module that depends on it are
+ in your proejct. If one of the modules is missing, import it into your project.</li>
+
+ <li>In the project view, right-click the dependent module and select
+ <strong>Open</strong> > <strong>Module Settings</strong>.</li>
+
+ <li>Right-click the plus icon to add a new dependencies.
+ <p>If you are adding references to multiple libraries, you can set their relative
+ priority (and merge order) by selecting a library and using the <strong>Up</strong> and
+ <strong>Down</strong> controls. The tools merge the referenced libraries with your application
+ starting from lowest priority (bottom of the list) to highest (top of the list). If more than one
+ library defines the same resource ID, the tools select the resource from the library with higher
+ priority. The application itself has highest priority and its resources are always used in
+ preference to identical resource IDs defined in libraries.</p>
+ </li>
+
+ <li>Use the <strong>Scope</strong> drop-down to select how the dependency will be applied.</li>
+
+ <li>Click <strong>Apply</strong> to create the dependency and <strong>OK</strong> to close the
+ <strong>Project Structure</strong> window.</li>
+ </ol>
+
+ <p>Android Studio rebuilds the module, including the contents of the library module the next time
+ the project or module is built.</p>
+
+
+
+ <h3>Declaring library components in the manifest file</h3>
+
+ <p>In the manifest file of the application module, you must add declarations of all components
+ that the application will use that are imported from a library module. For example, you must
+ declare any <code><activity></code>, <code><service></code>,
+ <code><receiver></code>, <code><provider></code>, and so on, as well as
+ <code><permission></code>, <code><uses-library></code>, and similar elements.</p>
+
+ <p>Declarations should reference the library components by their fully-qualified package names,
+ where appropriate.</p>
+
+ <p>For example, the <a href=
+ "{@docRoot}resources/samples/TicTacToeMain/AndroidManifest.html">TicTacToeMain</a> example
+ application declares the library activity <code>GameActivity</code> like this:</p>
+ <pre>
+<manifest>
+ ...
+ <application>
+ ...
+ <activity android:name="com.example.android.tictactoe.library.GameActivity" />
+ ...
+ </application>
+</manifest>
+</pre>
+
+ <p>For more information about the manifest file, see the documentation for <a href=
+ "{@docRoot}guide/topics/manifest/manifest-intro.html">AndroidManifest.xml</a>.</p>
+
+
+ <h2 id="ProjectView">Using the Android Project View</h2>
+
+
+<p>The Android project view in Android Studio shows a flattened version of your project's structure
+that provides quick access to the key source files of Android projects and helps you work with
+the new <a href="{@docRoot}sdk/installing/studio-build.html">Gradle-based build system</a>. The
+Android project view:</p>
+
+<ul>
+<li>Groups the build files for all modules at the top level of the project hierarchy.</li>
+<li>Shows the most important source directories at the top level of the module hierarchy.</li>
+<li>Groups all the manifest files for each module.</li>
+<li>Shows resource files from all Gradle source sets.</li>
+<li>Groups resource files for different locales, orientations, and screen types in a single group
+per resource type.</li>
+</ul>
+
+<div style="float:right;margin-left:30px;width:240px">
+<img src="{@docRoot}images/tools/projectview01.png" alt="" width="220" height="264"/>
+<p class="img-caption"><strong>Figure 9:</strong> Show the Android project view.</p>
+</div>
+
+
+<h2 id="enable-view">Enable and use the Android Project View</h2>
+
+<p>The Android project view is not yet enabled by default. To show the Android project view,
+click <strong>Project</strong> and select <strong>Android</strong>, as shown in figure 9.</p>
+
+<p>The Android project view shows all the build files at the top level of the project hierarchy
+under <strong>Gradle Scripts</strong>. Each project module appears as a folder at the top
+level of the project hierarchy and contains these three elements at the top level:</p>
+
+<ul>
+<li><code>java/</code> - Source files for the module.</li>
+<li><code>manifests/</code> - Manifest files for the module.</li>
+<li><code>res/</code> - Resource files for the module.</li>
+</ul>
+
+<p>Figure 10 shows how the Android project view groups all the instances of the
+<code>ic_launcher.png</code> resource for different screen densities under the same element.</p>
+
+<p class="note"><strong>Note:</strong> The Android project view shows a hierarchy that helps you
+work with Android projects by providing a flattened structure that highlights the most commonly
+used files while developing Android applications. However, the project structure on disk differs
+from this representation.</p>
+
+<img src="{@docRoot}images/tools/projectview03.png" alt=""
+ style="margin-top:10px" width="650" height="508"/>
+<p class="img-caption"><strong>Figure 10:</strong> The traditional project view (left) and the
+Android project view (right).</p>
+
+
+
+
diff --git a/docs/html/sdk/installing/studio-build.jd b/docs/html/sdk/installing/studio-build.jd
index 4fe9071..b68b176 100644
--- a/docs/html/sdk/installing/studio-build.jd
+++ b/docs/html/sdk/installing/studio-build.jd
@@ -98,7 +98,7 @@
<h3>Build output</h3>
<p>The build generates an APK for each build variant in the <code>app/build</code> folder:
-the <code>app/build/apk/</code> directory contains packages named
+the <code>app/build/outputs/apk/</code> directory contains packages named
<code>app-<flavor>-<buildtype>.apk</code>; for example, <code>app-full-release.apk</code> and
<code>app-demo-debug.apk</code>.</p>
diff --git a/docs/html/sdk/installing/studio-tips.jd b/docs/html/sdk/installing/studio-tips.jd
index 8a1d79e..c3edff6 100644
--- a/docs/html/sdk/installing/studio-tips.jd
+++ b/docs/html/sdk/installing/studio-tips.jd
@@ -83,14 +83,13 @@
<h3><em>Alt + Enter</em> key binding</h3>
<p>For quick fixes to coding errors, the IntelliJ powered IDE implements the <em>Alt + Enter</em>
key binding to fix errors (missing imports, variable assignments, missing references, etc) when
- possible, and if not, suggest the most probably solution. </p>
+ possible, and if not, suggest the most probable solution. </p>
<h3><em>Ctrl + D</em> key binding</h3>
<p>The <em>Ctrl + D</em> key binding is great for quickly duplicating code lines or fragments.
Simply select the desired line or fragment and enter this key binding. </p>
-
<h3>Navigate menu</h3>
<p>In case you're not familiar with an API class, file or symbol, the <em>Navigate</em> menu lets
you jump directly to the class of a method or field name without having to search through
@@ -157,12 +156,9 @@
<p class="note"><strong>Note:</strong> This section lists Android Studio keyboard shortcuts
for the default keymap. To change the default keymap on Windows and Linux, go to
-<strong>File</strong> > <strong>Settings</strong> > <strong>Keymap</strong>. To change
-the default keymap on Mac OS X, go to <strong>Android Studio</strong> >
-<strong>Preferences</strong> > <strong>Keymap</strong>.</p>
-
-<p class="note"><strong>Note:</strong> If you're using Mac OS X, update your keymap to use
-the Mac OS X 10.5+ version keymaps under <strong>Android Studio > Preferences > Keymap</strong>.</p>
+<strong>File</strong> > <strong>Settings</strong> > <strong>Keymap</strong>. If you're
+using Mac OS X, update your keymap to use the Mac OS X 10.5+ version keymaps under
+<strong>Android Studio > Preferences > Keymap</strong>.</p>
<p class="table-caption"><strong>Table 1.</strong> Programming key commands</p>
diff --git a/docs/html/tools/building/plugin-for-gradle.jd b/docs/html/tools/building/plugin-for-gradle.jd
index b479ed8..77cbfda 100644
--- a/docs/html/tools/building/plugin-for-gradle.jd
+++ b/docs/html/tools/building/plugin-for-gradle.jd
@@ -23,7 +23,7 @@
<h2>Download</h2>
<div class="download-box">
<a href="{@docRoot}shareables/sdk-tools/android-gradle-plugin-dsl.zip"
- class="button">Plugin Command Reference</a>
+ class="button">Plugin Language Reference</a>
<p class="filename">android-gradle-plugin-dsl.zip</p>
</div>
@@ -117,7 +117,7 @@
<em>repositories</em> and <em>dependencies</em>. This allows different projects to use different
Gradle versions. Supported repositories include JCenter, Maven Central, or Ivy. This example
declares that the build script uses the JCenter repository and a classpath dependency artifact
-that contains the Android plugin for Gradle version 0.14.4.
+that contains the Android plugin for Gradle version 1.0.1.
</p>
<p>
<pre>
@@ -126,7 +126,7 @@
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:0.14.4'
+ classpath 'com.android.tools.build:gradle:1.0.1'
// NOTE: Do not place your application dependencies here: they belong
// in the individual module build.gradle files
@@ -320,6 +320,9 @@
<p>You can run the shell scripts to build your project from the command line on your development
machine and on other machines where Android Studio is not installed.</p>
+<p class="caution"><strong>Caution:</strong> When you create a project, only use the Gradle wrapper
+scripts and JAR from a trusted source, such as those generated by Android Studio. /p>
+
<h2 id="buildVariants"> Build variants</h2>
diff --git a/docs/html/tools/projects/projects-studio.jd b/docs/html/tools/projects/projects-studio.jd
deleted file mode 100644
index 5082537..0000000
--- a/docs/html/tools/projects/projects-studio.jd
+++ /dev/null
@@ -1,398 +0,0 @@
-page.title=Managing Projects from Android Studio
-
-@jd:body
-
- <div id="qv-wrapper">
- <div id="qv">
- <h2>In this document</h2>
-
- <ol>
- <li><a href="#CreatingAProject">Creating an Android Project</a></li>
- <ol>
- <li><a href="#Step1CreatingAProject">Create a New Project</a> </li>
- <li><a href="#Step2SelectFormFactor">Select Form Factors and API Level</a> </li>
- <li><a href="#Step3AddActivity">Add an Activity</a> </li>
- <li><a href="#Step4ConfigureActivity">Configure Your App</a> </li>
- <li><a href="#Step5DevelopYourApp">Develop Your App</a> </li>
- </ol>
-
- <li><a href="#CreatingAModule">Creating an Android Module</a></li>
-
- <li><a href="#SettingUpLibraryModule">Setting up a Library Module</a></li>
-
- <li><a href="#ReferencingLibraryModule">Referencing a Library Module</a></li>
-
- <li><a href="#ReferencingAppEngModule">Setting up an App Eng Module</a></li>
-
- <li><a href="#ProjectView">Using the Android Project View</a></li>
-
- </ol>
-
- </div>
- </div>
-
-
-<p>Android Studio provides graphical tools for creating and managing Android projects, which
-contain everything that define your Android apps, from app source code to build configurations and
-test code. Each project contains one or more different types of modules, such as
- application modules, library modules, and test modules.</p>
-
-<p>This guide explains how to create Android projects and different modules using
-<a href="{@docRoot}tools/studio/index.html">Android Studio</a>.
-For more information about the Android project structure and module types, read <a href=
-"{@docRoot}tools/projects/index.html">Managing Projects Overview</a>.</p>
-
-
-
-<h2 id="CreatingAProject">Creating an Android Project</h2>
-
-<p>Android Studio makes it easy to create Android apps for several form factors, such as phone,
-tablet, TV, Wear, and Google Glass. The <em>New Project</em> wizard lets you choose the form factors
-for your app and populates the project structure with everything you need to get started.</p>
-
-<p>Follow the steps in this section to create a project in Android Studio.</p>
-
-<h3 id="Step1CreatingAProject">Step 1: Create a New Project</h2>
-
-<p>If you didn't have a project opened, Android Studio shows the Welcome screen.
-To create a new project, click <strong>New Project</strong>.</p>
-
-<p>If you had a project opened, Android Studio shows the development environment.
-To create a new project, click <strong>File</strong> > <strong>New Project</strong>.</p>
-
-<p>The next window lets you configure the name of your app, the package name, and the location
-of your project.</p>
-
-<img src="{@docRoot}images/tools/wizard2.png" alt="" width="500" height="381">
-<p class="img-caption"><strong>Figure 1.</strong> Choose a name for your project.</p>
-
-<p>Enter the values for your project then click <strong>Next</strong>.</p>
-
-<h3 id="Step2SelectFormFactor">Step 2: Select Form Factors and API Level</h2>
-
-<p>The next window lets you select the form factors supported by your app, such as phone, tablet,
-TV, Wear, and Google Glass. The selected form factors become the application modules witin the
-project. For each form factor, you can also select the API Level for that app. To get more information,
-click <strong>Help me choose</strong>.</p>
-
-<img src="{@docRoot}images/tools/wizard4.png" alt="" width="750" height="510">
-<p class="img-caption"><strong>Figure 2.</strong> Select the API Level.</p>
-
-<p>The API Level window shows the distribution of mobile devices running each version of Android,
-as shown in figure 3. Click on an API level to see a list of features introduced in the corresponding
-version of Android. This helps you choose the minimum API Level that has all the features that
-your apps needs, so you can reach as many devices as possible. Then click <strong>OK</strong>.</p>
-
-<img src="{@docRoot}images/tools/wizard3.png" alt="" width="500" height="480">
-<p class="img-caption"><strong>Figure 3.</strong> Choose form factors for your app.</p>
-
-<p>Then, on the Form Factors Window, click <strong>Next</strong>.</p>
-
-
-<h3 id="Step3AddActivity">Step 3: Add an Activity</h2>
-
-<p>The next screen lets you select an activity type to add to your app, as shown in figure 4.
-This screen displays a different set of activities for each of the form factors you selected earlier.</p>
-
-<img src="{@docRoot}images/tools/wizard5.png" alt="" width="720" height="504">
-<p class="img-caption"><strong>Figure 4.</strong> Add an activity to your app.</p>
-
-<p>Choose an activity type then click <strong>Next</strong>.</p>
-
- <p class="note"><strong>Note:</strong> If you choose "Add No Activity", click <strong>Finish</strong>
- to create the project.</p>
-
-
-<h3 id="Step4ConfigureActivity">Step 4: Configure Your Activity</h2>
-
-<p>The next screen lets you configure the activity to add to your app, as shown in figure 5.</p>
-
-<img src="{@docRoot}images/tools/wizard6.png" alt="" width="450" height="385">
-<p class="img-caption"><strong>Figure 5.</strong> Choose a name for your activity.</p>
-
-<p>Enter the activity name, the layout name, and the activity title. Then click
-<strong>Finish</strong>.</p>
-
-
-<h3 id="Step5DevelopYourApp">Step 5: Develop Your App</h2>
-
-<p>Android Studio creates the default structure for your project and opens the development
-environment. If your app supports more than one form factor, Android Studio creates a module folder
-with complete source files for each of them as shown in figure 6.</p>
-
-<img src="{@docRoot}images/tools/wizard7.png" alt="" width="750" height="509">
-<p class="img-caption"><strong>Figure 6.</strong> The default project structure for a mobile app.</p>
-
-<p>Now you are ready to develop your app. For more information, see the following links:</p>
-
-<ul>
-<li><a href="{@docRoot}training/">Training Lessons</a></li>
-<li><a href="{@docRoot}training/building-wearables.html">Building Apps for Wearables</a></li>
-<li><a href="{@docRoot}tv/">Android TV</a></li>
-<li><a href="https://developers.google.com/glass/">Google Glass</a></li>
-</ul>
-
-
- <h2 id="CreatingAModule">Creating an Android Module</h2>
-
- <p>Android application modules contain the <code>src/main/</code>, <code>AndroidManifest.xml</code>,
- <code>build.gradle</code>, build output and other files you need to generate your app's APK files.
- Android Studio provides a <em>New Module Wizard</em> that you can use to quickly create a new
- Android module (or a module from existing code) based on selected application settings, such as
- minimum SDK level and activity template.</p>
-
- <p>To create a new module, select <strong>File</strong> > <strong>New</strong> >
- <strong>Module</strong>. Select the desire module type then click Next to enter the basic module
- settings:</p>
-
- <ul>
- <li>Enter an <strong>Application Name</strong>. This name is used as the title of your
- application launcher icon when it is installed on a device.</li>
-
- <li>Enter a <strong>Module Name</strong>. This text is used as the name of the folder where
- your Java-based activity files are stored.</li>
-
- <li>Enter a <strong>Package Name</strong> and <strong>Package Location</strong>. This class
- package namespace creates the initial
- package structure for your applications code files and is added as the
- <a href="{@docRoot}guide/topics/manifest/manifest-element.html#package">{@code package}</a>
- attribute in your application's
- <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">Android manifest file</a>.
- This manifest value serves as the unique identifier for your application app when you
- distribute it to users. The package name must follow the same rules as packages in the Java
- programming language.</li>
-
- <li>Select the <strong>Minimum required SDK</strong>.
- This setting indicates the lowest version of the Android platform that your application
- supports for the selected form factor. This value sets the
- <code>minSdkVersion</code> attribute in the build.gradle file.</li>
-
- <p class="note"><strong>Note:</strong> You can manually change the minimum and target SDK
- for your module at any time: Double-click the module's build.gradle in the Project Explorer,
- set the <strong>targetSdkVersion</strong> and <em>targetSdkVersion</em> in the
- <em>defaultConfig</em> section.</p>
-
-
- <li>Select a <strong>Target SDK</strong>. This setting indicates the highest version of
- Android with which you have tested with your application and sets the
- <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
- targetSdkVersion}</a> attribute in your application's' build.gradle file.
-
-
- <li>Select a <strong>Compile With</strong> API version. This setting specifies what version
- of the SDK to compile your project against. We strongly recommend using the most recent
- version of the API.</li>
-
- <li>Select a <strong>Language Level</strong> API version. This setting specifies what version
- of the SDK to compile your project against. We strongly recommend using the most recent
- version of the API.</li>
-
- <li>Select a <strong>Theme</strong>. This setting specifies which standard Android
- <a href="{@docRoot}design/style/themes.html">visual style</a> is applied to your
- application. Select activity template. For more information about Android code templates, see
- <a href="{@docRoot}tools/projects/templates.html">Using Code Templates</a>Leave the <strong>
- Create activity</strong> option checked so you can start your
- application with some essential components. </li>
-
- <li>Click the check box for the required Support Libraries then click <strong>Next</strong>.</li>
-
- <li>In the <strong>Configure Launcher Icon</strong> page, create an icon and options, then click
- <strong>Next</strong>.</li>
-
- <li>In the <strong>Create Activity</strong> page, select activity template then click
- <strong>Next</strong>. For more information about Android code templates, see
- <a href="{@docRoot}tools/projects/templates.html">Using Code Templates</a>.
- </li>
-
- <li>Review the new module settings then click <strong>Finish</strong>.</li>
-
- </ul>
-
- <p>The wizard creates a new Android application module according to the options you have chosen.</p>
-
-
-
- <h2 id="SettingUpLibraryModule">Setting up a Library Module</h2>
-
- <p>A library module is a standard Android module, so you can create a new one in the same way
- as you would a new application module, using the New Module wizard and selecting <em>Android
- Library</em> as the module type. The created library module will appear in your project view
- along with the other modules. </p>
-
- <p> You can easily change an existing application module to a library module by changing the
- plugin assignment in the <strong>build.gradle</strong> file to <em>com.android.libary</em>.</p>
-
-<pre>
-apply plugin: 'com.android.application'
-
-android {...}
-</pre>
-
-<pre>
-apply plugin: 'com.android.library'
-
-android {...}
-</pre>
-
-
- <h3>Adding a dependency on a library module</h3>
-
- <p>The library dependency can be declared in the module's manifest file or in the
- <strong<build.gradle</strong> file. </p>
-
- <p>A library modules's manifest file must declare all of the shared components that it includes,
- just as would a standard Android application. For more information, see the documentation for
- <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">AndroidManifest.xml</a>.</p>
-
- <p>For example, the <a href=
- "{@docRoot}resources/samples/TicTacToeLib/AndroidManifest.html">TicTacToeLib</a> example library
- project declares the activity <code>GameActivity</code>:</p>
- <pre>
-<manifest>
- ...
- <application>
- ...
- <activity android:name="GameActivity" />
- ...
- </application>
-</manifest>
-</pre>
-
-
-<p>To add the dependency declaration to the build file, edit the build file for the <code>app</code>
-module (<code>app/build.gradle</code>) and add a dependency on the <code>lib</code> module:</p>
-
-<pre>
-...
-dependencies {
- ...
- compile project(":lib")
-}
-</pre>
-
-<p>In this example, the <code>lib</code> module can still be built and tested independently, and
-the build system creates an AAR package for it that you could reuse in other projects.</p>
-
-<p class="note"><strong>Note:</strong> The library settings in the <code>app/build.gradle</code>
-file will override any shared library resources declared in the manifest file.</p>
-
-
- <h2 id="ReferencingLibraryModule">Referencing a library module</h2>
-
- <p>If you are developing an application and want to include the shared code or resources from a
- library module, you can also do so easily by adding a reference to the library module in the
- module's dependency page.</p>
-
- <p>To add a reference to a library module, follow these steps:</p>
-
- <ol>
- <li>Make sure that both the module library and the application module that depends on it are
- in your proejct. If one of the modules is missing, import it into your project.</li>
-
- <li>In the project view, right-click the dependent module and select
- <strong>Open</strong> > <strong>Module Settings</strong>.</li>
-
- <li>Right-click the plus icon to add a new dependencies.
- <p>If you are adding references to multiple libraries, you can set their relative
- priority (and merge order) by selecting a library and using the <strong>Up</strong> and
- <strong>Down</strong> controls. The tools merge the referenced libraries with your application
- starting from lowest priority (bottom of the list) to highest (top of the list). If more than one
- library defines the same resource ID, the tools select the resource from the library with higher
- priority. The application itself has highest priority and its resources are always used in
- preference to identical resource IDs defined in libraries.</p>
- </li>
-
- <li>Use the <strong>Scope</strong> drop-down to select how the dependency will be applied.</li>
-
- <li>Click <strong>Apply</strong> to create the dependency and <strong>OK</strong> to close the
- <strong>Project Structure</strong> window.</li>
- </ol>
-
- <p>Android Studio rebuilds the module, including the contents of the library module the next time
- the project or module is built.</p>
-
-
-
- <h3>Declaring library components in the manifest file</h3>
-
- <p>In the manifest file of the application module, you must add declarations of all components
- that the application will use that are imported from a library module. For example, you must
- declare any <code><activity></code>, <code><service></code>,
- <code><receiver></code>, <code><provider></code>, and so on, as well as
- <code><permission></code>, <code><uses-library></code>, and similar elements.</p>
-
- <p>Declarations should reference the library components by their fully-qualified package names,
- where appropriate.</p>
-
- <p>For example, the <a href=
- "{@docRoot}resources/samples/TicTacToeMain/AndroidManifest.html">TicTacToeMain</a> example
- application declares the library activity <code>GameActivity</code> like this:</p>
- <pre>
-<manifest>
- ...
- <application>
- ...
- <activity android:name="com.example.android.tictactoe.library.GameActivity" />
- ...
- </application>
-</manifest>
-</pre>
-
- <p>For more information about the manifest file, see the documentation for <a href=
- "{@docRoot}guide/topics/manifest/manifest-intro.html">AndroidManifest.xml</a>.</p>
-
-
- <h2 id="ProjectView">Using the Android Project View</h2>
-
-
-<p>The Android project view in Android Studio shows a flattened version of your project's structure
-that provides quick access to the key source files of Android projects and helps you work with
-the new <a href="{@docRoot}sdk/installing/studio-build.html">Gradle-based build system</a>. The
-Android project view:</p>
-
-<ul>
-<li>Groups the build files for all modules at the top level of the project hierarchy.</li>
-<li>Shows the most important source directories at the top level of the module hierarchy.</li>
-<li>Groups all the manifest files for each module.</li>
-<li>Shows resource files from all Gradle source sets.</li>
-<li>Groups resource files for different locales, orientations, and screen types in a single group
-per resource type.</li>
-</ul>
-
-<div style="float:right;margin-left:30px;width:240px">
-<img src="{@docRoot}images/tools/projectview01.png" alt="" width="220" height="264"/>
-<p class="img-caption"><strong>Figure 9:</strong> Show the Android project view.</p>
-</div>
-
-
-<h2 id="enable-view">Enable and use the Android Project View</h2>
-
-<p>The Android project view is not yet enabled by default. To show the Android project view,
-click <strong>Project</strong> and select <strong>Android</strong>, as shown in figure 9.</p>
-
-<p>The Android project view shows all the build files at the top level of the project hierarchy
-under <strong>Gradle Scripts</strong>. Each project module appears as a folder at the top
-level of the project hierarchy and contains these three elements at the top level:</p>
-
-<ul>
-<li><code>java/</code> - Source files for the module.</li>
-<li><code>manifests/</code> - Manifest files for the module.</li>
-<li><code>res/</code> - Resource files for the module.</li>
-</ul>
-
-<p>Figure 10 shows how the Android project view groups all the instances of the
-<code>ic_launcher.png</code> resource for different screen densities under the same element.</p>
-
-<p class="note"><strong>Note:</strong> The Android project view shows a hierarchy that helps you
-work with Android projects by providing a flattened structure that highlights the most commonly
-used files while developing Android applications. However, the project structure on disk differs
-from this representation.</p>
-
-<img src="{@docRoot}images/tools/projectview03.png" alt=""
- style="margin-top:10px" width="650" height="508"/>
-<p class="img-caption"><strong>Figure 10:</strong> The traditional project view (left) and the
-Android project view (right).</p>
-
-
-
-
diff --git a/docs/html/tools/studio/index.jd b/docs/html/tools/studio/index.jd
index 19309c4..9ee2f9a 100644
--- a/docs/html/tools/studio/index.jd
+++ b/docs/html/tools/studio/index.jd
@@ -211,7 +211,7 @@
<strong>package="com.example.app"</strong>>
</pre>
-<p class="note"><strong>Note:</strong> If you have multiple manifests (for exmample, a product
+<p class="note"><strong>Note:</strong> If you have multiple manifests (for example, a product
flavor specific manifest and a build type manifest), the package name is optional in those manifests.
If it is specified in those manifests, the package name must be identical to the package name
specified in the manifest in the <code>src/main/</code> folder. </p>
@@ -317,7 +317,7 @@
(logcat) in the DDMS pane by clicking <strong>Android</strong> at the bottom of the window.</p>
<p>If you want to debug your app with the
-<ahref="{@docRoot}tools/help/monitor.html">Android Debug Monitor</a>, you can launch it by
+<a href="{@docRoot}tools/help/monitor.html">Android Debug Monitor</a>, you can launch it by
clicking <strong>Monitor</strong>
<img src="{@docRoot}images/tools/monitor-studio.png" style="vertical-align:bottom;margin:0;height:19px"/>
in the toolbar. The Debug Monitor is where you can find the complete set of
@@ -345,7 +345,7 @@
<h3>Expanded template and form factor support</h3>
-<p>Android Studio supports new templates for Google Services and expands the availabe device
+<p>Android Studio supports new templates for Google Services and expands the available device
types. </p>
<h4> Android Wear and TV support</h4>
diff --git a/docs/html/tools/tools_toc.cs b/docs/html/tools/tools_toc.cs
index 7d8cc6c..073e81c 100644
--- a/docs/html/tools/tools_toc.cs
+++ b/docs/html/tools/tools_toc.cs
@@ -52,7 +52,7 @@
<li class="nav-section">
<div class="nav-section-header"><a href="<?cs var:toroot ?>tools/projects/index.html"><span class="en">Managing Projects</span></a></div>
<ul>
- <li><a href="<?cs var:toroot ?>tools/projects/projects-studio.html"><span class="en">From Android Studio</span></a></li>
+ <li><a href="<?cs var:toroot ?>sdk/installing/create-project.html"><span class="en">From Android Studio</span></a></li>
<li><a href="<?cs var:toroot ?>tools/projects/projects-cmdline.html"><span class="en">From the Command Line</span></a></li>
<li><a href="<?cs var:toroot ?>tools/projects/templates.html"><span class="en">Using Code Templates</span></a></li>
</ul>
diff --git a/docs/html/tools/workflow/index.jd b/docs/html/tools/workflow/index.jd
index 6a114c7..a24a2b0 100644
--- a/docs/html/tools/workflow/index.jd
+++ b/docs/html/tools/workflow/index.jd
@@ -30,15 +30,15 @@
<p>During this phase you install and set up your development environment. You also create
Android Virtual Devices (AVDs) and connect hardware devices on which you can install your
applications.</p>
- <p>See <a href="{@docRoot}tools/workflow/devices/index.html">Managing Virtual Devices</a>
- and <a href="{@docRoot}tools/workflow/device.html">Using Hardware Devices</a> for more
+ <p>See <a href="{@docRoot}tools/devices/index.html">Managing Virtual Devices</a>
+ and <a href="{@docRoot}tools/device.html">Using Hardware Devices</a> for more
information.
</li>
<li><strong>Project Setup and Development</strong>
<p>During this phase you set up and develop your Android Studio project and application modules,
which contain all of the source code and resource files for your application. For more
information, see
- <a href="{@docRoot}tools/workflow/projects/index.html">Create an Android project</a>.</p>
+ <a href="{@docRoot}tools/projects/index.html">Create an Android project</a>.</p>
</li>
<li><strong>Building, Debugging and Testing</strong>
<p>During this phase you build your project into a debuggable <code>.apk</code> package(s)
@@ -47,7 +47,7 @@
that provides flexibility, customized build variants, dependency resolution, and much more.
If you're using another IDE, you can build your project using Gradle and install it on a device
using <a href="{@docRoot}tools/help/adb.html">adb</a>. For more information, see
- <a href="{@docRoot}tools/workflow/building/index.html">Build and run your application</a>.</p>
+ <a href="{@docRoot}tools/building/index.html">Build and run your application</a>.</p>
<p>Next, with Android Studio you debug your application using the
<a href="{@docRoot}tools/help/monitor.html">Android Debug Monitor</a> and device log messages
(<a href="{@docRoot}tools/help/logcat.html">logact</a>) along with the IntelliJ IDEA intelligent
diff --git a/docs/html/training/auto/start/index.jd b/docs/html/training/auto/start/index.jd
index 8abe5c5..54500ac 100644
--- a/docs/html/training/auto/start/index.jd
+++ b/docs/html/training/auto/start/index.jd
@@ -179,7 +179,8 @@
<ol>
<li>Install the Android Media Browser simulator
-({@code media-browser-simulator.apk}) on the test device. You can do this using
+({@code <sdk>/extras/google/simulators/media-browser-simulator.apk}) on
+the test device. You can do this using
the <a href="{@docRoot}tools/help/adb.html#move">adb</a> command line tool.</li>
<li>Enable <a href="{@docRoot}tools/device.html#device-developer-options">
developer options</a> on the test device.</li>
@@ -193,7 +194,8 @@
<p>To run and test messaging apps:</p>
<ol>
-<li>Install the Android Messaging simulator ({@code messaging-simulator.apk})
+<li>Install the Android Messaging simulator
+ ({@code <sdk>/extras/google/simulators/messaging-simulator.apk})
on the test device. You can do this using the
<a href="{@docRoot}tools/help/adb.html#move">adb</a> command line tool.</li>
<li>Enable the simulator to read notifications posted on the system:
diff --git a/docs/html/training/enterprise/app-compatibility.jd b/docs/html/training/enterprise/app-compatibility.jd
new file mode 100644
index 0000000..1ae1ee3
--- /dev/null
+++ b/docs/html/training/enterprise/app-compatibility.jd
@@ -0,0 +1,274 @@
+page.title=Ensuring Compatibility with Managed Profiles
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+
+<h2>This lesson teaches you to</h2>
+<ol>
+ <li><a href="#prevent_failed_intents">Prevent Failed Intents</a></li>
+ <li><a href="#sharing_files">Share Files Across Profiles</a></li>
+ <li><a href="#testing_apps">Test your App for Compatibility with Managed
+ Profiles</a></li>
+</ol>
+
+<!-- related docs (NOT javadocs) -->
+<h2>Resources</h2>
+<ul>
+ <li><a href="{@docRoot}samples/BasicManagedProfile/index.html">BasicManagedProfile</a></li>
+</ul>
+
+</div>
+</div>
+
+<p>The Android platform allows devices to have
+<a href="{@docRoot}about/versions/android-5.0.html#Enterprise">managed
+profiles</a>. A managed profile is controlled by an administrator, and the
+functionality available to it is set separately from the functionality of the
+user's primary profile. This approach lets enterprises control the environment
+where company-specific apps and data are running on a user's device, while still
+letting users use their personal apps and profiles.</p>
+
+<p>This lesson shows you how to modify your application so it functions
+reliably on a device with managed profiles. You don't need to do anything
+besides the ordinary app-development best practices. However, some of these best
+practices become especially important on devices with managed profiles. This
+document highlights the issues you need to be aware of.</p>
+
+<h2 id="overview">Overview</h2>
+
+<p>Users often want to use their personal devices in an enterprise setting. This
+situation can present enterprises with a dilemma. If the user can use their own
+device, the enterprise has to worry that confidential information (like employee
+emails and contacts) are on a device the enterprise does not control. </p>
+
+<p>To address this situation, Android 5.0 (API level 21) allows enterprises to
+set up <i>managed profiles</i>. If a device has a managed profile, the profile's
+settings are under the control of the enterprise administrator. The
+administrator can choose which apps are allowed for that profile, and can
+control just what device features are available to the profile.</p>
+
+<p>If a device has a managed profile, there are implications for apps
+running on the device, no matter which profile the app is running under:</p>
+
+<ul>
+
+<li>By default, most intents do not cross from one profile to the other. If an
+app running on profile fires an intent, there is no handler for the intent on
+that profile, and the intent is not allowed to cross to the other profile
+due to profile restrictions, the request fails and the app may shut down
+unexpectedly.</li>
+<li>The profile administrator can limit which system apps are available on the
+managed profile. This restriction can also result in there being no handler for
+some common intents on the managed profile.</li>
+<li>Since the managed and unmanaged profiles have separate storage areas, a
+file URI that is valid on one profile is not valid on the other. Any
+intent fired on one profile might be handled on the other (depending on profile
+settings), so it is not safe to attach file URIs to intents.</li>
+
+</ul>
+
+<h2 id="prevent_failed_intents">Prevent Failed Intents</h2>
+
+<p>On a device with a managed profile, there are restrictions on whether intents
+can cross from one profile to another. In most cases, when an intent is fired
+off, it is handled on the same profile where it is fired. If there is no handler
+for the intent <em>on that profile</em>, the intent is not handled and the app
+that fired it may shut down unexpectedly—even if there's a handler for the
+intent on the other profile.</p>
+
+<p>The profile administrator can choose which intents are
+allowed to cross from one profile to another. Since the administrator makes
+this decision, there's no way for you
+to know in advance <em>which</em> intents are allowed to cross this boundary. The
+administrator sets this policy, and is free to change it at any time.</p>
+
+<p>Before your app starts an activity, you should verify that there is a
+suitable resolution. You
+can verify that there is an acceptable resolution by calling {@link
+android.content.Intent#resolveActivity Intent.resolveActivity()}. If there is no
+way to resolve the intent, the method returns
+<code>null</code>. If the method returns non-null, there is at least one way to
+resolve the intent, and it is safe to fire off the intent. In this case, the
+intent could be resolvable either
+because there is a handler on the current profile, or because the intent is
+allowed to cross to a handler on the other profile. (For more information about
+resolving intents, see <a
+href="{@docRoot}guide/components/intents-common.html">Common Intents</a>.)</p>
+
+<p>For example, if your app needs to set timers, it would need to check that
+there's a valid handler for the {@link
+android.provider.AlarmClock#ACTION_SET_TIMER} intent. If the app cannot resolve
+the intent, it should take an appropriate action (such as showing an error
+message).</p>
+
+<pre>public void startTimer(String message, int seconds) {
+
+ // Build the "set timer" intent
+ Intent timerIntent = new Intent(AlarmClock.ACTION_SET_TIMER)
+ .putExtra(AlarmClock.EXTRA_MESSAGE, message)
+ .putExtra(AlarmClock.EXTRA_LENGTH, seconds)
+ .putExtra(AlarmClock.EXTRA_SKIP_UI, true);
+
+ // Check if there's a handler for the intent
+ <strong>if (timerIntent.resolveActivity(getPackageManager()) == null)</strong> {
+
+ // Can't resolve the intent! Fail this operation cleanly
+ // (perhaps by showing an error message)
+
+ } else {
+ // Intent resolves, it's safe to fire it off
+ startActivity(timerIntent);
+
+ }
+}
+</pre>
+
+<h2 id="sharing_files">Share Files Across Profiles</h2>
+
+<p>Sometimes an app needs to provide other apps with access to its own files.
+For example, an image gallery app might want to share its images with image
+editors. There are two ways you would ordinarily share a file: with a <em>file
+URI</em> or a <em>content URI</em>.</p>
+
+<p>A file URI begins with the <code>file:</code> prefix, followed by the
+absolute path of the file on the device's storage. However, because the
+managed profile and the personal profile use separate storage areas, a file URI
+that is valid on one profile is not valid on the other. This situation
+means that if you
+attach a file URI to an intent, and the intent is handled on the other profile,
+the handler is not able to access the file.</p>
+
+<p>Instead, you should share files with <em>content URIs</em>. Content URIs
+identify the file in a more secure, shareable fashion. The content URI contains
+the file path, but also the authority that provides the file, and an ID number
+identifying the file. You can generate a content ID for any file by using a
+{@link android.support.v4.content.FileProvider}. You can then share that content
+ID with other apps (even on the other profile). The recipient can use the
+content ID to get access to the actual file.</p>
+
+<p>For example, here's how you would get the content URI for a specific file
+URI:</p>
+
+<pre>// Open File object from its file URI
+File fileToShare = new File(<em>fileUriToShare</em>);
+
+Uri contentUriToShare = FileProvider.getUriForFile(getContext(),
+ <em>"com.example.myapp.fileprovider"</em>, fileToShare);</pre>
+
+<p>When you call the {@link
+android.support.v4.content.FileProvider#getUriForFile getUriForFile()} method,
+you must include the file provider's authority (in this example,
+<code>"com.example.myapp.fileprovider"</code>), which is specified in the
+<a href="{@docRoot}guide/topics/manifest/provider-element.html"><code><provider></code></a>
+element of your app manifest.
+For more information about sharing files with content URIs, see
+<a href="{@docRoot}training/secure-file-sharing/index.html">Sharing
+Files</a>.</p>
+
+<h2 id="testing_apps">Test your App for Compatibility with Managed Profiles</h2>
+
+<p>You should test your app in a managed-profile environment to
+catch problems that would cause your app to fail on a device with
+managed profiles. In particular, testing on a managed-profile device is a good
+way to make sure that your app handles intents properly: not firing intents that
+can't be handled, not attaching URIs that don't work cross-profile, and so
+on.</p>
+
+<p>We have provided a sample app, <a
+href="{@docRoot}samples/BasicManagedProfile/index.html">BasicManagedProfile</a>,
+which you can use to set up a managed profile on an Android device that runs
+Android 5.0 (API level 21) and higher. This app offers you a simple way to test
+your app in a managed-profile environment. You can also use this app to
+configure the managed profile as follows:</p>
+
+<ul>
+
+ <li>Specify which default apps are available on the managed
+ profile</li>
+
+ <li>Configure which intents are allowed to cross from one profile to
+ the other</li>
+
+</ul>
+
+<p>If you manually install an app over a USB cable to a device which has a
+managed profile, the app is installed on both the managed and the unmanaged
+profile. Once you have installed the app, you can test the app under the
+following conditions:</p>
+
+<ul>
+
+ <li>If an intent would ordinarily be handled by a default app (for example,
+ the camera app), try disabling that default app on the managed profile, and
+ verify that the app handles this appropriately.</li>
+
+ <li>If you fire an intent expecting it to be handled by some other app, try
+enabling and disabling that intent's permission to cross from one profile to
+another. Verify that the app behaves properly under both circumstances. If the
+intent is not allowed to cross between profiles, verify the app's behavior both
+when there is a suitable handler on the app's profile, and when there is not.
+For example, if your app fires a map-related intent, try each of the following
+scenarios:
+
+ <ul>
+
+<li>The device allows map intents to cross from one profile to the other, and
+there is a suitable handler on the other profile (the profile the app is not
+running on)</li>
+
+<li>The device does not allow map intents to cross between profiles, but there
+is a suitable handler on the app's profile</li>
+
+<li>The device does not allow map intents to cross between profiles, and there
+is no suitable handler for map intents on the device's profile</li>
+
+ </ul>
+ </li>
+
+<li>If you attach content to an intent, verify that the intent behaves properly
+both when it is handled on the app's profile, and when it crosses between
+profiles.</li>
+
+</ul>
+
+<h3 id="testing_tips">Testing on managed profiles: Tips and tricks</h3>
+
+<p>There are a few tricks that you may find helpful in testing on a
+managed-profile device.</p>
+
+<ul>
+
+<li>As noted, when you side-load an app on a managed profile device, it is
+installed on both profiles. If you wish, you can delete the app from one profile
+and leave it on the other.</li>
+
+<li>Most of the activity manager commands available in the <a
+href="{@docRoot}tools/help/adb.html">Android Debug Bridge</a> (adb) shell
+support the <code>--user</code> flag, which lets you specify which user to run
+as. By specifying a user, you can choose whether to run as the unmanaged or
+managed profile. For
+more information, see <a href="{@docRoot}tools/help/adb.html#am">Android Debug
+Bridge: Using activity manager (am)</a>.</li>
+
+<li>To find the active users on a device, use the adb package manager's
+<code>list users</code> command. The first number in the output string is the
+user ID, which you can use with the <code>--user</code> flag. For more
+information, see <a href="{@docRoot}tools/help/adb.html#pm">Android Debug
+Bridge: Using package manager (pm)</a>.</li>
+
+</ul>
+
+<p>For example, to find the users on a device, you would run this command:</p>
+
+<pre class="no-pretty-print">$ <strong>adb shell pm list users</strong>
+UserInfo{0:Drew:13} running
+UserInfo{10:Work profile:30} running</pre>
+
+<p>In this case, the unmanaged profile ("Drew") has the user ID 0, and the
+managed profile has the user ID 10. To run an app in the work profile, you
+would use a command like this:</p>
+
+<pre class="no-pretty-print">$ adb shell am start --user 10 \
+-n "<em>com.example.myapp/com.example.myapp.testactivity</em>" \
+-a android.intent.action.MAIN -c android.intent.category.LAUNCHER</pre>
diff --git a/docs/html/training/enterprise/index.jd b/docs/html/training/enterprise/index.jd
index 2926f71..0ac68cc 100644
--- a/docs/html/training/enterprise/index.jd
+++ b/docs/html/training/enterprise/index.jd
@@ -47,4 +47,12 @@
Policies</a></b></dt>
<dd>In this lesson, you will learn how to create a security-aware application that manages
access to its content by enforcing device management policies</dd>
+
+ <dt><b><a href="app-compatibility.html">Ensuring Compatibility with Managed Profiles</a></b></dt>
+
+ <dd>In this lesson, you will learn the best practices to follow to ensure
+ that your app functions properly on devices that use <a
+ href="{@docRoot}about/versions/android-5.0.html#Enterprise">managed
+ profiles</a></dd>
+
</dl>
diff --git a/docs/html/training/index.jd b/docs/html/training/index.jd
index 72ad018..c39ea54 100644
--- a/docs/html/training/index.jd
+++ b/docs/html/training/index.jd
@@ -4,11 +4,26 @@
@jd:body
-
<p>Welcome to Training for Android developers. Here you'll find sets of lessons within classes
that describe how to accomplish a specific task with code samples you can re-use in your app.
Classes are organized into several groups you can see at the top-level of the left navigation.</p>
-<p>This first group, <em>Getting Started</em>, teaches you the bare
-essentials for Android app development.
-If you're a new Android app developer, you should complete each of these classes in order:</p>
\ No newline at end of file
+ <p>This first group, <em>Getting Started</em>, teaches you the bare
+ essentials for Android app development. If you're a new Android app developer, you should
+ complete each of these classes in order.</p>
+
+<div>
+<div style="float:left; width:40%; margin-right:30px">
+
+ <p>If you think you might prefer to learn the basics through interactive video training,
+ check out this trailer for a course in the fundamentals of Android development.</p>
+ <p><a href="https://www.udacity.com/course/ud853" class="button">
+ Start the video course</a></p>
+</div>
+
+<div style="float:left; margin-bottom:20px">
+ <iframe width="300" height="169" src="//www.youtube.com/embed/LfVBFFoy9Y0?utm_source=dac&utm_medium=video&utm_content=andfuntrain&utm_campaign=udacint?rel=0&hd=1" frameborder="0" allowfullscreen></iframe>
+</div>
+</div>
+
+<div style="clear:left"></div>
\ No newline at end of file
diff --git a/docs/html/training/location/index.jd b/docs/html/training/location/index.jd
index 059a1e9..35e177f 100644
--- a/docs/html/training/location/index.jd
+++ b/docs/html/training/location/index.jd
@@ -50,9 +50,8 @@
<p>
This class shows you how to use the Google Play services location APIs in your
- app to get the current location, get periodic location updates, look up
- addresses, create and monitor geofences, and detect user activities. The class
- includes sample apps and code snippets that you can use as a starting point
+ app to get the current location, get periodic location updates, and look up
+ addresses. The class includes sample apps and code snippets that you can use as a starting point
for adding location awareness to your app.
</p>
@@ -81,25 +80,5 @@
</dt> <dd>
Learn how to convert a location's latitude and longitude into an address
(reverse geocoding).
- </dd> <dt>
- <b>
- <a href="geofencing.html">Creating and Monitoring Geofences</a>
- </b>
- </dt> <dd>
- Learn how to define one or more geographic areas as locations of interest,
- called geofences, and detect when the user is close to or inside a geofence.
- </dd> <dt>
- <b><a href="activity-recognition.html">Recognizing the User's Current
- Activity</a></b>
- </dt> <dd>
- Learn how to recognize the user's current activity, such as walking,
- bicycling, or driving a car, and how to use this information to modify your
- app's location strategy.
- </dd> <dt>
- <b><a href="location-testing.html">Testing Using Mock Locations</a></b>
- </dt> <dd>
- Learn how to test a location-aware app by injecting mock locations into
- Location Services. In mock mode, Location Services sends out mock locations
- that you inject instead of sensor-based locations.
</dd>
</dl>
diff --git a/docs/html/training/training_toc.cs b/docs/html/training/training_toc.cs
index 2489b91..0fcfb9c 100644
--- a/docs/html/training/training_toc.cs
+++ b/docs/html/training/training_toc.cs
@@ -707,18 +707,6 @@
Displaying a Location Address
</a>
</li>
- <li><a href="<?cs var:toroot ?>training/location/geofencing.html">
- Creating and Monitoring Geofences
- </a>
- </li>
- <li><a href="<?cs var:toroot ?>training/location/activity-recognition.html">
- Recognizing the User's Current Activity
- </a>
- </li>
- <li><a href="<?cs var:toroot ?>training/location/location-testing.html">
- Testing Using Mock Locations
- </a>
- </li>
</ul>
</li>
</ul>
@@ -891,25 +879,30 @@
<div class="nav-section-header">
<a href="<?cs var:toroot ?>training/tv/start/index.html"
+ ja-lang="TV アプリのビルド"
description="How to start building TV apps or extend your existing app to run on TV
devices.">
Building TV Apps</a>
</div>
<ul>
<li>
- <a href="<?cs var:toroot ?>training/tv/start/start.html">
+ <a href="<?cs var:toroot ?>training/tv/start/start.html"
+ ja-lang="TV アプリのビルドを開始する">
Getting Started with TV Apps</a>
</li>
<li>
- <a href="<?cs var:toroot ?>training/tv/start/hardware.html">
+ <a href="<?cs var:toroot ?>training/tv/start/hardware.html"
+ ja-lang="TV ハードウェアを処理する">
Handling TV Hardware</a>
</li>
<li>
- <a href="<?cs var:toroot ?>training/tv/start/layouts.html">
+ <a href="<?cs var:toroot ?>training/tv/start/layouts.html"
+ ja-lang="TV 向けレイアウトをビルドする">
Building TV Layouts</a>
</li>
<li>
- <a href="<?cs var:toroot ?>training/tv/start/navigation.html">
+ <a href="<?cs var:toroot ?>training/tv/start/navigation.html"
+ ja-lang="TV 用のナビゲーションを作成する">
Creating TV Navigation</a>
</li>
</ul>
@@ -918,20 +911,24 @@
<li class="nav-section">
<div class="nav-section-header">
<a href="<?cs var:toroot ?>training/tv/playback/index.html"
+ ja-lang="TV 再生アプリのビルド"
description="How to build apps that provide media catalogs and play content.">
Building TV Playback Apps</a>
</div>
<ul>
<li>
- <a href="<?cs var:toroot ?>training/tv/playback/browse.html">
+ <a href="<?cs var:toroot ?>training/tv/playback/browse.html"
+ ja-lang="カタログ ブラウザを作成する">
Creating a Catalog Browser</a>
</li>
<li>
- <a href="<?cs var:toroot ?>training/tv/playback/details.html">
+ <a href="<?cs var:toroot ?>training/tv/playback/details.html"
+ ja-lang="詳細ビューをビルドする">
Building a Details View</a>
</li>
<li>
- <a href="<?cs var:toroot ?>training/tv/playback/now-playing.html">
+ <a href="<?cs var:toroot ?>training/tv/playback/now-playing.html"
+ ja-lang="再生中カードを表示する">
Displaying a Now Playing Card</a>
</li>
</ul>
@@ -949,6 +946,9 @@
Recommending TV Content</a>
</li>
<li>
+ <a href="<?cs var:toroot ?>training/tv/discovery/searchable.html">
+ Making TV Apps Searchable</a>
+ <li>
<a href="<?cs var:toroot ?>training/tv/discovery/in-app-search.html">
Searching within TV Apps</a>
</li>
@@ -966,6 +966,12 @@
description="How to build Live TV apps.">
Building Live TV Apps</a>
</li>
+
+ <li>
+ <a href="<?cs var:toroot ?>training/tv/publishing/checklist.html"
+ description="An itemized list of requirements for TV apps.">
+ TV Apps Checklist</a>
+ </li>
</ul>
</li>
<!-- End: Building for TV -->
@@ -1713,6 +1719,10 @@
Enhancing Security with Device Management Policies
</a>
</li>
+ <li><a href="<?cs var:toroot ?>training/enterprise/app-compatibility.html">
+ Ensuring Compatibility with Managed Profiles
+ </a>
+ </li>
</ul>
</li>
</ul>
diff --git a/docs/html/training/tv/discovery/recommendations.jd b/docs/html/training/tv/discovery/recommendations.jd
index 0f6d256..d348c14 100644
--- a/docs/html/training/tv/discovery/recommendations.jd
+++ b/docs/html/training/tv/discovery/recommendations.jd
@@ -14,6 +14,11 @@
<li><a href="#build">Build Recommendations</a></li>
<li><a href="#run-service">Run Recommendations Service</a></li>
</ol>
+ <h2>Try it out</h2>
+ <ul>
+ <li><a class="external-link" href="https://github.com/googlesamples/androidtv-Leanback">Android
+ Leanback sample app</a></li>
+ </ul>
</div>
</div>
@@ -25,7 +30,7 @@
<p>
The Android framework assists with minimum-input interaction by providing a recommendations row
- on the home screen. Content recommendations appear as the first row of the TV launch screen after
+ on the home screen. Content recommendations appear as the first row of the TV home screen after
the first use of the device. Contributing recommendations from your app's content catalog can help
bring users back to your app.
</p>
@@ -37,7 +42,9 @@
<p>
This lesson teaches you how to create recommendations and provide them to the Android framework
- so your app content can be easily discovered and enjoyed by users.
+ so users can easily discover and enjoy your app content. This discussion describes some code from
+ the <a class="external-link" href="https://github.com/googlesamples/androidtv-Leanback">Android
+ Leanback sample app</a>.
</p>
@@ -46,7 +53,7 @@
<p>
Content recommendations are created with background processing. In order for your application to
contribute to recommendations, create a service that periodically adds listings from your
- app's catalog to the system list of recommendations.
+ app's catalog to the system's list of recommendations.
</p>
<p>
@@ -54,26 +61,50 @@
create a recommendation service for your application:
</p>
+
+<p class="code-caption">
+ <a href="https://github.com/googlesamples/androidtv-Leanback/blob/master/app/src/main/java/com/example/android/tvleanback/UpdateRecommendationsService.java" target="_blank">
+ UpdateRecommendationsService.java</a>
+</p>
<pre>
-public class RecommendationsService extends IntentService {
+public class UpdateRecommendationsService extends IntentService {
+ private static final String TAG = "UpdateRecommendationsService";
private static final int MAX_RECOMMENDATIONS = 3;
- public RecommendationsService() {
+ public UpdateRecommendationsService() {
super("RecommendationService");
}
@Override
protected void onHandleIntent(Intent intent) {
- MovieDatabase database = MovieDatabase.instance(getApplicationContext());
- List<Movie> recommendations = database.recommendations();
+ Log.d(TAG, "Updating recommendation cards");
+ HashMap<String, List<Movie>> recommendations = VideoProvider.getMovieList();
+ if (recommendations == null) return;
int count = 0;
try {
- for (Movie movie : recommendations) {
- // build the individual content recommendations
- buildRecommendation(getApplicationContext(), movie);
+ RecommendationBuilder builder = new RecommendationBuilder()
+ .setContext(getApplicationContext())
+ .setSmallIcon(R.drawable.videos_by_google_icon);
+ for (Map.Entry<String, List<Movie>> entry : recommendations.entrySet()) {
+ for (Movie movie : entry.getValue()) {
+ Log.d(TAG, "Recommendation - " + movie.getTitle());
+
+ builder.setBackground(movie.getCardImageUrl())
+ .setId(count + 1)
+ .setPriority(MAX_RECOMMENDATIONS - count)
+ .setTitle(movie.getTitle())
+ .setDescription(getString(R.string.popular_header))
+ .setImage(movie.getCardImageUrl())
+ .setIntent(buildPendingIntent(movie))
+ .build();
+
+ if (++count >= MAX_RECOMMENDATIONS) {
+ break;
+ }
+ }
if (++count >= MAX_RECOMMENDATIONS) {
break;
}
@@ -82,6 +113,21 @@
Log.e(TAG, "Unable to update recommendation", e);
}
}
+
+ private PendingIntent buildPendingIntent(Movie movie) {
+ Intent detailsIntent = new Intent(this, DetailsActivity.class);
+ detailsIntent.putExtra("Movie", movie);
+
+ TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
+ stackBuilder.addParentStack(DetailsActivity.class);
+ stackBuilder.addNextIntent(detailsIntent);
+ // Ensure a unique PendingIntents, otherwise all recommendations end up with the same
+ // PendingIntent
+ detailsIntent.setAction(Long.toString(movie.getId()));
+
+ PendingIntent intent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
+ return intent;
+ }
}
</pre>
@@ -90,125 +136,165 @@
app manifest. The following code snippet illustrates how to declare this class as a service:
</p>
+<p class="code-caption">
+ <a href="https://github.com/googlesamples/androidtv-Leanback/blob/master/app/src/main/AndroidManifest.xml" target="_blank">
+ AndroidManifest.xml</a>
+</p>
<pre>
<manifest ... >
<application ... >
...
- <service android:name=".RecommendationsService"
- android:enabled="true" android:exported="true"/>
+ <service
+ android:name="com.example.android.tvleanback.UpdateRecommendationsService"
+ android:enabled="true" />
</application>
</manifest>
</pre>
+<h3 id="refreshing">Refreshing Recommendations</h3>
+
+<p>Base your recommendations on user behavior and data such as play lists, wish lists, and associated
+content. When refreshing recommendations, don't just remove and repost them, because doing so causes
+the recommendations to appear at the end of the recommendations row. Once a content item, such as a
+movie, has been played, <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Removing">
+remove it</a> from the recommendations.</p>
<h2 id="build">Build Recommendations</h2>
<p>
- Once your recommendation server starts running, it must create recommendations and pass them to
+ Once your recommendation service starts running, it must create recommendations and pass them to
the Android framework. The framework receives the recommendations as {@link
android.app.Notification} objects that use a specific template and are marked with a specific
category.
</p>
-<p>
- The following code example demonstrates how to get an instance of the {@link
- android.app.NotificationManager}, build a recommendation, and post it to the manager:
+<h3 id="setting-ui">Setting the Values</h3>
+
+<p>To set the UI element values for the recommendation card, you create a builder class that follows
+the builder pattern described as follows. First, you set the values of the recommendation card
+elements.</p>
+
+<p class="code-caption">
+ <a href="https://github.com/googlesamples/androidtv-Leanback/blob/master/app/src/main/java/com/example/android/tvleanback/RecommendationBuilder.java" target="_blank">
+ RecommendationBuilder.java</a>
</p>
-
<pre>
-public class RecommendationsService extends IntentService {
-
+public class RecommendationBuilder {
...
- public Notification buildRecommendation(Context context, Movie movie)
- throws IOException {
-
- if (mNotificationManager == null) {
- mNotificationManager = (NotificationManager)
- mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ public RecommendationBuilder setTitle(String title) {
+ mTitle = title;
+ return this;
}
- Bundle extras = new Bundle();
- if (mBackgroundUri != movie.getBackgroundUri()) {
- extras.putString(EXTRA_BACKGROUND_IMAGE_URL, movie.getBackgroundUri());
+ public RecommendationBuilder setDescription(String description) {
+ mDescription = description;
+ return this;
}
- // build the recommendation as a Notification object
+ public RecommendationBuilder setImage(String uri) {
+ mImageUri = uri;
+ return this;
+ }
+
+ public RecommendationBuilder setBackground(String uri) {
+ mBackgroundUri = uri;
+ return this;
+ }
+...
+</pre>
+
+<h3 id="create-notification">Creating the Notification</h3>
+
+<p>
+ Once you've set the values, you then build the notification, assigning the values from the builder
+ class to the notification, and calling {@link android.support.v4.app.NotificationCompat.Builder#build()
+ NotificationCompat.Builder.build()}.
+</p>
+
+<p>
+ Also, be sure to call
+ {@link android.support.v4.app.NotificationCompat.Builder#setLocalOnly(boolean) setLocalOnly()}
+ so the {@link android.support.v4.app.NotificationCompat.BigPictureStyle} notification won't show up
+ on other devices.
+</p>
+
+<p>
+ The following code example demonstrates how to build a recommendation, and post it to the manager.
+</p>
+
+<p class="code-caption">
+ <a href="https://github.com/googlesamples/androidtv-Leanback/blob/master/app/src/main/java/com/example/android/tvleanback/RecommendationBuilder.java" target="_blank">
+ RecommendationBuilder.java</a>
+</p>
+<pre>
+public class RecommendationBuilder {
+ ...
+
+ public Notification build() throws IOException {
+ ...
+
Notification notification = new NotificationCompat.BigPictureStyle(
- new NotificationCompat.Builder(context)
- .setContentTitle(movie.getTitle())
- .setContentText(movie.getDescription())
- .setContentInfo(APP_NAME)
- .setGroup("ActionMovies")
- .setSortKey("0.8")
- .setPriority(movie.getPriority())
- .setColor(#FFFF2020)
- .setCategory("recommendation")
- .setLargeIcon(movie.getImage())
- .setSmallIcon(movie.getSmallIcon())
- .setContentIntent(buildPendingIntent(movie.getId()))
+ new NotificationCompat.Builder(mContext)
+ .setContentTitle(mTitle)
+ .setContentText(mDescription)
+ .setPriority(mPriority)
+ .setLocalOnly(true)
+ .setOngoing(true)
+ .setColor(mContext.getResources().getColor(R.color.fastlane_background))
+ .setCategory(Notification.CATEGORY_RECOMMENDATION)
+ .setLargeIcon(image)
+ .setSmallIcon(mSmallIcon)
+ .setContentIntent(mIntent)
.setExtras(extras))
.build();
- // post the recommendation to the NotificationManager
- mNotificationManager.notify(movie.getId(), notification);
+ mNotificationManager.notify(mId, notification);
mNotificationManager = null;
return notification;
}
-
- private PendingIntent buildPendingIntent(long id) {
- Intent detailsIntent = new Intent(this, DetailsActivity.class);
- detailsIntent.putExtra("id", id);
-
- TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
- stackBuilder.addParentStack(DetailsActivity.class);
- stackBuilder.addNextIntent(detailsIntent);
- // Ensure each PendingIntent is unique
- detailsIntent.setAction(Long.toString(id));
-
- PendingIntent intent = stackBuilder.getPendingIntent(
- 0, PendingIntent.FLAG_UPDATE_CURRENT);
- return intent;
- }
}
</pre>
-
-<h3 id="run-service">Run Recommendations Service</h3>
+<h2 id="run-service">Run Recommendations Service</h3>
<p>
Your app's recommendation service must run periodically in order to create current
recommendations. To run your service, create a class that runs a timer and invokes
it at regular intervals. The following code example extends the {@link
android.content.BroadcastReceiver} class to start periodic execution of a recommendation service
- every 12 hours:
+ every half hour:
</p>
+<p class="code-caption">
+ <a href="https://github.com/googlesamples/androidtv-Leanback/blob/master/app/src/main/java/com/example/android/tvleanback/BootupActivity.java" target="_blank">
+ BootupActivity.java</a>
+</p>
<pre>
-public class BootupReceiver extends BroadcastReceiver {
+public class BootupActivity extends BroadcastReceiver {
private static final String TAG = "BootupActivity";
private static final long INITIAL_DELAY = 5000;
@Override
public void onReceive(Context context, Intent intent) {
+ Log.d(TAG, "BootupActivity initiated");
if (intent.getAction().endsWith(Intent.ACTION_BOOT_COMPLETED)) {
scheduleRecommendationUpdate(context);
}
}
private void scheduleRecommendationUpdate(Context context) {
- AlarmManager alarmManager = (AlarmManager)context.getSystemService(
- Context.ALARM_SERVICE);
- Intent recommendationIntent = new Intent(context,
- UpdateRecommendationsService.class);
- PendingIntent alarmIntent = PendingIntent.getService(context, 0,
- recommendationIntent, 0);
+ Log.d(TAG, "Scheduling recommendations update");
+
+ AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+ Intent recommendationIntent = new Intent(context, UpdateRecommendationsService.class);
+ PendingIntent alarmIntent = PendingIntent.getService(context, 0, recommendationIntent, 0);
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
INITIAL_DELAY,
- AlarmManager.INTERVAL_HALF_DAY,
+ AlarmManager.INTERVAL_HALF_HOUR,
alarmIntent);
}
}
@@ -221,10 +307,15 @@
following sample code demonstrates how to add this configuration to the manifest:
</p>
+<p class="code-caption">
+ <a href="https://github.com/googlesamples/androidtv-Leanback/blob/master/app/src/main/AndroidManifest.xml" target="_blank">
+ AndroidManifest.xml</a>
+</p>
<pre>
<manifest ... >
<application ... >
- <receiver android:name=".BootupReceiver" android:enabled="true"
+ <receiver android:name="com.example.android.tvleanback.BootupActivity"
+ android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
@@ -234,7 +325,7 @@
</manifest>
</pre>
-<p class="important">
+<p class="note">
<strong>Important:</strong> Receiving a boot completed notification requires that your app
requests the {@link android.Manifest.permission#RECEIVE_BOOT_COMPLETED} permission.
For more information, see {@link android.content.Intent#ACTION_BOOT_COMPLETED}.
diff --git a/docs/html/training/tv/discovery/searchable.jd b/docs/html/training/tv/discovery/searchable.jd
new file mode 100644
index 0000000..5d3b9e3
--- /dev/null
+++ b/docs/html/training/tv/discovery/searchable.jd
@@ -0,0 +1,383 @@
+page.title=Making TV Apps Searchable
+page.tags="search","searchable"
+
+trainingnavtop=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>This lesson teaches you to</h2>
+ <ol>
+ <li><a href="#columns">Identify Columns</a></li>
+ <li><a href="#provide">Provide Search Suggestion Data</a></li>
+ <li><a href="#suggestions">Handle Search Suggestions</a></li>
+ <li><a href="#terms">Handle Search Terms</a></li>
+ <li><a href="#details">Deep Link to Your App in the Details Screen</a></li>
+ </ol>
+ <h2>You should also read</h2>
+ <ul>
+ <li><a href="{@docRoot}guide/topics/search/index.html">Search</a></li>
+ <li><a href="{@docRoot}training/search/index.html">Adding Search Functionality</a></li>
+ </ul>
+ <h2>Try it out</h2>
+ <ul>
+ <li><a class="external-link" href="https://github.com/googlesamples/androidtv-Leanback">Android Leanback sample app</a></li>
+ </ul>
+</div>
+</div>
+
+<p>Android TV uses the Android <a href="{@docRoot}guide/topics/search/index.html">search interface</a>
+to retrieve content data from installed apps and deliver search results to the user. Your app's
+content data can be included with these results, to give the user instant access to the content in
+your app.</p>
+
+<p>Your app must provide Android TV with the data fields from which it generates suggested search
+results as the user enters characters in the search dialog. To do that, your app must implement a
+<a href="{@docRoot}guide/topics/providers/content-providers.html">Content Provider</a> that serves
+up the suggestions along with a <a href="{@docRoot}guide/topics/search/searchable-config.html">
+{@code searchable.xml}</a> configuration file that describes the content
+provider and other vital information for Android TV. You also need an activity that handles the
+intent that fires when the user selects a suggested search result. All of this is described in
+more detail in <a href="{@docRoot}guide/topics/search/adding-custom-suggestions.html">Adding Custom
+Suggestions</a>. Here are described the main points for Android TV apps.</p>
+
+<p>This lesson builds on your knowledge of using search in Android to show you how to make your app
+searchable in Android TV. Be sure you are familiar with the concepts explained in the
+<a href="{@docRoot}guide/topics/search/index.html">Search API guide</a> before following this lesson.
+See also the training <a href="{@docRoot}training/search/index.html">Adding Search Functionality</a>.</p>
+
+<p>This discussion describes some code from the
+<a class="external-link" href="https://github.com/googlesamples/androidtv-Leanback">Android Leanback sample app</a>,
+available on GitHub.</p>
+
+<h2 id="columns">Identify Columns</h2>
+
+<p>The {@link android.app.SearchManager} describes the data fields it expects by representing them as
+columns of an SQLite database. Regardless of your data's format, you must map your data fields to
+these columns, usually in the class that accessess your content data. For information about building
+a class that maps your existing data to the required fields, see
+<a href="{@docRoot}guide/topics/search/adding-custom-suggestions.html#SuggestionTable">
+Building a suggestion table</a>.</p>
+
+<p>The {@link android.app.SearchManager} class includes several columns for Android TV. Some of the
+more important columns are described below.</p>
+
+<table>
+<tr>
+ <th>Value</th>
+ <th>Description</th>
+</tr><tr>
+ <td>{@code SUGGEST_COLUMN_TEXT_1}</td>
+ <td>The name of your content <strong>(required)</strong></td>
+</tr><tr>
+ <td>{@code SUGGEST_COLUMN_TEXT_2}</td>
+ <td>A text description of your content</td>
+</tr><tr>
+ <td>{@code SUGGEST_COLUMN_RESULT_CARD_IMAGE}</td>
+ <td>An image/poster/cover for your content</td>
+</tr><tr>
+ <td>{@code SUGGEST_COLUMN_CONTENT_TYPE}</td>
+ <td>The MIME type of your media <strong>(required)</strong></td>
+</tr><tr>
+ <td>{@code SUGGEST_COLUMN_VIDEO_WIDTH}</td>
+ <td>The resolution width of your media</td>
+</tr><tr>
+ <td>{@code SUGGEST_COLUMN_VIDEO_HEIGHT}</td>
+ <td>The resolution height of your media</td>
+</tr><tr>
+ <td>{@code SUGGEST_COLUMN_PRODUCTION_YEAR}</td>
+ <td>The production year of your content <strong>(required)</strong></td>
+</tr><tr>
+ <td>{@code SUGGEST_COLUMN_DURATION}</td>
+ <td>The duration in milliseconds of your media</td>
+</tr>
+</table>
+
+<p>The search framework requires the following columns:</p>
+<ul>
+ <li>{@link android.app.SearchManager#SUGGEST_COLUMN_TEXT_1}</li>
+ <li>{@link android.app.SearchManager#SUGGEST_COLUMN_CONTENT_TYPE}</li>
+ <li>{@link android.app.SearchManager#SUGGEST_COLUMN_PRODUCTION_YEAR}</li>
+</ul>
+
+<p>When the values of these columns for your content match the values for the same content from other
+providers found by Google servers, the system provides a
+<a href="{@docRoot}training/app-indexing/deep-linking.html">deep link</a> to your app in the details
+view for the content, along with links to the apps of other providers. This is discussed more in
+<a href="#details">Display Content in the Details Screen</a>, below.</p>
+
+<p>Your application's database class might define the columns as follows:</p>
+
+<p class="code-caption"><a href="https://github.com/googlesamples/androidtv-Leanback/blob/master/app/src/main/java/com/example/android/tvleanback/VideoDatabase.java#L41" target="_blank">
+VideoDatabase.java</a></p>
+<pre>
+public class VideoDatabase {
+ //The columns we'll include in the video database table
+ public static final String KEY_NAME = SearchManager.SUGGEST_COLUMN_TEXT_1;
+ public static final String KEY_DESCRIPTION = SearchManager.SUGGEST_COLUMN_TEXT_2;
+ public static final String KEY_ICON = SearchManager.SUGGEST_COLUMN_RESULT_CARD_IMAGE;
+ public static final String KEY_DATA_TYPE = SearchManager.SUGGEST_COLUMN_CONTENT_TYPE;
+ public static final String KEY_IS_LIVE = SearchManager.SUGGEST_COLUMN_IS_LIVE;
+ public static final String KEY_VIDEO_WIDTH = SearchManager.SUGGEST_COLUMN_VIDEO_WIDTH;
+ public static final String KEY_VIDEO_HEIGHT = SearchManager.SUGGEST_COLUMN_VIDEO_HEIGHT;
+ public static final String KEY_AUDIO_CHANNEL_CONFIG =
+ SearchManager.SUGGEST_COLUMN_AUDIO_CHANNEL_CONFIG;
+ public static final String KEY_PURCHASE_PRICE = SearchManager.SUGGEST_COLUMN_PURCHASE_PRICE;
+ public static final String KEY_RENTAL_PRICE = SearchManager.SUGGEST_COLUMN_RENTAL_PRICE;
+ public static final String KEY_RATING_STYLE = SearchManager.SUGGEST_COLUMN_RATING_STYLE;
+ public static final String KEY_RATING_SCORE = SearchManager.SUGGEST_COLUMN_RATING_SCORE;
+ public static final String KEY_PRODUCTION_YEAR = SearchManager.SUGGEST_COLUMN_PRODUCTION_YEAR;
+ public static final String KEY_COLUMN_DURATION = SearchManager.SUGGEST_COLUMN_DURATION;
+ public static final String KEY_ACTION = SearchManager.SUGGEST_COLUMN_INTENT_ACTION;
+...
+</pre>
+
+<p>When you build the map from the {@link android.app.SearchManager} columns to your data fields, you
+must also specify the {@link android.provider.BaseColumns#_ID} to give each row a unique ID.</p>
+
+<p class="code-caption"><a href="https://github.com/googlesamples/androidtv-Leanback/blob/master/app/src/main/java/com/example/android/tvleanback/VideoDatabase.java#L83" target="_blank">
+VideoDatabase.java</a></p>
+<pre>
+...
+ private static HashMap<String, String> buildColumnMap() {
+ HashMap<String, String> map = new HashMap<String, String>();
+ map.put(KEY_NAME, KEY_NAME);
+ map.put(KEY_DESCRIPTION, KEY_DESCRIPTION);
+ map.put(KEY_ICON, KEY_ICON);
+ map.put(KEY_DATA_TYPE, KEY_DATA_TYPE);
+ map.put(KEY_IS_LIVE, KEY_IS_LIVE);
+ map.put(KEY_VIDEO_WIDTH, KEY_VIDEO_WIDTH);
+ map.put(KEY_VIDEO_HEIGHT, KEY_VIDEO_HEIGHT);
+ map.put(KEY_AUDIO_CHANNEL_CONFIG, KEY_AUDIO_CHANNEL_CONFIG);
+ map.put(KEY_PURCHASE_PRICE, KEY_PURCHASE_PRICE);
+ map.put(KEY_RENTAL_PRICE, KEY_RENTAL_PRICE);
+ map.put(KEY_RATING_STYLE, KEY_RATING_STYLE);
+ map.put(KEY_RATING_SCORE, KEY_RATING_SCORE);
+ map.put(KEY_PRODUCTION_YEAR, KEY_PRODUCTION_YEAR);
+ map.put(KEY_COLUMN_DURATION, KEY_COLUMN_DURATION);
+ map.put(KEY_ACTION, KEY_ACTION);
+ map.put(BaseColumns._ID, "rowid AS " +
+ BaseColumns._ID);
+ map.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, "rowid AS " +
+ SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID);
+ map.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, "rowid AS " +
+ SearchManager.SUGGEST_COLUMN_SHORTCUT_ID);
+ return map;
+ }
+...
+</pre>
+
+<p>In the example above, notice the mapping to the {@link android.app.SearchManager#SUGGEST_COLUMN_INTENT_DATA_ID}
+field. This is the portion of the URI that points to the content unique to the data in this row —
+that is, the last part of the URI describing where the content is stored. The first part of the URI,
+when it is common to all of the rows in the table, is set in the
+<a href="{@docRoot}guide/topics/search/searchable-config.html"> {@code searchable.xml}</a> file as the
+<a href="{@docRoot}guide/topics/search/searchable-config.html#searchSuggestIntentData">
+{@code android:searchSuggestIntentData}</a> attribute, as described in
+<a href="#suggestions">Handle Search Suggestions</a>, below.
+
+<p>If the first part of the URI is different for each row in the
+table, you map that value with the {@link android.app.SearchManager#SUGGEST_COLUMN_INTENT_DATA} field.
+When the user selects this content, the intent that fires provides the intent data from the
+combination of the {@link android.app.SearchManager#SUGGEST_COLUMN_INTENT_DATA_ID}
+and either the {@code android:searchSuggestIntentData} attribute or the
+{@link android.app.SearchManager#SUGGEST_COLUMN_INTENT_DATA} field value.</p>
+
+<h2 id="provide">Provide Search Suggestion Data</h2>
+
+<p>Implement a <a href="{@docRoot}guide/topics/providers/content-providers.html">Content Provider</a>
+to return search term suggestions to the Android TV search dialog. The system queries your content
+provider for suggestions by calling the {@link android.content.ContentProvider#query(android.net.Uri,
+java.lang.String[], java.lang.String, java.lang.String[], java.lang.String) query()} method each time
+a letter is typed. In your implementation of {@link android.content.ContentProvider#query(android.net.Uri,
+java.lang.String[], java.lang.String, java.lang.String[], java.lang.String) query()}, your content
+provider searches your suggestion data and returns a {@link android.database.Cursor} that points to
+the rows you have designated for suggestions.</p>
+
+<p class="code-caption"><a href="https://github.com/googlesamples/androidtv-Leanback/blob/master/app/src/main/java/com/example/android/tvleanback/VideoContentProvider.java" target="_blank">
+VideoContentProvider.java</a></p>
+<pre>
+@Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ // Use the UriMatcher to see what kind of query we have and format the db query accordingly
+ switch (URI_MATCHER.match(uri)) {
+ case SEARCH_SUGGEST:
+ Log.d(TAG, "search suggest: " + selectionArgs[0] + " URI: " + uri);
+ if (selectionArgs == null) {
+ throw new IllegalArgumentException(
+ "selectionArgs must be provided for the Uri: " + uri);
+ }
+ return getSuggestions(selectionArgs[0]);
+ default:
+ throw new IllegalArgumentException("Unknown Uri: " + uri);
+ }
+ }
+
+ private Cursor getSuggestions(String query) {
+ query = query.toLowerCase();
+ String[] columns = new String[]{
+ BaseColumns._ID,
+ VideoDatabase.KEY_NAME,
+ VideoDatabase.KEY_DESCRIPTION,
+ VideoDatabase.KEY_ICON,
+ VideoDatabase.KEY_DATA_TYPE,
+ VideoDatabase.KEY_IS_LIVE,
+ VideoDatabase.KEY_VIDEO_WIDTH,
+ VideoDatabase.KEY_VIDEO_HEIGHT,
+ VideoDatabase.KEY_AUDIO_CHANNEL_CONFIG,
+ VideoDatabase.KEY_PURCHASE_PRICE,
+ VideoDatabase.KEY_RENTAL_PRICE,
+ VideoDatabase.KEY_RATING_STYLE,
+ VideoDatabase.KEY_RATING_SCORE,
+ VideoDatabase.KEY_PRODUCTION_YEAR,
+ VideoDatabase.KEY_COLUMN_DURATION,
+ VideoDatabase.KEY_ACTION,
+ SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID
+ };
+ return mVideoDatabase.getWordMatch(query, columns);
+ }
+...
+</pre>
+
+<p>In your manifest file, the content provider receives special treatment. Rather than getting
+tagged as an activity, it is described as a
+<a href="{@docRoot}guide/topics/manifest/provider-element.html">{@code <provider>}</a>. The
+provider includes the {@code android:searchSuggestAuthority} attribute to tell the system the
+namespace of your content provider. Also, you must set its {@code android:exported} attribute to
+{@code "true"} so that the Android global search can use the results returned from it.</p>
+
+<p class="code-caption"><a href="https://github.com/googlesamples/androidtv-Leanback/blob/master/app/src/main/AndroidManifest.xml" target="_blank">
+AndroidManifest.xml</a></p>
+<pre>
+<provider android:name="com.example.android.tvleanback.VideoContentProvider"
+ android:authorities="com.example.android.tvleanback"
+ android:exported="true" />
+</pre>
+
+<h2 id="suggestions">Handle Search Suggestions</h2>
+
+<p>Your app must include a <a href="{@docRoot}guide/topics/search/searchable-config.html">
+{@code res/xml/searchable.xml}</a> file to configure the search suggestions settings. It inlcudes
+the <a href="{@docRoot}guide/topics/search/searchable-config.html#searchSuggestAuthority">
+{@code android:searchSuggestAuthority}</a> attribute to tell the system the namespace of your
+content provider. This must match the string value you specify in the
+<a href="{@docRoot}guide/topics/manifest/provider-element.html#auth">{@code android:authorities}</a>
+attribute of the <a href="{@docRoot}guide/topics/manifest/provider-element.html">{@code <provider>}
+</a> element in your {@code AndroidManifest.xml} file.</p>
+
+The <a href="{@docRoot}guide/topics/search/searchable-config.html">{@code searchable.xml}</a> file
+must also include the <a href="{@docRoot}guide/topics/search/searchable-config.html#searchSuggestIntentAction">
+{@code android:searchSuggestIntentAction}</a> with the value {@code "android.intent.action.VIEW"}
+to define the intent action for providing a custom suggestion. This is different from the intent
+action for providing a search term, explained below. See also,
+<a href="{@docRoot}guide/topics/search/adding-custom-suggestions.html#IntentAction">Declaring the
+intent action</a> for other ways to declare the intent action for suggestions.</p>
+
+<p>Along with the intent action, your app must provide the intent data, which you specify with the
+<a href="{@docRoot}guide/topics/search/searchable-config.html#searchSuggestIntentData">
+{@code android:searchSuggestIntentData}</a> attribute. This is the first part of the URI that points
+to the content. It describes the portion of the URI common to all rows in the mapping table for that
+content. The portion of the URI that is unique to each row is established with the {@link android.app.SearchManager#SUGGEST_COLUMN_INTENT_DATA_ID} field,
+as described above in <a href="#columns">Identify Columns</a>. See also,
+<a href="{@docRoot}guide/topics/search/adding-custom-suggestions.html#IntentData">
+Declaring the intent data</a> for other ways to declare the intent data for suggestions.</p>
+
+<p>Also, note the {@code android:searchSuggestSelection=" ?"} attribute which specifies the value passed
+as the {@code selection} parameter of the {@link android.content.ContentProvider#query(android.net.Uri,
+java.lang.String[], java.lang.String, java.lang.String[], java.lang.String) query()} method where the
+question mark ({@code ?}) value is replaced with the query text.</p>
+
+<p>Finally, you must also include the <a href="{@docRoot}guide/topics/search/searchable-config.html#includeInGlobalSearch">
+{@code android:includeInGlobalSearch}</a> attribute with the value {@code "true"}. Here is an example
+<a href="{@docRoot}guide/topics/search/searchable-config.html">{@code searchable.xml}</a>
+file:</p>
+
+<p class="code-caption"><a href="https://github.com/googlesamples/androidtv-Leanback/blob/master/app/src/main/res/xml/searchable.xml" target="_blank">
+Searchable.xml</a></p>
+<pre>
+<searchable xmlns:android="http://schemas.android.com/apk/res/android"
+ android:label="@string/search_label"
+ android:hint="@string/search_hint"
+ android:searchSettingsDescription="@string/settings_description"
+ android:searchSuggestAuthority="com.example.android.tvleanback"
+ android:searchSuggestIntentAction="android.intent.action.VIEW"
+ android:searchSuggestIntentData="content://com.example.android.tvleanback/video_database_leanback"
+ android:searchSuggestSelection=" ?"
+ android:searchSuggestThreshold="1"
+ android:includeInGlobalSearch="true"
+ >
+</searchable>
+</pre>
+
+<h2 id="terms">Handle Search Terms</h2>
+
+<p>As soon as the search dialog has a word which matches the value in one of your app's columns
+(described in <a href="#identifying">Identifying Columns</a>, above), the system fires the
+{@link android.content.Intent#ACTION_SEARCH} intent. The activity in your app which handles that
+intent searches the repository for columns with the given word in their values, and returns a list
+of content items with those columns. In your {@code AndroidManifest.xml} file, you designate the
+activity which handles the {@link android.content.Intent#ACTION_SEARCH} intent like this:
+
+<p class="code-caption"><a href="https://github.com/googlesamples/androidtv-Leanback/blob/master/app/src/main/AndroidManifest.xml" target="_blank">
+AndroidManifest.xml</a></p>
+<pre>
+...
+ <activity
+ android:name="com.example.android.tvleanback.DetailsActivity"
+ android:exported="true">
+
+ <!-- Receives the search request. -->
+ <intent-filter>
+ <action android:name="android.intent.action.SEARCH" />
+ <!-- No category needed, because the Intent will specify this class component -->
+ </intent-filter>
+
+ <!-- Points to searchable meta data. -->
+ <meta-data android:name="android.app.searchable"
+ android:resource="@xml/searchable" />
+ </activity>
+...
+ <!-- Provides search suggestions for keywords against video meta data. -->
+ <provider android:name="com.example.android.tvleanback.VideoContentProvider"
+ android:authorities="com.example.android.tvleanback"
+ android:exported="true" />
+...
+</pre>
+
+<p>The activity must also describe the searchable configuration with a reference to the
+<a href="{@docRoot}guide/topics/search/searchable-config.html">{@code searchable.xml}</a> file.
+To <a href="{@docRoot}guide/topics/search/search-dialog.html">use the global search dialog</a>,
+the manifest must describe which activity should receive search queries. The manifest must also
+describe the <a href="{@docRoot}guide/topics/manifest/provider-element.html">{@code <provider>}
+</a>element, exactly as it is described in the <a href="{@docRoot}guide/topics/search/searchable-config.html">
+{@code searchable.xml}</a> file.</p>
+
+<h2 id="details">Deep Link to Your App in the Details Screen</h2>
+
+<p>If you have set up the search configuration as described in <a href="#suggestions">Handle Search
+Suggestions</a> and mapped the {@link android.app.SearchManager#SUGGEST_COLUMN_TEXT_1},
+{@link android.app.SearchManager#SUGGEST_COLUMN_CONTENT_TYPE}, and
+{@link android.app.SearchManager#SUGGEST_COLUMN_PRODUCTION_YEAR} fields as described in
+<a href="#columns">Identify Columns</a>, a <a href="{@docRoot}training/app-indexing/deep-linking.html">
+deep link</a> to your content appears in the details screen that launches when the user selects a
+search result.</p>
+
+<p>When the user selects the link for your app, identified by the "Available On" button in the
+details screen, the system launches the activity which handles the {@link android.content.Intent#ACTION_VIEW}
+(set as <a href="{@docRoot}guide/topics/search/searchable-config.html#searchSuggestIntentAction">
+{@code android:searchSuggestIntentAction}</a> with the value {@code "android.intent.action.VIEW"} in
+the <a href="{@docRoot}guide/topics/search/searchable-config.html">{@code searchable.xml}</a> file).</p>
+
+<p>You can also set up a custom intent to launch your activity, and this is demonstrated in the
+<a class="external-link" href="https://github.com/googlesamples/androidtv-Leanback">Android Leanback
+sample app</a>. Note that the sample app launches its own <code>LeanbackDetailsFragment</code> to
+show the details for the selected media, but you should launch the activity that plays the media
+immediately to save the user another click or two.</p>
+
+
+
+
+
+
diff --git a/docs/html/training/tv/games/index.jd b/docs/html/training/tv/games/index.jd
index 371e9e9..7a3365d 100644
--- a/docs/html/training/tv/games/index.jd
+++ b/docs/html/training/tv/games/index.jd
@@ -142,6 +142,11 @@
</p>
+<h3 id="button-independence">Use appropriate buttons</h3>
+
+<p>Not all game controllers provide Start, Search, or Menu buttons. Be sure your UI does not depend
+upon the use of these buttons.</p>
+
<h3 id="multiple-controllers">Handle multiple controllers</h3>
<p>
@@ -276,7 +281,7 @@
<h3 id="saving">Saving</h3>
<p>
- We highly recommend using Play Services <a href=
+ Use Google Play Services <a href=
"https://developers.google.com/games/services/common/concepts/savedgames">Saved Games</a> to store
your game save. Your game should bind game saves to a specific Google account, so as to be
uniquely identifiable even across devices: Whether the player is using a handset or a TV, the
@@ -301,15 +306,27 @@
site.
</p>
+<h3 id="exit">Exit</h3>
+
+<p>Provide a consistent and obvious UI element that lets the user exit the game gracefully. This
+element should be accessible with the D-pad navigation buttons. Do this instead of relying on the
+Home button to provide an exit, as that is not consistent nor reliable across different controllers.</p>
+
<h2 id="web">Web</h2>
<p>
- We discourage enabling web browsing in games for Android TV. The television set is not
- well-suited for browsing, either in terms of display or control scheme.
+ Do not enable web browsing in games for Android TV. Android TV does not support a web browser.
</p>
<p class="note">
<strong>Note:</strong> You can use the {@link android.webkit.WebView} class for logins to
services like Google+ and Facebook.
</p>
+
+<h2 id="networking">Networking</h2>
+
+<p>Games frequently need greater bandwidth to provide optimum performance, and many users prefer
+ethernet to WiFi to provide that performance. Your app should check for both WiFi and ethernet
+connections. If your app is for TV only, you do not need to check for 3G/LTE service as you would
+for a mobile app.</p>
diff --git a/docs/html/training/tv/publishing/checklist.jd b/docs/html/training/tv/publishing/checklist.jd
new file mode 100644
index 0000000..865a89b
--- /dev/null
+++ b/docs/html/training/tv/publishing/checklist.jd
@@ -0,0 +1,207 @@
+page.title=TV Apps Checklist
+page.tags="tv", "checklist"
+page.article=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>Checklist sections</h2>
+ <ul>
+ <li><a href="#leanback">TV Form Factor Support</a></li>
+ <li><a href="#design">User Interface Design</a></li>
+ <li><a href="#discovery">Search and Content Discovery</a></li>
+ <li><a href="#games">Games</a></li>
+ </ul>
+ <h2>You should also read</h2>
+ <ul>
+ <li><a href="{@docRoot}distribute/essentials/quality/tv.html">TV App Quality</a></li>
+ <li><a href="http://android-developers.blogspot.com/2014/10/material-design-on-android-checklist.html">
+ Material Design on Android Checklist</a></li>
+ <li><a href="{@docRoot}distribute/tools/launch-checklist.html">
+ Launch Checklist</a></li>
+ </ul>
+</div>
+</div>
+
+<p>
+ Users enjoy the TV app experience when it is consistent, logical, and predictable.
+ They should be able to navigate within your app and throughout Android TV without getting lost or
+ having to "reset" the UI and start over. Users appreciate clear, colorful, and functional interfaces
+ that make the experience magical. With these ideas in mind, you can create an app that fits nicely
+ in Android TV and performs as users expect.
+</p>
+
+<p>
+ This checklist covers the main aspects of development for both apps and games and provides
+ guidelines to ensure that your app provides the best possible experience. Additional considerations
+ for games only are covered in the <em>Games</em> section.
+</p>
+
+<p>
+ For criteria that qualify an Android TV app on Google Play, see
+ <a href="{@docRoot}distribute/essentials/quality/tv.html">TV App Quality</a>.
+</p>
+
+<h2 id="leanback">TV Form Factor Support</h2>
+
+<p>These checklist items apply to <strong>Games</strong> and <strong>Apps</strong>.</p>
+
+<ol>
+
+<li>
+ Identify the main TV activity with the {@link android.content.Intent#CATEGORY_LEANBACK_LAUNCHER}
+ filter in the manifest.
+ <p>See <a href="{@docRoot}training/tv/start/start.html#tv-activity">Declare a TV Activity</a>.</p>
+</li>
+
+<li>
+ Provide a home screen banner for each language supported by your app
+ <ul>
+ <li>Launcher app banner measures 320x180 px</li>
+ <li>Banner resource is located in the {@code drawables/xhdpi} directory</li>
+ <li>Banner image includes localized text to identify the app.</li>
+ </ul>
+ <p>See <a href="{@docRoot}training/tv/start/start.html#banner">Provide a home screen banner</a>.</p>
+</li>
+
+<li>
+ Eliminate requirements for unsupported hardware in your app.
+ <p>See <a href="training/tv/start/hardware.html#declare-hardware-requirements">Declaring hardware requirements for TV</a>.</p>
+</li>
+
+<li>
+ Ensure permissions do not imply hardware requirements
+ <p>See <a href="training/tv/start/hardware.html#hardware-permissions">Declaring permissions that imply hardware features</a>.</p>
+</li>
+
+</ol>
+
+
+<h2 id="design">User Interface Design</h2>
+
+<p>These checklist items apply to <strong>Games</strong> and <strong>Apps</strong>.</p>
+
+<ol>
+
+<li>
+ Provide appropriate layout resources for landscape mode.
+ <p>See <a href="{@docRoot}training/tv/start/layouts.html#structure">Build Basic TV Layouts</a>.</p>
+</li>
+
+<li>
+ Ensure that text and controls are large enough to be visible from a distance.
+ <p>See <a href="{@docRoot}training/tv/start/layouts.html#visibility">Build Useable Text and Controls</a>.</p>
+</li>
+
+<li>
+ Provide high-resolution bitmaps and icons for HDTV screens.
+ <p>See <a href="{@docRoot}training/tv/start/layouts.html#density-resources">Manage Layout Resources for TV</a>.</p>
+</li>
+
+<li>
+ Make sure your icons and logo conform to Android TV specifications.
+ <p>See <a href="{@docRoot}design/tv/patterns.html#icons">Manage Layout Resources for TV</a>.</p>
+</li>
+
+<li>
+ Allow for overscan in your layout.
+ <p>See <a href="{@docRoot}training/tv/start/layouts.html#overscan">Overscan</a>.</p>
+</li>
+
+<li>
+ Make every UI element work with both D-pad and game controllers.
+ <p>See <a href="{@docRoot}training/tv/start/navigation.html">Creating Navigation</a>
+ and <a href="{@docRoot}training/tv/start/hardware.html#controllers">Handling Controllers</a>.</p>
+</li>
+
+<li>
+ Change the background image as users browse through content.
+ <p>See <a href="{@docRoot}training/tv/playback/browse.html#background">Update the Background</a>.</p>
+</li>
+
+<li>
+ Customize the background color to match your branding in Leanback fragments.
+ <p>See <a href="{@docRoot}training/tv/playback/card.html#background">Customize the Card View</a>.</p>
+</li>
+
+<li>
+ Ensure that your UI does not require a touch screen.
+ <p>See <a href="{@docRoot}training/tv/start/hardware.html#no-touchscreen">Touch screen</a> and
+ <a href="{@docRoot}training/tv/start/start.html#no-touchscreen">Declare touch screen not
+ required</a>.</p>
+</li>
+
+<li>
+ Follow guidelines for effective advertising.
+ <p>See <a href="{@docRoot}training/tv/start/layouts.html#advertising">Provide Effective Advertising</a>.</p>
+</li>
+
+</ol>
+
+
+<h2 id="discovery">Search and Content Discovery</h2>
+
+<p>These checklist items apply to <strong>Games</strong> and <strong>Apps</strong>.</p>
+
+<ol>
+
+<li>
+ Provide search results from your app in the Android TV global search box.
+ <p>See <a href="{@docRoot}training/tv/discovery/searchable.html#provide">Provide Data</a>.</p>
+</li>
+
+<li>
+ Provide TV-specific data fields for search.
+ <p>See <a href="{@docRoot}training/tv/discovery/searchable.html#columns">Identify Columns</a>.</p>
+</li>
+
+<li>
+ Make sure your app presents discovered content in a details screen that lets the user start watching
+ the content immediately.
+ <p>See <a href="{@docRoot}training/tv/discovery/searchable.html#details">Display Your App in the
+ Details Screen</a>.</p>
+</li>
+
+<li>
+ Put relevant, actionable content and categories on the main screen, making it easy to discover content.
+ <p>See <a href="{@docRoot}training/tv/discovery/recommendations.html">Recommending TV Content</a>.</p>
+</li>
+
+</ol>
+
+
+<h2 id="games">Games</h2>
+
+<p>These checklist items apply to <strong>Games</strong>.</p>
+
+<ol>
+
+<li>
+ Show your game on the home screen with the {@code isGame} flag in the manifest.
+ <p>See <a href="{@docRoot}training/tv/games/index.html#Launcher">Show your game on the home screen</a>.</p>
+</li>
+
+<li>
+ Make sure game controller support does not depend upon the Start, Select, or Menu buttons (not all
+ controllers have these).
+ <p>See <a href="{@docRoot}training/tv/games/index.html#control">Input Devices</a>.</p>
+</li>
+
+<li>
+ Use a generic gamepad graphic (without specific controller branding) to show game button mappings.
+ <p>See <a href="{@docRoot}training/tv/games/index.html#ControllerHelp">Show controller instructions</a>.</p>
+</li>
+
+<li>
+ Check for both ethernet and WiFi connectivity.
+ <p>See <a href="{@docRoot}training/tv/games/index.html#networking">Networking</a>.</p>
+</li>
+
+<li>
+ Provide users with a clean exit.
+ <p>See <a href="{@docRoot}training/tv/games/index.html#exit">Exit</a>.</p>
+</li>
+
+
+</ol>
diff --git a/docs/html/training/tv/start/hardware.jd b/docs/html/training/tv/start/hardware.jd
index b25a0dd..57651e6 100644
--- a/docs/html/training/tv/start/hardware.jd
+++ b/docs/html/training/tv/start/hardware.jd
@@ -1,6 +1,5 @@
page.title=Handling TV Hardware
-page.tags=tv
-helpoutsWidget=true
+page.tags="unsupported"
trainingnavtop=true
@jd:body
@@ -89,6 +88,10 @@
<td>{@code android.hardware.touchscreen}</td>
</tr>
<tr>
+ <td>Touchscreen emulator</td>
+ <td>{@code android.hardware.faketouch}</td>
+ </tr>
+ <tr>
<td>Telephony</td>
<td>{@code android.hardware.telephony}</td>
</tr>
@@ -97,6 +100,10 @@
<td>{@code android.hardware.camera}</td>
</tr>
<tr>
+ <td>Bluetooth</td>
+ <td>{@code android.hardware.bluetooth}</td>
+ </tr>
+ <tr>
<td>Near Field Communications (NFC)</td>
<td>{@code android.hardware.nfc}</td>
</tr>
@@ -105,11 +112,26 @@
<td>{@code android.hardware.location.gps}</td>
</tr>
<tr>
- <td>Microphone</td>
+ <td>Microphone <sup><a href="#cont-mic">[1]</a></sup></td>
<td>{@code android.hardware.microphone}</td>
</tr>
+ <tr>
+ <td>Sensors</td>
+ <td>{@code android.hardware.sensor}</td>
+ </tr>
</table>
+<p id="cont-mic" class="note">
+ <strong>[1]</strong> Some TV controllers have a microphone, which is
+ not the same as the microphone hardware feature described here. The controller microphone is fully
+ supported.
+</p>
+
+<p>
+ See the <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html#features-reference">
+ Features Reference</a> for a complete list of features, subfeatures, and their descriptors.
+</p>
+
<h3 id="declare-hardware-requirements">Declaring hardware requirements for TV</h3>
@@ -131,18 +153,29 @@
<pre>
<uses-feature android:name="android.hardware.touchscreen"
android:required="false"/>
+<uses-feature android:name="android.hardware.faketouch"
+ android:required="false"/>
<uses-feature android:name="android.hardware.telephony"
android:required="false"/>
<uses-feature android:name="android.hardware.camera"
android:required="false"/>
+<uses-feature android:name="android.hardware.bluetooth"
+ android:required="false"/>
<uses-feature android:name="android.hardware.nfc"
android:required="false"/>
<uses-feature android:name="android.hardware.gps"
android:required="false"/>
<uses-feature android:name="android.hardware.microphone"
android:required="false"/>
+<uses-feature android:name="android.hardware.sensor"
+ android:required="false"/>
</pre>
+<p class="note"><strong>Note:</strong> Some features have subfeatures like {@code android.hardware.camera.front},
+ as described in the <a href="guide/topics/manifest/uses-feature-element.html#features-reference">
+ Feature Reference</a>. Be sure to mark as {@code required="false"} any subfeatures also used in
+ your app.</p>
+
<p>
All apps intended for use on TV devices must declare that the touch screen feature is not required
as described in <a href="{@docRoot}training/tv/start/start.html#no-touchscreen">Get Started with
@@ -207,7 +240,7 @@
</table>
<p>
- For a complete list of permission requests that imply a hardware feature requirement, see
+ For a complete list of permission requests that imply a hardware feature requirement, see the
<a href="{@docRoot}guide/topics/manifest/uses-feature-element.html#permissions-features">{@code
uses-feature}</a> guide. If your app requests one of the features listed above, include a
<a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code uses-feature}</a>
@@ -246,7 +279,8 @@
<p>
Since most TVs do not have touch screens, Android does not support touch screen interaction for
TV devices. Furthermore, using a touch screen is not consistent with a viewing environment where
- the user is seated 10 feet away from the display.
+ the user is seated 10 feet away from the display. Make sure that your UI elements and text do not
+ require or imply the use of a touchscreen.
</p>
<p>
diff --git a/docs/html/training/tv/start/layouts.jd b/docs/html/training/tv/start/layouts.jd
index a390702..177ea7a 100644
--- a/docs/html/training/tv/start/layouts.jd
+++ b/docs/html/training/tv/start/layouts.jd
@@ -16,6 +16,7 @@
<li><a href="#density-resources">Manage Layout Resources for TV</a></li>
<li><a href="#anti-patterns">Avoid Layout Anti-Patterns</a></li>
<li><a href="#large-bitmaps">Handle Large Bitmaps</a></li>
+ <li><a href="#advertising">Provide Effective Advertising</a></li>
</ol>
<h2>You should also read</h2>
<ol>
@@ -258,3 +259,17 @@
For more information on getting the best performance when working with images, see
<a href="{@docRoot}training/displaying-bitmaps/index.html">Displaying Bitmaps Efficiently</a>.
</p>
+
+<h2 id="advertising">Provide Effective Advertising</h2>
+
+<p>Advertising on Android TV must always be full-screen. Ads must not appear alongside or over
+content. The user must be able to dismiss an advertisement with the D-pad controller. Video ads must
+be dismissible within 30 seconds of their start time.</p>
+
+<p>Android TV does not provide a web browser. Your ads must not attempt to launch a web browser or
+redirect to the Google Play Store.</p>
+
+<p class="note">
+ <strong>Note:</strong> You can use the {@link android.webkit.WebView} class for logins to
+ services like Google+ and Facebook.
+</p>
\ No newline at end of file
diff --git a/docs/html/training/tv/start/start.jd b/docs/html/training/tv/start/start.jd
index e3b92c6..2766e90 100644
--- a/docs/html/training/tv/start/start.jd
+++ b/docs/html/training/tv/start/start.jd
@@ -1,6 +1,5 @@
page.title=Get Started with TV Apps
-page.tags=tv, leanback, recyclerview
-helpoutsWidget=true
+page.tags="leanback","recyclerview","launcher"
trainingnavtop=true
startpage=true
@@ -145,6 +144,22 @@
"{@docRoot}training/tv/start/layouts.html">Building TV Layouts</a>.
</p>
+<h3 id="leanback-req">Declare Leanback support</h3>
+
+<p>
+ Declare that your app uses the Leanback user interface required by Android TV. If you are developing
+ an app that runs on mobile (phones, wearables, tablets, etc.) as well as Android TV, set the
+ {@code required} attribute value to {@code false}. If you set the {@code required} attribute value
+ to {@code true}, your app will run only on devices that use the Leanback UI.
+</p>
+
+<pre>
+<manifest>
+ <uses-feature android:name="android.software.leanback"
+ android:required="false" />
+ ...
+</manifest>
+</pre>
<h3 id="no-touchscreen">Declare touchscreen not required</h3>
@@ -158,8 +173,8 @@
<pre>
<manifest>
- <strong><uses-feature android:name="android.hardware.touchscreen"
- android:required="false" /></strong>
+ <uses-feature android:name="android.hardware.touchscreen"
+ android:required="false" />
...
</manifest>
</pre>
@@ -173,9 +188,9 @@
<h3 id="banner">Provide a home screen banner</h3>
<p>
- An application must provide a home screen banner if it includes a Leanback launcher intent
- filter. The banner is the app launch point that appears on the home screen in the apps and
- games rows. Desribe the banner in the manifest as follows:
+ An application must provide a home screen banner for each localization if it includes a Leanback
+ launcher intent filter. The banner is the app launch point that appears on the home screen in the
+ apps and games rows. Desribe the banner in the manifest as follows:
</p>
<pre>
@@ -263,9 +278,10 @@
TV apps that play videos and music, and let users browse for the content they want.
</li>
<li>
- <a href="{@docRoot}training/tv/search/index.html">Surfacing Content on TV</a> - With all the
- content choices at users' fingertips, helping them find content they enjoy is almost as important
- as providing that content. This training discusses how to surface your content on TV devices.
+ <a href="{@docRoot}training/tv/discovery/index.html">Helping Users Find Your Content on TV</a> -
+ With all the content choices at users' fingertips, helping them find content they enjoy is almost
+ as important as providing that content. This training discusses how to surface your content on
+ TV devices.
</li>
<li>
<a href="{@docRoot}training/tv/games/index.html">Games for TV</a> - TV devices are a great
diff --git a/docs/html/training/wearables/watch-faces/service.jd b/docs/html/training/wearables/watch-faces/service.jd
index 87ebefa..77c417f 100644
--- a/docs/html/training/wearables/watch-faces/service.jd
+++ b/docs/html/training/wearables/watch-faces/service.jd
@@ -164,21 +164,25 @@
@Override
public void onCreate(SurfaceHolder holder) {
+ super.onCreate(holder);
/* initialize your watch face */
}
@Override
public void onPropertiesChanged(Bundle properties) {
+ super.onPropertiesChanged(properties);
/* get device features (burn-in, low-bit ambient) */
}
@Override
public void onTimeTick() {
+ super.onTimeTick();
/* the time changed */
}
@Override
public void onAmbientModeChanged(boolean inAmbientMode) {
+ super.onAmbientModeChanged(inAmbientMode);
/* the wearable switched between modes */
}
@@ -189,6 +193,7 @@
@Override
public void onVisibilityChanged(boolean visible) {
+ super.onVisibilityChanged(visible);
/* the watch face became visible or invisible */
}
}
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 2a7e177..e4c2f0e 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -1646,7 +1646,7 @@
*
* @param text The text to be drawn
* @param x The x-coordinate of the origin of the text being drawn
- * @param y The y-coordinate of the origin of the text being drawn
+ * @param y The y-coordinate of the baseline of the text being drawn
* @param paint The paint used for the text (e.g. color, size, style)
*/
public void drawText(@NonNull char[] text, int index, int count, float x, float y,
@@ -1665,7 +1665,7 @@
*
* @param text The text to be drawn
* @param x The x-coordinate of the origin of the text being drawn
- * @param y The y-coordinate of the origin of the text being drawn
+ * @param y The y-coordinate of the baseline of the text being drawn
* @param paint The paint used for the text (e.g. color, size, style)
*/
public void drawText(@NonNull String text, float x, float y, @NonNull Paint paint) {
@@ -1681,7 +1681,7 @@
* @param start The index of the first character in text to draw
* @param end (end - 1) is the index of the last character in text to draw
* @param x The x-coordinate of the origin of the text being drawn
- * @param y The y-coordinate of the origin of the text being drawn
+ * @param y The y-coordinate of the baseline of the text being drawn
* @param paint The paint used for the text (e.g. color, size, style)
*/
public void drawText(@NonNull String text, int start, int end, float x, float y,
diff --git a/graphics/java/android/graphics/Movie.java b/graphics/java/android/graphics/Movie.java
index dd5b62d..ecb4255 100644
--- a/graphics/java/android/graphics/Movie.java
+++ b/graphics/java/android/graphics/Movie.java
@@ -37,14 +37,15 @@
public native boolean setTime(int relativeMilliseconds);
- private native void nDraw(Canvas canvas, float x, float y, long paintHandle);
+ private native void nDraw(long nativeCanvas, float x, float y, long paintHandle);
public void draw(Canvas canvas, float x, float y, Paint paint) {
- nDraw(canvas, x, y, paint != null ? paint.getNativeInstance() : 0);
+ nDraw(canvas.getNativeCanvasWrapper(), x, y,
+ paint != null ? paint.getNativeInstance() : 0);
}
public void draw(Canvas canvas, float x, float y) {
- nDraw(canvas, x, y, 0);
+ nDraw(canvas.getNativeCanvasWrapper(), x, y, 0);
}
public static Movie decodeStream(InputStream is) {
diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java
index f2b635a..945ae2e 100644
--- a/graphics/java/android/graphics/drawable/BitmapDrawable.java
+++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java
@@ -357,6 +357,11 @@
invalidateSelf();
}
+ @Override
+ public boolean getDither() {
+ return mBitmapState.mPaint.isDither();
+ }
+
/**
* Indicates the repeat behavior of this drawable on the X axis.
*
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index 0e38cc0..fa269e0 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -274,6 +274,14 @@
public void setDither(boolean dither) {}
/**
+ * @return whether this drawable dither its colors
+ * @see #setDither(boolean)
+ */
+ public boolean getDither() {
+ return false;
+ }
+
+ /**
* Set to true to have the drawable filter its bitmap when scaled or rotated
* (for drawables that use bitmaps). If the drawable does not use bitmaps,
* this call is ignored. This can improve the look when scaled or rotated,
@@ -282,6 +290,14 @@
public void setFilterBitmap(boolean filter) {}
/**
+ * @return whether this drawable filters its bitmap
+ * @see #setFilterBitmap(boolean)
+ */
+ public boolean getFilterBitmap() {
+ return false;
+ }
+
+ /**
* Implement this interface if you want to create an animated drawable that
* extends {@link android.graphics.drawable.Drawable Drawable}.
* Upon retrieving a drawable, use
diff --git a/graphics/java/android/graphics/drawable/DrawableContainer.java b/graphics/java/android/graphics/drawable/DrawableContainer.java
index 39ef10c..557f563 100644
--- a/graphics/java/android/graphics/drawable/DrawableContainer.java
+++ b/graphics/java/android/graphics/drawable/DrawableContainer.java
@@ -167,6 +167,11 @@
}
@Override
+ public boolean getDither() {
+ return mDrawableContainerState.mDither;
+ }
+
+ @Override
public void setColorFilter(ColorFilter cf) {
mDrawableContainerState.mHasColorFilter = (cf != null);
diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java
index 7882705..cc2de22 100644
--- a/graphics/java/android/graphics/drawable/GradientDrawable.java
+++ b/graphics/java/android/graphics/drawable/GradientDrawable.java
@@ -822,6 +822,11 @@
}
@Override
+ public boolean getDither() {
+ return mGradientState.mDither;
+ }
+
+ @Override
public ColorFilter getColorFilter() {
return mColorFilter;
}
diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java
index 4aa5f59..daf4427 100644
--- a/graphics/java/android/graphics/drawable/LayerDrawable.java
+++ b/graphics/java/android/graphics/drawable/LayerDrawable.java
@@ -648,6 +648,18 @@
}
@Override
+ public boolean getDither() {
+ final ChildDrawable[] array = mLayerState.mChildren;
+ if (mLayerState.mNum > 0) {
+ // All layers should have the same dither set on them - just return
+ // the first one
+ return array[0].mDrawable.getDither();
+ } else {
+ return super.getDither();
+ }
+ }
+
+ @Override
public void setAlpha(int alpha) {
final ChildDrawable[] array = mLayerState.mChildren;
final int N = mLayerState.mNum;
diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
index a6299be3..617bf7c 100644
--- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java
+++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
@@ -374,6 +374,11 @@
}
@Override
+ public boolean getDither() {
+ return mPaint == null ? DEFAULT_DITHER : mPaint.isDither();
+ }
+
+ @Override
public void setAutoMirrored(boolean mirrored) {
mNinePatchState.mAutoMirrored = mirrored;
}
diff --git a/graphics/java/android/graphics/drawable/PictureDrawable.java b/graphics/java/android/graphics/drawable/PictureDrawable.java
index 6dcda1f..583cffb2 100644
--- a/graphics/java/android/graphics/drawable/PictureDrawable.java
+++ b/graphics/java/android/graphics/drawable/PictureDrawable.java
@@ -88,12 +88,6 @@
}
@Override
- public void setFilterBitmap(boolean filter) {}
-
- @Override
- public void setDither(boolean dither) {}
-
- @Override
public void setColorFilter(ColorFilter colorFilter) {}
@Override
diff --git a/graphics/java/android/graphics/drawable/ShapeDrawable.java b/graphics/java/android/graphics/drawable/ShapeDrawable.java
index c49bc8c..c208c03 100644
--- a/graphics/java/android/graphics/drawable/ShapeDrawable.java
+++ b/graphics/java/android/graphics/drawable/ShapeDrawable.java
@@ -329,6 +329,11 @@
}
@Override
+ public boolean getDither() {
+ return mShapeState.mPaint.isDither();
+ }
+
+ @Override
protected void onBoundsChange(Rect bounds) {
super.onBoundsChange(bounds);
updateShape();
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index 21dba43..f937ddb 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -926,9 +926,10 @@
// Basically the Mfinal = Mviewport * M0 * M1 * M2;
// Mi the local matrix at level i of the group tree.
currentGroup.mStackedMatrix.set(currentMatrix);
-
currentGroup.mStackedMatrix.preConcat(currentGroup.mLocalMatrix);
+ // Save the current clip information, which is local to this group.
+ canvas.save();
// Draw the group tree in the same order as the XML file.
for (int i = 0; i < currentGroup.mChildren.size(); i++) {
Object child = currentGroup.mChildren.get(i);
@@ -941,6 +942,7 @@
drawPath(currentGroup, childPath, canvas, w, h, filter);
}
}
+ canvas.restore();
}
public void draw(Canvas canvas, int w, int h, ColorFilter filter) {
diff --git a/libs/androidfw/misc.cpp b/libs/androidfw/misc.cpp
index ea54cc5..5285420 100644
--- a/libs/androidfw/misc.cpp
+++ b/libs/androidfw/misc.cpp
@@ -56,9 +56,11 @@
return kFileTypeBlockDev;
else if (S_ISFIFO(sb.st_mode))
return kFileTypeFifo;
-#ifdef HAVE_SYMLINKS
+#if defined(S_ISLNK)
else if (S_ISLNK(sb.st_mode))
return kFileTypeSymlink;
+#endif
+#if defined(S_ISSOCK)
else if (S_ISSOCK(sb.st_mode))
return kFileTypeSocket;
#endif
diff --git a/libs/hwui/DamageAccumulator.cpp b/libs/hwui/DamageAccumulator.cpp
index a422622..9bd3bdc 100644
--- a/libs/hwui/DamageAccumulator.cpp
+++ b/libs/hwui/DamageAccumulator.cpp
@@ -222,7 +222,7 @@
LOG_ALWAYS_FATAL_IF(mHead->prev != mHead, "Cannot finish, mismatched push/pop calls! %p vs. %p", mHead->prev, mHead);
// Root node never has a transform, so this is the fully mapped dirty rect
*totalDirty = mHead->pendingDirty;
- totalDirty->roundOut();
+ totalDirty->roundOut(totalDirty);
mHead->pendingDirty.setEmpty();
}
diff --git a/libs/hwui/DisplayList.cpp b/libs/hwui/DisplayList.cpp
index 249ada0..9832e60 100644
--- a/libs/hwui/DisplayList.cpp
+++ b/libs/hwui/DisplayList.cpp
@@ -46,12 +46,6 @@
resourceCache.decrementRefcountLocked(bitmapResources.itemAt(i));
}
- for (size_t i = 0; i < ownedBitmapResources.size(); i++) {
- const SkBitmap* bitmap = ownedBitmapResources.itemAt(i);
- resourceCache.decrementRefcountLocked(bitmap);
- resourceCache.destructorLocked(bitmap);
- }
-
for (size_t i = 0; i < patchResources.size(); i++) {
resourceCache.decrementRefcountLocked(patchResources.itemAt(i));
}
@@ -63,7 +57,6 @@
resourceCache.unlock();
bitmapResources.clear();
- ownedBitmapResources.clear();
patchResources.clear();
sourcePaths.clear();
paints.clear();
diff --git a/libs/hwui/DisplayList.h b/libs/hwui/DisplayList.h
index cfd60ad..011b509 100644
--- a/libs/hwui/DisplayList.h
+++ b/libs/hwui/DisplayList.h
@@ -134,7 +134,6 @@
int projectionReceiveIndex;
Vector<const SkBitmap*> bitmapResources;
- Vector<const SkBitmap*> ownedBitmapResources;
Vector<const Res_png_9patch*> patchResources;
std::vector<std::unique_ptr<const SkPaint>> paints;
diff --git a/libs/hwui/DisplayListOp.h b/libs/hwui/DisplayListOp.h
index 1b5af49..36c14c4 100644
--- a/libs/hwui/DisplayListOp.h
+++ b/libs/hwui/DisplayListOp.h
@@ -734,27 +734,6 @@
Rect mSrc;
};
-class DrawBitmapDataOp : public DrawBitmapOp {
-public:
- DrawBitmapDataOp(const SkBitmap* bitmap, const SkPaint* paint)
- : DrawBitmapOp(bitmap, paint) {}
-
- virtual void applyDraw(OpenGLRenderer& renderer, Rect& dirty) override {
- renderer.drawBitmapData(mBitmap, mPaint);
- }
-
- virtual void output(int level, uint32_t logFlags) const override {
- OP_LOG("Draw bitmap %p", mBitmap);
- }
-
- virtual const char* name() override { return "DrawBitmapData"; }
-
- virtual void onDefer(OpenGLRenderer& renderer, DeferInfo& deferInfo,
- const DeferredDisplayState& state) override {
- deferInfo.batchId = DeferredDisplayList::kOpBatch_Bitmap;
- }
-};
-
class DrawBitmapMeshOp : public DrawBoundedOp {
public:
DrawBitmapMeshOp(const SkBitmap* bitmap, int meshWidth, int meshHeight,
diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp
index ca21e4e..c7de03a 100644
--- a/libs/hwui/DisplayListRenderer.cpp
+++ b/libs/hwui/DisplayListRenderer.cpp
@@ -266,13 +266,6 @@
}
}
-void DisplayListRenderer::drawBitmapData(const SkBitmap* bitmap, const SkPaint* paint) {
- bitmap = refBitmapData(bitmap);
- paint = refPaint(paint);
-
- addDrawOp(new (alloc()) DrawBitmapDataOp(bitmap, paint));
-}
-
void DisplayListRenderer::drawBitmapMesh(const SkBitmap& bitmap, int meshWidth, int meshHeight,
const float* vertices, const int* colors, const SkPaint* paint) {
int vertexCount = (meshWidth + 1) * (meshHeight + 1);
diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h
index 01fcdd3..8f8d24c 100644
--- a/libs/hwui/DisplayListRenderer.h
+++ b/libs/hwui/DisplayListRenderer.h
@@ -101,8 +101,6 @@
// Bitmap-based
void drawBitmap(const SkBitmap* bitmap, const SkPaint* paint);
- // TODO: move drawBitmapData() to Canvas.h
- void drawBitmapData(const SkBitmap* bitmap, const SkPaint* paint);
// TODO: move drawPatch() to Canvas.h
void drawPatch(const SkBitmap* bitmap, const Res_png_9patch* patch,
float left, float top, float right, float bottom, const SkPaint* paint);
@@ -367,15 +365,9 @@
// correctly, such as creating the bitmap from scratch, drawing with it, changing its
// contents, and drawing again. The only fix would be to always copy it the first time,
// which doesn't seem worth the extra cycles for this unlikely case.
- mDisplayListData->bitmapResources.add(bitmap);
- mResourceCache.incrementRefcount(bitmap);
- return bitmap;
- }
-
- inline const SkBitmap* refBitmapData(const SkBitmap* bitmap) {
- mDisplayListData->ownedBitmapResources.add(bitmap);
- mResourceCache.incrementRefcount(bitmap);
- return bitmap;
+ const SkBitmap* cachedBitmap = mResourceCache.insert(bitmap);
+ mDisplayListData->bitmapResources.add(cachedBitmap);
+ return cachedBitmap;
}
inline const Res_png_9patch* refPatch(const Res_png_9patch* patch) {
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 3c8fb8b..d1e51e1 100755
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -2006,24 +2006,6 @@
mDirty = true;
}
-void OpenGLRenderer::drawBitmapData(const SkBitmap* bitmap, const SkPaint* paint) {
- if (quickRejectSetupScissor(0, 0, bitmap->width(), bitmap->height())) {
- return;
- }
-
- mCaches.activeTexture(0);
- Texture* texture = mCaches.textureCache.getTransient(bitmap);
- const AutoTexture autoCleanup(texture);
-
- if (CC_UNLIKELY(bitmap->colorType() == kAlpha_8_SkColorType)) {
- drawAlphaBitmap(texture, 0, 0, paint);
- } else {
- drawTextureRect(0, 0, bitmap->width(), bitmap->height(), texture, paint);
- }
-
- mDirty = true;
-}
-
void OpenGLRenderer::drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight,
const float* vertices, const int* colors, const SkPaint* paint) {
if (!vertices || mState.currentlyIgnored()) {
diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h
index 9d9b3d2..75e79d6 100755
--- a/libs/hwui/OpenGLRenderer.h
+++ b/libs/hwui/OpenGLRenderer.h
@@ -162,7 +162,6 @@
virtual void drawBitmap(const SkBitmap* bitmap, float srcLeft, float srcTop,
float srcRight, float srcBottom, float dstLeft, float dstTop,
float dstRight, float dstBottom, const SkPaint* paint) override;
- virtual void drawBitmapData(const SkBitmap* bitmap, const SkPaint* paint) override;
virtual void drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight,
const float* vertices, const int* colors, const SkPaint* paint) override;
void drawPatches(const SkBitmap* bitmap, AssetAtlas::Entry* entry,
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index b448949..23462cc 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -223,7 +223,7 @@
}
if (dirty.intersect(0, 0, getWidth(), getHeight())) {
- dirty.roundOut();
+ dirty.roundOut(&dirty);
mLayer->updateDeferred(this, dirty.fLeft, dirty.fTop, dirty.fRight, dirty.fBottom);
}
// This is not inside the above if because we may have called
@@ -338,11 +338,6 @@
if (subtree) {
TextureCache& cache = Caches::getInstance().textureCache;
info.out.hasFunctors |= subtree->functors.size();
- // TODO: Fix ownedBitmapResources to not require disabling prepareTextures
- // and thus falling out of async drawing path.
- if (subtree->ownedBitmapResources.size()) {
- info.prepareTextures = false;
- }
for (size_t i = 0; info.prepareTextures && i < subtree->bitmapResources.size(); i++) {
info.prepareTextures = cache.prefetchAndMarkInUse(subtree->bitmapResources[i]);
}
diff --git a/libs/hwui/Renderer.h b/libs/hwui/Renderer.h
index 3240bbc..48d83b9 100644
--- a/libs/hwui/Renderer.h
+++ b/libs/hwui/Renderer.h
@@ -155,7 +155,6 @@
virtual void drawBitmap(const SkBitmap* bitmap, float srcLeft, float srcTop,
float srcRight, float srcBottom, float dstLeft, float dstTop,
float dstRight, float dstBottom, const SkPaint* paint) = 0;
- virtual void drawBitmapData(const SkBitmap* bitmap, const SkPaint* paint) = 0;
virtual void drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight,
const float* vertices, const int* colors, const SkPaint* paint) = 0;
virtual void drawPatch(const SkBitmap* bitmap, const Res_png_9patch* patch,
diff --git a/libs/hwui/ResourceCache.cpp b/libs/hwui/ResourceCache.cpp
index 45c27c2..2d1adc5 100644
--- a/libs/hwui/ResourceCache.cpp
+++ b/libs/hwui/ResourceCache.cpp
@@ -16,7 +16,6 @@
#define LOG_TAG "OpenGLRenderer"
-#include <SkPixelRef.h>
#include "ResourceCache.h"
#include "Caches.h"
@@ -37,8 +36,8 @@
ResourceReference* ref = mCache->valueAt(i);
ALOGD(" ResourceCache: mCache(%zu): resource, ref = 0x%p, 0x%p",
i, mCache->keyAt(i), mCache->valueAt(i));
- ALOGD(" ResourceCache: mCache(%zu): refCount, recycled, destroyed, type = %d, %d, %d, %d",
- i, ref->refCount, ref->recycled, ref->destroyed, ref->resourceType);
+ ALOGD(" ResourceCache: mCache(%zu): refCount, destroyed, type = %d, %d, %d",
+ i, ref->refCount, ref->destroyed, ref->resourceType);
}
}
@@ -60,15 +59,26 @@
mLock.unlock();
}
+const SkBitmap* ResourceCache::insert(const SkBitmap* bitmapResource) {
+ Mutex::Autolock _l(mLock);
+
+ BitmapKey bitmapKey(bitmapResource);
+ ssize_t index = mBitmapCache.indexOfKey(bitmapKey);
+ if (index == NAME_NOT_FOUND) {
+ SkBitmap* cachedBitmap = new SkBitmap(*bitmapResource);
+ index = mBitmapCache.add(bitmapKey, cachedBitmap);
+ return cachedBitmap;
+ }
+
+ mBitmapCache.keyAt(index).mRefCount++;
+ return mBitmapCache.valueAt(index);
+}
+
void ResourceCache::incrementRefcount(void* resource, ResourceType resourceType) {
Mutex::Autolock _l(mLock);
incrementRefcountLocked(resource, resourceType);
}
-void ResourceCache::incrementRefcount(const SkBitmap* bitmapResource) {
- incrementRefcount((void*) bitmapResource, kBitmap);
-}
-
void ResourceCache::incrementRefcount(const SkPath* pathResource) {
incrementRefcount((void*) pathResource, kPath);
}
@@ -87,25 +97,14 @@
ref->refCount++;
}
-void ResourceCache::incrementRefcountLocked(const SkBitmap* bitmapResource) {
- incrementRefcountLocked((void*) bitmapResource, kBitmap);
-}
-
-void ResourceCache::incrementRefcountLocked(const SkPath* pathResource) {
- incrementRefcountLocked((void*) pathResource, kPath);
-}
-
-void ResourceCache::incrementRefcountLocked(const Res_png_9patch* patchResource) {
- incrementRefcountLocked((void*) patchResource, kNinePatch);
-}
-
void ResourceCache::decrementRefcount(void* resource) {
Mutex::Autolock _l(mLock);
decrementRefcountLocked(resource);
}
void ResourceCache::decrementRefcount(const SkBitmap* bitmapResource) {
- decrementRefcount((void*) bitmapResource);
+ Mutex::Autolock _l(mLock);
+ decrementRefcountLocked(bitmapResource);
}
void ResourceCache::decrementRefcount(const SkPath* pathResource) {
@@ -130,7 +129,20 @@
}
void ResourceCache::decrementRefcountLocked(const SkBitmap* bitmapResource) {
- decrementRefcountLocked((void*) bitmapResource);
+ BitmapKey bitmapKey(bitmapResource);
+ ssize_t index = mBitmapCache.indexOfKey(bitmapKey);
+
+ LOG_ALWAYS_FATAL_IF(index == NAME_NOT_FOUND,
+ "Decrementing the reference of an untracked Bitmap");
+
+ const BitmapKey& cacheEntry = mBitmapCache.keyAt(index);
+ if (cacheEntry.mRefCount == 1) {
+ // delete the bitmap and remove it from the cache
+ delete mBitmapCache.valueAt(index);
+ mBitmapCache.removeItemsAt(index);
+ } else {
+ cacheEntry.mRefCount--;
+ }
}
void ResourceCache::decrementRefcountLocked(const SkPath* pathResource) {
@@ -164,28 +176,6 @@
}
}
-void ResourceCache::destructor(const SkBitmap* resource) {
- Mutex::Autolock _l(mLock);
- destructorLocked(resource);
-}
-
-void ResourceCache::destructorLocked(const SkBitmap* resource) {
- ssize_t index = mCache->indexOfKey(resource);
- ResourceReference* ref = index >= 0 ? mCache->valueAt(index) : nullptr;
- if (ref == nullptr) {
- // If we're not tracking this resource, just delete it
- if (Caches::hasInstance()) {
- Caches::getInstance().textureCache.releaseTexture(resource);
- }
- delete resource;
- return;
- }
- ref->destroyed = true;
- if (ref->refCount == 0) {
- deleteResourceReferenceLocked(resource, ref);
- }
-}
-
void ResourceCache::destructor(Res_png_9patch* resource) {
Mutex::Autolock _l(mLock);
destructorLocked(resource);
@@ -212,64 +202,12 @@
}
/**
- * Return value indicates whether resource was actually recycled, which happens when RefCnt
- * reaches 0.
- */
-bool ResourceCache::recycle(SkBitmap* resource) {
- Mutex::Autolock _l(mLock);
- return recycleLocked(resource);
-}
-
-/**
- * Return value indicates whether resource was actually recycled, which happens when RefCnt
- * reaches 0.
- */
-bool ResourceCache::recycleLocked(SkBitmap* resource) {
- ssize_t index = mCache->indexOfKey(resource);
- if (index < 0) {
- if (Caches::hasInstance()) {
- Caches::getInstance().textureCache.releaseTexture(resource);
- }
- // not tracking this resource; just recycle the pixel data
- resource->setPixels(nullptr, nullptr);
- return true;
- }
- ResourceReference* ref = mCache->valueAt(index);
- if (ref == nullptr) {
- // Should not get here - shouldn't get a call to recycle if we're not yet tracking it
- return true;
- }
- ref->recycled = true;
- if (ref->refCount == 0) {
- deleteResourceReferenceLocked(resource, ref);
- return true;
- }
- // Still referring to resource, don't recycle yet
- return false;
-}
-
-/**
* This method should only be called while the mLock mutex is held (that mutex is grabbed
* by the various destructor() and recycle() methods which call this method).
*/
void ResourceCache::deleteResourceReferenceLocked(const void* resource, ResourceReference* ref) {
- if (ref->recycled && ref->resourceType == kBitmap) {
- SkBitmap* bitmap = (SkBitmap*) resource;
- if (Caches::hasInstance()) {
- Caches::getInstance().textureCache.releaseTexture(bitmap);
- }
- bitmap->setPixels(nullptr, nullptr);
- }
if (ref->destroyed) {
switch (ref->resourceType) {
- case kBitmap: {
- SkBitmap* bitmap = (SkBitmap*) resource;
- if (Caches::hasInstance()) {
- Caches::getInstance().textureCache.releaseTexture(bitmap);
- }
- delete bitmap;
- }
- break;
case kPath: {
SkPath* path = (SkPath*) resource;
if (Caches::hasInstance()) {
@@ -296,5 +234,38 @@
delete ref;
}
+///////////////////////////////////////////////////////////////////////////////
+// Bitmap Key
+///////////////////////////////////////////////////////////////////////////////
+
+void BitmapKey::operator=(const BitmapKey& other) {
+ this->mRefCount = other.mRefCount;
+ this->mBitmapDimensions = other.mBitmapDimensions;
+ this->mPixelRefOrigin = other.mPixelRefOrigin;
+ this->mPixelRefStableID = other.mPixelRefStableID;
+}
+
+bool BitmapKey::operator==(const BitmapKey& other) const {
+ return mPixelRefStableID == other.mPixelRefStableID &&
+ mPixelRefOrigin == other.mPixelRefOrigin &&
+ mBitmapDimensions == other.mBitmapDimensions;
+}
+
+bool BitmapKey::operator<(const BitmapKey& other) const {
+ if (mPixelRefStableID != other.mPixelRefStableID) {
+ return mPixelRefStableID < other.mPixelRefStableID;
+ }
+ if (mPixelRefOrigin.x() != other.mPixelRefOrigin.x()) {
+ return mPixelRefOrigin.x() < other.mPixelRefOrigin.x();
+ }
+ if (mPixelRefOrigin.y() != other.mPixelRefOrigin.y()) {
+ return mPixelRefOrigin.y() < other.mPixelRefOrigin.y();
+ }
+ if (mBitmapDimensions.width() != other.mBitmapDimensions.width()) {
+ return mBitmapDimensions.width() < other.mBitmapDimensions.width();
+ }
+ return mBitmapDimensions.height() < other.mBitmapDimensions.height();
+}
+
}; // namespace uirenderer
}; // namespace android
diff --git a/libs/hwui/ResourceCache.h b/libs/hwui/ResourceCache.h
index a252f6c..c6483ac 100644
--- a/libs/hwui/ResourceCache.h
+++ b/libs/hwui/ResourceCache.h
@@ -21,6 +21,7 @@
#include <SkBitmap.h>
#include <SkPath.h>
+#include <SkPixelRef.h>
#include <utils/KeyedVector.h>
#include <utils/Singleton.h>
@@ -36,7 +37,6 @@
* Type of Resource being cached
*/
enum ResourceType {
- kBitmap,
kNinePatch,
kPath
};
@@ -45,15 +45,45 @@
public:
ResourceReference(ResourceType type) {
- refCount = 0; recycled = false; destroyed = false; resourceType = type;
+ refCount = 0; destroyed = false; resourceType = type;
}
int refCount;
- bool recycled;
bool destroyed;
ResourceType resourceType;
};
+class BitmapKey {
+public:
+ BitmapKey(const SkBitmap* bitmap)
+ : mRefCount(1)
+ , mBitmapDimensions(bitmap->dimensions())
+ , mPixelRefOrigin(bitmap->pixelRefOrigin())
+ , mPixelRefStableID(bitmap->pixelRef()->getStableID()) { }
+
+ void operator=(const BitmapKey& other);
+ bool operator==(const BitmapKey& other) const;
+ bool operator<(const BitmapKey& other) const;
+
+private:
+ // This constructor is only used by the KeyedVector implementation
+ BitmapKey()
+ : mRefCount(-1)
+ , mBitmapDimensions(SkISize::Make(0,0))
+ , mPixelRefOrigin(SkIPoint::Make(0,0))
+ , mPixelRefStableID(0) { }
+
+ // reference count of all HWUI object using this bitmap
+ mutable int mRefCount;
+
+ SkISize mBitmapDimensions;
+ SkIPoint mPixelRefOrigin;
+ uint32_t mPixelRefStableID;
+
+ friend class ResourceCache;
+ friend class android::key_value_pair_t<BitmapKey, SkBitmap*>;
+};
+
class ANDROID_API ResourceCache: public Singleton<ResourceCache> {
ResourceCache();
~ResourceCache();
@@ -69,13 +99,14 @@
void lock();
void unlock();
- void incrementRefcount(const SkPath* resource);
- void incrementRefcount(const SkBitmap* resource);
- void incrementRefcount(const Res_png_9patch* resource);
+ /**
+ * The cache stores a copy of the provided resource or refs an existing resource
+ * if the bitmap has previously been inserted and returns the cached copy.
+ */
+ const SkBitmap* insert(const SkBitmap* resource);
- void incrementRefcountLocked(const SkPath* resource);
- void incrementRefcountLocked(const SkBitmap* resource);
- void incrementRefcountLocked(const Res_png_9patch* resource);
+ void incrementRefcount(const SkPath* resource);
+ void incrementRefcount(const Res_png_9patch* resource);
void decrementRefcount(const SkBitmap* resource);
void decrementRefcount(const SkPath* resource);
@@ -86,16 +117,11 @@
void decrementRefcountLocked(const Res_png_9patch* resource);
void destructor(SkPath* resource);
- void destructor(const SkBitmap* resource);
void destructor(Res_png_9patch* resource);
void destructorLocked(SkPath* resource);
- void destructorLocked(const SkBitmap* resource);
void destructorLocked(Res_png_9patch* resource);
- bool recycle(SkBitmap* resource);
- bool recycleLocked(SkBitmap* resource);
-
private:
void deleteResourceReferenceLocked(const void* resource, ResourceReference* ref);
@@ -115,6 +141,7 @@
mutable Mutex mLock;
KeyedVector<const void*, ResourceReference*>* mCache;
+ KeyedVector<BitmapKey, SkBitmap*> mBitmapCache;
};
}; // namespace uirenderer
diff --git a/libs/hwui/TextureCache.cpp b/libs/hwui/TextureCache.cpp
index 7dc2480..b4d3708 100644
--- a/libs/hwui/TextureCache.cpp
+++ b/libs/hwui/TextureCache.cpp
@@ -233,11 +233,9 @@
return texture;
}
-void TextureCache::releaseTexture(const SkBitmap* bitmap) {
- if (!bitmap || !bitmap->pixelRef()) return;
-
+void TextureCache::releaseTexture(uint32_t pixelRefStableID) {
Mutex::Autolock _l(mLock);
- mGarbage.push(bitmap->pixelRef()->getStableID());
+ mGarbage.push(pixelRefStableID);
}
void TextureCache::clearGarbage() {
diff --git a/libs/hwui/TextureCache.h b/libs/hwui/TextureCache.h
index 0e33e4c..b97d92d 100644
--- a/libs/hwui/TextureCache.h
+++ b/libs/hwui/TextureCache.h
@@ -88,10 +88,10 @@
Texture* getTransient(const SkBitmap* bitmap);
/**
- * Removes the texture associated with the specified bitmap. This is meant
+ * Removes the texture associated with the specified pixelRef. This is meant
* to be called from threads that are not the EGL context thread.
*/
- void releaseTexture(const SkBitmap* bitmap);
+ ANDROID_API void releaseTexture(uint32_t pixelRefStableID);
/**
* Process deferred removals.
*/
diff --git a/libs/hwui/tests/TestContext.cpp b/libs/hwui/tests/TestContext.cpp
index 35e402d..542bbae 100644
--- a/libs/hwui/tests/TestContext.cpp
+++ b/libs/hwui/tests/TestContext.cpp
@@ -16,30 +16,59 @@
#include "TestContext.h"
-#include <gui/ISurfaceComposer.h>
-#include <gui/SurfaceComposerClient.h>
+namespace android {
+namespace uirenderer {
+namespace test {
-using namespace android;
+static const int IDENT_DISPLAYEVENT = 1;
-DisplayInfo gDisplay;
-sp<SurfaceComposerClient> gSession;
-
-void createTestEnvironment() {
- gSession = new SurfaceComposerClient();
+static DisplayInfo getBuiltInDisplay() {
+ DisplayInfo display;
sp<IBinder> dtoken(SurfaceComposerClient::getBuiltInDisplay(
- ISurfaceComposer::eDisplayIdMain));
- status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &gDisplay);
+ ISurfaceComposer::eDisplayIdMain));
+ status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &display);
LOG_ALWAYS_FATAL_IF(status, "Failed to get display info\n");
+ return display;
}
-sp<SurfaceControl> createWindow(int width, int height) {
- sp<SurfaceControl> control = gSession->createSurface(String8("HwuiTest"),
- width, height, PIXEL_FORMAT_RGBX_8888);
+android::DisplayInfo gDisplay = getBuiltInDisplay();
- SurfaceComposerClient::openGlobalTransaction();
- control->setLayer(0x7FFFFFF);
- control->show();
- SurfaceComposerClient::closeGlobalTransaction();
-
- return control;
+TestContext::TestContext() {
+ mLooper = new Looper(true);
+ mSurfaceComposerClient = new SurfaceComposerClient();
+ mLooper->addFd(mDisplayEventReceiver.getFd(), IDENT_DISPLAYEVENT,
+ Looper::EVENT_INPUT, nullptr, nullptr);
}
+
+TestContext::~TestContext() {}
+
+sp<Surface> TestContext::surface() {
+ if (!mSurfaceControl.get()) {
+ mSurfaceControl = mSurfaceComposerClient->createSurface(String8("HwuiTest"),
+ gDisplay.w, gDisplay.h, PIXEL_FORMAT_RGBX_8888);
+
+ SurfaceComposerClient::openGlobalTransaction();
+ mSurfaceControl->setLayer(0x7FFFFFF);
+ mSurfaceControl->show();
+ SurfaceComposerClient::closeGlobalTransaction();
+ }
+
+ return mSurfaceControl->getSurface();
+}
+
+void TestContext::waitForVsync() {
+ // Request vsync
+ mDisplayEventReceiver.requestNextVsync();
+
+ // Wait
+ mLooper->pollOnce(-1);
+
+ // Drain it
+ DisplayEventReceiver::Event buf[100];
+ while (mDisplayEventReceiver.getEvents(buf, 100) > 0) { }
+}
+
+} // namespace test
+} // namespace uirenderer
+} // namespace android
+
diff --git a/libs/hwui/tests/TestContext.h b/libs/hwui/tests/TestContext.h
index 8a5d530..7b30fc1 100644
--- a/libs/hwui/tests/TestContext.h
+++ b/libs/hwui/tests/TestContext.h
@@ -17,17 +17,39 @@
#ifndef TESTCONTEXT_H
#define TESTCONTEXT_H
-#include <ui/DisplayInfo.h>
+#include <gui/DisplayEventReceiver.h>
+#include <gui/ISurfaceComposer.h>
+#include <gui/SurfaceComposerClient.h>
#include <gui/SurfaceControl.h>
+#include <gui/Surface.h>
+#include <ui/DisplayInfo.h>
+#include <utils/Looper.h>
-extern android::DisplayInfo gDisplay;
-#define dp(x) ((x) * gDisplay.density)
+namespace android {
+namespace uirenderer {
+namespace test {
-// Initializes all the static globals that are shared across all contexts
-// such as display info
-void createTestEnvironment();
+extern DisplayInfo gDisplay;
+#define dp(x) ((x) * android::uirenderer::test::gDisplay.density)
-// Defaults to fullscreen
-android::sp<android::SurfaceControl> createWindow(int width = -1, int height = -1);
+class TestContext {
+public:
+ TestContext();
+ ~TestContext();
+
+ sp<Surface> surface();
+
+ void waitForVsync();
+
+private:
+ sp<SurfaceComposerClient> mSurfaceComposerClient;
+ sp<SurfaceControl> mSurfaceControl;
+ DisplayEventReceiver mDisplayEventReceiver;
+ sp<Looper> mLooper;
+};
+
+} // namespace test
+} // namespace uirenderer
+} // namespace android
#endif
diff --git a/libs/hwui/tests/main.cpp b/libs/hwui/tests/main.cpp
index 152e7b2..a12dac7 100644
--- a/libs/hwui/tests/main.cpp
+++ b/libs/hwui/tests/main.cpp
@@ -24,12 +24,14 @@
#include <DisplayListRenderer.h>
#include <RenderNode.h>
#include <renderthread/RenderProxy.h>
+#include <renderthread/RenderTask.h>
#include "TestContext.h"
using namespace android;
using namespace android::uirenderer;
using namespace android::uirenderer::renderthread;
+using namespace android::uirenderer::test;
class ContextFactory : public IContextFactory {
public:
@@ -67,13 +69,12 @@
}
int main(int argc, char* argv[]) {
- createTestEnvironment();
+ TestContext testContext;
// create the native surface
const int width = gDisplay.w;
const int height = gDisplay.h;
- sp<SurfaceControl> control = createWindow(width, height);
- sp<Surface> surface = control->getSurface();
+ sp<Surface> surface = testContext.surface();
RenderNode* rootNode = new RenderNode();
rootNode->incStrong(nullptr);
@@ -110,6 +111,8 @@
endRecording(renderer, rootNode);
for (int i = 0; i < 150; i++) {
+ testContext.waitForVsync();
+
ATRACE_NAME("UI-Draw Frame");
for (size_t ci = 0; ci < cards.size(); ci++) {
cards[ci]->mutateStagingProperties().setTranslationX(i);
@@ -118,7 +121,6 @@
}
nsecs_t frameTimeNs = systemTime(CLOCK_MONOTONIC);
proxy->syncAndDrawFrame(frameTimeNs, 0, gDisplay.density);
- usleep(12000);
}
sleep(5);
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 430ead5..4c8b9cd 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -4734,7 +4734,8 @@
connType = AudioRoutesInfo.MAIN_HEADPHONES;
intent.setAction(Intent.ACTION_HEADSET_PLUG);
intent.putExtra("microphone", 0);
- } else if (device == AudioSystem.DEVICE_OUT_HDMI) {
+ } else if (device == AudioSystem.DEVICE_OUT_HDMI ||
+ device == AudioSystem.DEVICE_OUT_HDMI_ARC) {
connType = AudioRoutesInfo.MAIN_HDMI;
configureHdmiPlugIntent(intent, state);
}
@@ -4829,7 +4830,8 @@
for (AudioPort port : ports) {
if (port instanceof AudioDevicePort) {
final AudioDevicePort devicePort = (AudioDevicePort) port;
- if (devicePort.type() == AudioManager.DEVICE_OUT_HDMI) {
+ if (devicePort.type() == AudioManager.DEVICE_OUT_HDMI ||
+ devicePort.type() == AudioManager.DEVICE_OUT_HDMI_ARC) {
// format the list of supported encodings
int[] formats = devicePort.formats();
if (formats.length > 0) {
@@ -4979,9 +4981,13 @@
boolean hasPlayback = intent.getBooleanExtra("hasPlayback", false);
boolean hasCapture = intent.getBooleanExtra("hasCapture", false);
boolean hasMIDI = intent.getBooleanExtra("hasMIDI", false);
+ int deviceClass = intent.getIntExtra("class", 0);
- String params = (alsaCard == -1 && alsaDevice == -1 ? ""
- : "card=" + alsaCard + ";device=" + alsaDevice);
+ String params = (alsaCard == -1 && alsaDevice == -1
+ ? ""
+ : "card=" + alsaCard +
+ ";device=" + alsaDevice +
+ ";class=" + Integer.toHexString(deviceClass));
// Playback Device
if (hasPlayback) {
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index 72112d6..1af0372 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -512,7 +512,7 @@
throw new IllegalArgumentException("Unsupported channel configuration.");
}
mChannels = channelConfig;
- mChannelCount = Integer.bitCount(channelConfig);
+ mChannelCount = AudioFormat.channelCountFromOutChannelMask(channelConfig);
}
//--------------
@@ -546,7 +546,7 @@
loge("Channel configuration features unsupported channels");
return false;
}
- final int channelCount = Integer.bitCount(channelConfig);
+ final int channelCount = AudioFormat.channelCountFromOutChannelMask(channelConfig);
if (channelCount > CHANNEL_COUNT_MAX) {
loge("Channel configuration contains too many channels " +
channelCount + ">" + CHANNEL_COUNT_MAX);
@@ -828,7 +828,7 @@
loge("getMinBufferSize(): Invalid channel configuration.");
return ERROR_BAD_VALUE;
} else {
- channelCount = Integer.bitCount(channelConfig);
+ channelCount = AudioFormat.channelCountFromOutChannelMask(channelConfig);
}
}
diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java
index 8faa75c..4356a3e 100644
--- a/media/java/android/media/MediaFormat.java
+++ b/media/java/android/media/MediaFormat.java
@@ -106,6 +106,10 @@
public static final String MIMETYPE_AUDIO_FLAC = "audio/flac";
public static final String MIMETYPE_AUDIO_MSGSM = "audio/gsm";
public static final String MIMETYPE_AUDIO_AC3 = "audio/ac3";
+ /**
+ * @hide
+ */
+ public static final String MIMETYPE_AUDIO_EAC3 = "audio/eac3";
/**
* MIME type for WebVTT subtitle data.
diff --git a/media/java/android/media/browse/MediaBrowser.java b/media/java/android/media/browse/MediaBrowser.java
index d260b05..e82567c 100644
--- a/media/java/android/media/browse/MediaBrowser.java
+++ b/media/java/android/media/browse/MediaBrowser.java
@@ -291,15 +291,17 @@
* the specified id and subscribes to receive updates when they change.
* <p>
* The list of subscriptions is maintained even when not connected and is
- * restored after reconnection. It is ok to subscribe while not connected
+ * restored after reconnection. It is ok to subscribe while not connected
* but the results will not be returned until the connection completes.
- * </p><p>
+ * </p>
+ * <p>
* If the id is already subscribed with a different callback then the new
- * callback will replace the previous one.
+ * callback will replace the previous one and the child data will be
+ * reloaded.
* </p>
*
* @param parentId The id of the parent media item whose list of children
- * will be subscribed.
+ * will be subscribed.
* @param callback The callback to receive the list of children.
*/
public void subscribe(@NonNull String parentId, @NonNull SubscriptionCallback callback) {
@@ -322,7 +324,7 @@
// If we are connected, tell the service that we are watching. If we aren't
// connected, the service will be told when we connect.
- if (mState == CONNECT_STATE_CONNECTED && newSubscription) {
+ if (mState == CONNECT_STATE_CONNECTED) {
try {
mServiceBinder.addSubscription(parentId, mServiceCallbacks);
} catch (RemoteException ex) {
diff --git a/media/java/android/service/media/MediaBrowserService.java b/media/java/android/service/media/MediaBrowserService.java
index 26aedbd..47cb94b 100644
--- a/media/java/android/service/media/MediaBrowserService.java
+++ b/media/java/android/service/media/MediaBrowserService.java
@@ -405,12 +405,10 @@
*/
private void addSubscription(String id, ConnectionRecord connection) {
// Save the subscription
- final boolean added = connection.subscriptions.add(id);
+ connection.subscriptions.add(id);
- // If this is a new subscription, send the results
- if (added) {
- performLoadChildren(id, connection);
- }
+ // send the results
+ performLoadChildren(id, connection);
}
/**
diff --git a/media/jni/android_media_MediaRecorder.cpp b/media/jni/android_media_MediaRecorder.cpp
index 635a519..8b7d40d 100644
--- a/media/jni/android_media_MediaRecorder.cpp
+++ b/media/jni/android_media_MediaRecorder.cpp
@@ -102,7 +102,7 @@
ALOGV("JNIMediaRecorderListener::notify");
JNIEnv *env = AndroidRuntime::getJNIEnv();
- env->CallStaticVoidMethod(mClass, fields.post_event, mObject, msg, ext1, ext2, 0);
+ env->CallStaticVoidMethod(mClass, fields.post_event, mObject, msg, ext1, ext2, NULL);
}
// ----------------------------------------------------------------------------
diff --git a/media/jni/audioeffect/android_media_Visualizer.cpp b/media/jni/audioeffect/android_media_Visualizer.cpp
index 9183ad2..460277f 100644
--- a/media/jni/audioeffect/android_media_Visualizer.cpp
+++ b/media/jni/audioeffect/android_media_Visualizer.cpp
@@ -325,7 +325,7 @@
fields.midPostNativeEvent,
callbackInfo->visualizer_ref,
NATIVE_EVENT_SERVER_DIED,
- 0, 0, 0);
+ 0, 0, NULL);
}
}
diff --git a/packages/Keyguard/res/anim/keyguard_action_assist_enter.xml b/packages/Keyguard/res/anim/keyguard_action_assist_enter.xml
deleted file mode 100644
index f3333b7..0000000
--- a/packages/Keyguard/res/anim/keyguard_action_assist_enter.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:shareInterpolator="false" android:zAdjustment="top">
-
- <alpha android:fromAlpha="0" android:toAlpha="1.0"
- android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
- android:interpolator="@android:interpolator/decelerate_cubic"
- android:duration="300"/>
-
- <translate android:fromYDelta="100%" android:toYDelta="0"
- android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
- android:interpolator="@android:interpolator/decelerate_cubic"
- android:duration="300" />
-</set>
diff --git a/packages/Keyguard/res/anim/keyguard_action_assist_exit.xml b/packages/Keyguard/res/anim/keyguard_action_assist_exit.xml
deleted file mode 100644
index b4ed278..0000000
--- a/packages/Keyguard/res/anim/keyguard_action_assist_exit.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<translate xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/accelerate_interpolator"
- android:fromXDelta="0" android:toXDelta="0"
- android:duration="300" />
diff --git a/packages/Keyguard/res/anim/lock_screen_enter.xml b/packages/Keyguard/res/anim/lock_screen_enter.xml
deleted file mode 100644
index 4344cf9..0000000
--- a/packages/Keyguard/res/anim/lock_screen_enter.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2007, 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.
-*/
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:interpolator/accelerate_cubic">
- <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
- android:duration="@integer/config_activityDefaultDur" />
-</set>
diff --git a/packages/Keyguard/res/anim/lock_screen_exit.xml b/packages/Keyguard/res/anim/lock_screen_exit.xml
deleted file mode 100644
index c75b3cc..0000000
--- a/packages/Keyguard/res/anim/lock_screen_exit.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2007, 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.
-*/
--->
-
-
-<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:zAdjustment="top"
- android:shareInterpolator="false">
- <scale
- android:fromXScale="1.0" android:toXScale="1.10"
- android:fromYScale="1.0" android:toYScale="1.10"
- android:pivotX="50%p" android:pivotY="50%p"
- android:fillEnabled="true" android:fillAfter="true"
- android:interpolator="@android:interpolator/accelerate_quint"
- android:duration="@android:integer/config_shortAnimTime" />
- <alpha
- android:fromAlpha="1.0" android:toAlpha="0"
- android:fillEnabled="true" android:fillAfter="true"
- android:interpolator="@android:interpolator/accelerate_quad"
- android:duration="@android:integer/config_shortAnimTime"/>
-</set>
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_facial_backup.png b/packages/Keyguard/res/drawable-hdpi/ic_facial_backup.png
deleted file mode 100644
index 2956109..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_facial_backup.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_camera_activated.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_camera_activated.png
deleted file mode 100644
index 19c8eb2..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_camera_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_camera_normal.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_camera_normal.png
deleted file mode 100644
index c79a245..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_camera_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_emergencycall_normal.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_emergencycall_normal.png
deleted file mode 100644
index 460495a..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_emergencycall_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_emergencycall_pressed.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_emergencycall_pressed.png
deleted file mode 100644
index b0f7ae9..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_emergencycall_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_glowdot.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_glowdot.png
deleted file mode 100644
index 983c45e..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_glowdot.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_google_activated.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_google_activated.png
deleted file mode 100644
index 2c4847c..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_google_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_google_focused.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_google_focused.png
deleted file mode 100644
index d98557d..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_google_focused.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_google_normal.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_google_normal.png
deleted file mode 100644
index 656f3ba..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_google_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_handle_normal.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_handle_normal.png
deleted file mode 100644
index 1780ec0..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_handle_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_handle_pressed.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_handle_pressed.png
deleted file mode 100644
index 58a5f16..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_handle_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_lock_normal.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_lock_normal.png
deleted file mode 100644
index 732133c..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_lock_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_lock_pressed.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_lock_pressed.png
deleted file mode 100644
index 0bbf62f..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_lock_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_player_background.9.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_player_background.9.png
deleted file mode 100644
index fbb75b5..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_player_background.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_search_activated.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_search_activated.png
deleted file mode 100644
index 0d2e2ef..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_search_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_search_normal.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_search_normal.png
deleted file mode 100644
index 66d14ae..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_search_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_silent_activated.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_silent_activated.png
deleted file mode 100644
index 7060d59..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_silent_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_silent_focused.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_silent_focused.png
deleted file mode 100644
index f9a8c7c..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_silent_focused.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_silent_normal.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_silent_normal.png
deleted file mode 100644
index b47cd08..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_silent_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_soundon_activated.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_soundon_activated.png
deleted file mode 100644
index 88d0a9f..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_soundon_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_soundon_focused.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_soundon_focused.png
deleted file mode 100644
index 6e16e40..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_soundon_focused.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_soundon_normal.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_soundon_normal.png
deleted file mode 100644
index 0dd81c0..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_soundon_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_unlock_activated.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_unlock_activated.png
deleted file mode 100644
index 374a62a..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_unlock_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_unlock_normal.png b/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_unlock_normal.png
deleted file mode 100644
index 3960893..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_lockscreen_unlock_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_media_next.png b/packages/Keyguard/res/drawable-hdpi/ic_media_next.png
deleted file mode 100644
index 6e27b81..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_media_next.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_media_play.png b/packages/Keyguard/res/drawable-hdpi/ic_media_play.png
deleted file mode 100644
index 2746d17..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_media_play.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_media_previous.png b/packages/Keyguard/res/drawable-hdpi/ic_media_previous.png
deleted file mode 100644
index 85b3766..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_media_previous.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/intro_bg.png b/packages/Keyguard/res/drawable-hdpi/intro_bg.png
deleted file mode 100644
index a758e7d..0000000
--- a/packages/Keyguard/res/drawable-hdpi/intro_bg.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/kg_add_widget.png b/packages/Keyguard/res/drawable-hdpi/kg_add_widget.png
deleted file mode 100644
index 7456705..0000000
--- a/packages/Keyguard/res/drawable-hdpi/kg_add_widget.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/kg_add_widget_disabled.png b/packages/Keyguard/res/drawable-hdpi/kg_add_widget_disabled.png
deleted file mode 100644
index f24cf642..0000000
--- a/packages/Keyguard/res/drawable-hdpi/kg_add_widget_disabled.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/kg_add_widget_pressed.png b/packages/Keyguard/res/drawable-hdpi/kg_add_widget_pressed.png
deleted file mode 100644
index 70a960d..0000000
--- a/packages/Keyguard/res/drawable-hdpi/kg_add_widget_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/kg_security_grip.9.png b/packages/Keyguard/res/drawable-hdpi/kg_security_grip.9.png
deleted file mode 100644
index 1e40aef..0000000
--- a/packages/Keyguard/res/drawable-hdpi/kg_security_grip.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/kg_security_lock.png b/packages/Keyguard/res/drawable-hdpi/kg_security_lock.png
deleted file mode 100644
index c3c94c4..0000000
--- a/packages/Keyguard/res/drawable-hdpi/kg_security_lock.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/kg_security_lock_focused.png b/packages/Keyguard/res/drawable-hdpi/kg_security_lock_focused.png
deleted file mode 100644
index 9a82799..0000000
--- a/packages/Keyguard/res/drawable-hdpi/kg_security_lock_focused.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/kg_security_lock_pressed.png b/packages/Keyguard/res/drawable-hdpi/kg_security_lock_pressed.png
deleted file mode 100644
index 7ca995d..0000000
--- a/packages/Keyguard/res/drawable-hdpi/kg_security_lock_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/kg_widget_bg_padded.9.png b/packages/Keyguard/res/drawable-hdpi/kg_widget_bg_padded.9.png
deleted file mode 100644
index 476a826..0000000
--- a/packages/Keyguard/res/drawable-hdpi/kg_widget_bg_padded.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/kg_widget_delete_drop_target.png b/packages/Keyguard/res/drawable-hdpi/kg_widget_delete_drop_target.png
deleted file mode 100644
index 84549ff..0000000
--- a/packages/Keyguard/res/drawable-hdpi/kg_widget_delete_drop_target.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/lockscreen_protection_pattern.png b/packages/Keyguard/res/drawable-hdpi/lockscreen_protection_pattern.png
deleted file mode 100644
index 681d8be..0000000
--- a/packages/Keyguard/res/drawable-hdpi/lockscreen_protection_pattern.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/progress_bg_holo_light.9.png b/packages/Keyguard/res/drawable-hdpi/progress_bg_holo_light.9.png
deleted file mode 100644
index 2d79280..0000000
--- a/packages/Keyguard/res/drawable-hdpi/progress_bg_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/progress_primary_holo_light.9.png b/packages/Keyguard/res/drawable-hdpi/progress_primary_holo_light.9.png
deleted file mode 100644
index 543cb85..0000000
--- a/packages/Keyguard/res/drawable-hdpi/progress_primary_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/progress_secondary_holo_light.9.png b/packages/Keyguard/res/drawable-hdpi/progress_secondary_holo_light.9.png
deleted file mode 100644
index 4497058..0000000
--- a/packages/Keyguard/res/drawable-hdpi/progress_secondary_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_control_disabled_holo.png b/packages/Keyguard/res/drawable-hdpi/scrubber_control_disabled_holo.png
deleted file mode 100644
index ba77899..0000000
--- a/packages/Keyguard/res/drawable-hdpi/scrubber_control_disabled_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_control_focused_holo.png b/packages/Keyguard/res/drawable-hdpi/scrubber_control_focused_holo.png
deleted file mode 100644
index 539ee22..0000000
--- a/packages/Keyguard/res/drawable-hdpi/scrubber_control_focused_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_control_normal_holo.png b/packages/Keyguard/res/drawable-hdpi/scrubber_control_normal_holo.png
deleted file mode 100644
index 9a4ea2f..0000000
--- a/packages/Keyguard/res/drawable-hdpi/scrubber_control_normal_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_control_pressed_holo.png b/packages/Keyguard/res/drawable-hdpi/scrubber_control_pressed_holo.png
deleted file mode 100644
index e6b11de..0000000
--- a/packages/Keyguard/res/drawable-hdpi/scrubber_control_pressed_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_primary_holo.9.png b/packages/Keyguard/res/drawable-hdpi/scrubber_primary_holo.9.png
deleted file mode 100644
index 822e8d11..0000000
--- a/packages/Keyguard/res/drawable-hdpi/scrubber_primary_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_secondary_holo.9.png b/packages/Keyguard/res/drawable-hdpi/scrubber_secondary_holo.9.png
deleted file mode 100644
index be4253e..0000000
--- a/packages/Keyguard/res/drawable-hdpi/scrubber_secondary_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/scrubber_track_holo_light.9.png b/packages/Keyguard/res/drawable-hdpi/scrubber_track_holo_light.9.png
deleted file mode 100644
index 2334e14..0000000
--- a/packages/Keyguard/res/drawable-hdpi/scrubber_track_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-hdpi/sym_keyboard_return_holo.png b/packages/Keyguard/res/drawable-hdpi/sym_keyboard_return_holo.png
deleted file mode 100644
index f1bcf48..0000000
--- a/packages/Keyguard/res/drawable-hdpi/sym_keyboard_return_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-ldpi/ic_input_delete.png b/packages/Keyguard/res/drawable-ldpi/ic_input_delete.png
deleted file mode 100644
index d7eff17..0000000
--- a/packages/Keyguard/res/drawable-ldpi/ic_input_delete.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-ldpi/ic_media_next.png b/packages/Keyguard/res/drawable-ldpi/ic_media_next.png
deleted file mode 100644
index 99927fd..0000000
--- a/packages/Keyguard/res/drawable-ldpi/ic_media_next.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-ldpi/ic_media_play.png b/packages/Keyguard/res/drawable-ldpi/ic_media_play.png
deleted file mode 100644
index e7c1972..0000000
--- a/packages/Keyguard/res/drawable-ldpi/ic_media_play.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-ldpi/ic_media_previous.png b/packages/Keyguard/res/drawable-ldpi/ic_media_previous.png
deleted file mode 100644
index df04322..0000000
--- a/packages/Keyguard/res/drawable-ldpi/ic_media_previous.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_facial_backup.png b/packages/Keyguard/res/drawable-mdpi/ic_facial_backup.png
deleted file mode 100644
index 6ed1327..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_facial_backup.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_camera_activated.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_camera_activated.png
deleted file mode 100644
index 862f33b..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_camera_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_camera_normal.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_camera_normal.png
deleted file mode 100644
index 30df0a3..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_camera_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_emergencycall_normal.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_emergencycall_normal.png
deleted file mode 100644
index cae795f..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_emergencycall_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_emergencycall_pressed.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_emergencycall_pressed.png
deleted file mode 100644
index 2867956..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_emergencycall_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_glowdot.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_glowdot.png
deleted file mode 100644
index 056c3f17..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_glowdot.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_google_activated.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_google_activated.png
deleted file mode 100644
index 32a68e0..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_google_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_google_focused.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_google_focused.png
deleted file mode 100644
index 3f96d03..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_google_focused.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_google_normal.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_google_normal.png
deleted file mode 100644
index 2f7efcf..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_google_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_handle_normal.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_handle_normal.png
deleted file mode 100644
index 1d547e1..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_handle_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_handle_pressed.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_handle_pressed.png
deleted file mode 100644
index 0187a02..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_handle_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_lock_normal.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_lock_normal.png
deleted file mode 100644
index 30eb974..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_lock_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_lock_pressed.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_lock_pressed.png
deleted file mode 100644
index aab2f6b..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_lock_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_player_background.9.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_player_background.9.png
deleted file mode 100644
index 17d97c4..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_player_background.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_search_activated.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_search_activated.png
deleted file mode 100644
index 73c6be6..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_search_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_search_normal.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_search_normal.png
deleted file mode 100644
index 73c6be6..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_search_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_silent_activated.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_silent_activated.png
deleted file mode 100644
index 2bc3f52..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_silent_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_silent_focused.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_silent_focused.png
deleted file mode 100644
index 6a5af9d..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_silent_focused.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_silent_normal.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_silent_normal.png
deleted file mode 100644
index c288ce4..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_silent_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_soundon_activated.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_soundon_activated.png
deleted file mode 100644
index 637eec6..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_soundon_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_soundon_focused.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_soundon_focused.png
deleted file mode 100644
index db59b5f..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_soundon_focused.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_soundon_normal.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_soundon_normal.png
deleted file mode 100644
index eb6ceed..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_soundon_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_unlock_activated.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_unlock_activated.png
deleted file mode 100644
index 68409c5..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_unlock_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_unlock_normal.png b/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_unlock_normal.png
deleted file mode 100644
index 52866f2..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_lockscreen_unlock_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_media_next.png b/packages/Keyguard/res/drawable-mdpi/ic_media_next.png
deleted file mode 100644
index fcd73d9..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_media_next.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_media_play.png b/packages/Keyguard/res/drawable-mdpi/ic_media_play.png
deleted file mode 100644
index 7966bbc..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_media_play.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_media_previous.png b/packages/Keyguard/res/drawable-mdpi/ic_media_previous.png
deleted file mode 100644
index b653d05..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_media_previous.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/intro_bg.png b/packages/Keyguard/res/drawable-mdpi/intro_bg.png
deleted file mode 100644
index 540da31..0000000
--- a/packages/Keyguard/res/drawable-mdpi/intro_bg.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/kg_add_widget.png b/packages/Keyguard/res/drawable-mdpi/kg_add_widget.png
deleted file mode 100644
index 1cab0d9..0000000
--- a/packages/Keyguard/res/drawable-mdpi/kg_add_widget.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/kg_add_widget_disabled.png b/packages/Keyguard/res/drawable-mdpi/kg_add_widget_disabled.png
deleted file mode 100644
index 02e0f0e..0000000
--- a/packages/Keyguard/res/drawable-mdpi/kg_add_widget_disabled.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/kg_add_widget_pressed.png b/packages/Keyguard/res/drawable-mdpi/kg_add_widget_pressed.png
deleted file mode 100644
index a68d4c1..0000000
--- a/packages/Keyguard/res/drawable-mdpi/kg_add_widget_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/kg_security_grip.9.png b/packages/Keyguard/res/drawable-mdpi/kg_security_grip.9.png
deleted file mode 100644
index 334a39b..0000000
--- a/packages/Keyguard/res/drawable-mdpi/kg_security_grip.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/kg_security_lock.png b/packages/Keyguard/res/drawable-mdpi/kg_security_lock.png
deleted file mode 100644
index a39f380..0000000
--- a/packages/Keyguard/res/drawable-mdpi/kg_security_lock.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/kg_security_lock_focused.png b/packages/Keyguard/res/drawable-mdpi/kg_security_lock_focused.png
deleted file mode 100644
index c3608f9..0000000
--- a/packages/Keyguard/res/drawable-mdpi/kg_security_lock_focused.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/kg_security_lock_pressed.png b/packages/Keyguard/res/drawable-mdpi/kg_security_lock_pressed.png
deleted file mode 100644
index 41715f5..0000000
--- a/packages/Keyguard/res/drawable-mdpi/kg_security_lock_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/kg_widget_bg_padded.9.png b/packages/Keyguard/res/drawable-mdpi/kg_widget_bg_padded.9.png
deleted file mode 100644
index aa441de..0000000
--- a/packages/Keyguard/res/drawable-mdpi/kg_widget_bg_padded.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/kg_widget_delete_drop_target.png b/packages/Keyguard/res/drawable-mdpi/kg_widget_delete_drop_target.png
deleted file mode 100644
index 219f3e5..0000000
--- a/packages/Keyguard/res/drawable-mdpi/kg_widget_delete_drop_target.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/lockscreen_protection_pattern.png b/packages/Keyguard/res/drawable-mdpi/lockscreen_protection_pattern.png
deleted file mode 100644
index 30bcea5..0000000
--- a/packages/Keyguard/res/drawable-mdpi/lockscreen_protection_pattern.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/progress_bg_holo_light.9.png b/packages/Keyguard/res/drawable-mdpi/progress_bg_holo_light.9.png
deleted file mode 100644
index ff40433..0000000
--- a/packages/Keyguard/res/drawable-mdpi/progress_bg_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/progress_primary_holo_light.9.png b/packages/Keyguard/res/drawable-mdpi/progress_primary_holo_light.9.png
deleted file mode 100644
index d5f874d..0000000
--- a/packages/Keyguard/res/drawable-mdpi/progress_primary_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/progress_secondary_holo_light.9.png b/packages/Keyguard/res/drawable-mdpi/progress_secondary_holo_light.9.png
deleted file mode 100644
index f027007..0000000
--- a/packages/Keyguard/res/drawable-mdpi/progress_secondary_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_control_disabled_holo.png b/packages/Keyguard/res/drawable-mdpi/scrubber_control_disabled_holo.png
deleted file mode 100644
index 981facd..0000000
--- a/packages/Keyguard/res/drawable-mdpi/scrubber_control_disabled_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_control_focused_holo.png b/packages/Keyguard/res/drawable-mdpi/scrubber_control_focused_holo.png
deleted file mode 100644
index d432f42..0000000
--- a/packages/Keyguard/res/drawable-mdpi/scrubber_control_focused_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_control_normal_holo.png b/packages/Keyguard/res/drawable-mdpi/scrubber_control_normal_holo.png
deleted file mode 100644
index 7bb749e..0000000
--- a/packages/Keyguard/res/drawable-mdpi/scrubber_control_normal_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_control_pressed_holo.png b/packages/Keyguard/res/drawable-mdpi/scrubber_control_pressed_holo.png
deleted file mode 100644
index 43d826e..0000000
--- a/packages/Keyguard/res/drawable-mdpi/scrubber_control_pressed_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_primary_holo.9.png b/packages/Keyguard/res/drawable-mdpi/scrubber_primary_holo.9.png
deleted file mode 100644
index 98ac428..0000000
--- a/packages/Keyguard/res/drawable-mdpi/scrubber_primary_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_secondary_holo.9.png b/packages/Keyguard/res/drawable-mdpi/scrubber_secondary_holo.9.png
deleted file mode 100644
index d8b563b..0000000
--- a/packages/Keyguard/res/drawable-mdpi/scrubber_secondary_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/scrubber_track_holo_light.9.png b/packages/Keyguard/res/drawable-mdpi/scrubber_track_holo_light.9.png
deleted file mode 100644
index 47c5dd9..0000000
--- a/packages/Keyguard/res/drawable-mdpi/scrubber_track_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/sym_keyboard_return_holo.png b/packages/Keyguard/res/drawable-mdpi/sym_keyboard_return_holo.png
deleted file mode 100644
index d5a7708..0000000
--- a/packages/Keyguard/res/drawable-mdpi/sym_keyboard_return_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-sw600dp-hdpi/ic_lockscreen_handle_normal.png b/packages/Keyguard/res/drawable-sw600dp-hdpi/ic_lockscreen_handle_normal.png
deleted file mode 100644
index f28fe38..0000000
--- a/packages/Keyguard/res/drawable-sw600dp-hdpi/ic_lockscreen_handle_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-sw600dp-hdpi/ic_lockscreen_handle_pressed.png b/packages/Keyguard/res/drawable-sw600dp-hdpi/ic_lockscreen_handle_pressed.png
deleted file mode 100644
index 728fc67..0000000
--- a/packages/Keyguard/res/drawable-sw600dp-hdpi/ic_lockscreen_handle_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-sw600dp-mdpi/ic_lockscreen_handle_normal.png b/packages/Keyguard/res/drawable-sw600dp-mdpi/ic_lockscreen_handle_normal.png
deleted file mode 100644
index 99e742f..0000000
--- a/packages/Keyguard/res/drawable-sw600dp-mdpi/ic_lockscreen_handle_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-sw600dp-mdpi/ic_lockscreen_handle_pressed.png b/packages/Keyguard/res/drawable-sw600dp-mdpi/ic_lockscreen_handle_pressed.png
deleted file mode 100644
index c7da024..0000000
--- a/packages/Keyguard/res/drawable-sw600dp-mdpi/ic_lockscreen_handle_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-sw600dp-xhdpi/ic_lockscreen_handle_normal.png b/packages/Keyguard/res/drawable-sw600dp-xhdpi/ic_lockscreen_handle_normal.png
deleted file mode 100644
index 75e4783..0000000
--- a/packages/Keyguard/res/drawable-sw600dp-xhdpi/ic_lockscreen_handle_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-sw600dp-xhdpi/ic_lockscreen_handle_pressed.png b/packages/Keyguard/res/drawable-sw600dp-xhdpi/ic_lockscreen_handle_pressed.png
deleted file mode 100644
index 534c10b..0000000
--- a/packages/Keyguard/res/drawable-sw600dp-xhdpi/ic_lockscreen_handle_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_facial_backup.png b/packages/Keyguard/res/drawable-xhdpi/ic_facial_backup.png
deleted file mode 100644
index 942cf23..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_facial_backup.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_camera_activated.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_camera_activated.png
deleted file mode 100644
index 760ef2d..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_camera_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_camera_normal.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_camera_normal.png
deleted file mode 100644
index 093bc05..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_camera_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_emergencycall_normal.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_emergencycall_normal.png
deleted file mode 100644
index a61f7a5..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_emergencycall_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_emergencycall_pressed.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_emergencycall_pressed.png
deleted file mode 100644
index dd5e481..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_emergencycall_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_glowdot.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_glowdot.png
deleted file mode 100644
index cbd039a..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_glowdot.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_google_activated.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_google_activated.png
deleted file mode 100644
index d643f83..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_google_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_google_focused.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_google_focused.png
deleted file mode 100644
index 51863f4..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_google_focused.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_google_normal.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_google_normal.png
deleted file mode 100644
index 9a9bf68..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_google_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_handle_normal.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_handle_normal.png
deleted file mode 100644
index b09071b..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_handle_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_handle_pressed.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_handle_pressed.png
deleted file mode 100644
index 2d28009..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_handle_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_lock_normal.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_lock_normal.png
deleted file mode 100644
index c44a330..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_lock_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_lock_pressed.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_lock_pressed.png
deleted file mode 100644
index 2264dc3..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_lock_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_player_background.9.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_player_background.9.png
deleted file mode 100644
index 393bca6..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_player_background.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_silent_activated.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_silent_activated.png
deleted file mode 100644
index 2900045..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_silent_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_silent_focused.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_silent_focused.png
deleted file mode 100644
index 5a93472..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_silent_focused.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_silent_normal.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_silent_normal.png
deleted file mode 100644
index 73f6a2e..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_silent_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_soundon_activated.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_soundon_activated.png
deleted file mode 100644
index da2adc2..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_soundon_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_soundon_focused.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_soundon_focused.png
deleted file mode 100644
index 0485af0..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_soundon_focused.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_soundon_normal.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_soundon_normal.png
deleted file mode 100644
index 6af5375..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_soundon_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_unlock_activated.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_unlock_activated.png
deleted file mode 100644
index 8a0331d..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_unlock_activated.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_unlock_normal.png b/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_unlock_normal.png
deleted file mode 100644
index 0422117..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_lockscreen_unlock_normal.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_media_next.png b/packages/Keyguard/res/drawable-xhdpi/ic_media_next.png
deleted file mode 100644
index 4def965..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_media_next.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_media_play.png b/packages/Keyguard/res/drawable-xhdpi/ic_media_play.png
deleted file mode 100644
index ccfef18..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_media_play.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_media_previous.png b/packages/Keyguard/res/drawable-xhdpi/ic_media_previous.png
deleted file mode 100644
index c4472ae..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_media_previous.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/intro_bg.png b/packages/Keyguard/res/drawable-xhdpi/intro_bg.png
deleted file mode 100644
index 00466c5..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/intro_bg.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/kg_add_widget.png b/packages/Keyguard/res/drawable-xhdpi/kg_add_widget.png
deleted file mode 100644
index d71905f..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/kg_add_widget.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/kg_add_widget_disabled.png b/packages/Keyguard/res/drawable-xhdpi/kg_add_widget_disabled.png
deleted file mode 100644
index 55fa1ac..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/kg_add_widget_disabled.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/kg_add_widget_pressed.png b/packages/Keyguard/res/drawable-xhdpi/kg_add_widget_pressed.png
deleted file mode 100644
index edf7070..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/kg_add_widget_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/kg_security_grip.9.png b/packages/Keyguard/res/drawable-xhdpi/kg_security_grip.9.png
deleted file mode 100644
index c33b9d3..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/kg_security_grip.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/kg_security_lock.png b/packages/Keyguard/res/drawable-xhdpi/kg_security_lock.png
deleted file mode 100644
index 81d577e..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/kg_security_lock.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/kg_security_lock_focused.png b/packages/Keyguard/res/drawable-xhdpi/kg_security_lock_focused.png
deleted file mode 100644
index db22016..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/kg_security_lock_focused.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/kg_security_lock_pressed.png b/packages/Keyguard/res/drawable-xhdpi/kg_security_lock_pressed.png
deleted file mode 100644
index 186b6ff..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/kg_security_lock_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/kg_widget_bg_padded.9.png b/packages/Keyguard/res/drawable-xhdpi/kg_widget_bg_padded.9.png
deleted file mode 100644
index 6c372dd..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/kg_widget_bg_padded.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/kg_widget_delete_drop_target.png b/packages/Keyguard/res/drawable-xhdpi/kg_widget_delete_drop_target.png
deleted file mode 100644
index d4965d9..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/kg_widget_delete_drop_target.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/lockscreen_protection_pattern.png b/packages/Keyguard/res/drawable-xhdpi/lockscreen_protection_pattern.png
deleted file mode 100644
index c13afe2..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/lockscreen_protection_pattern.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/progress_bg_holo_light.9.png b/packages/Keyguard/res/drawable-xhdpi/progress_bg_holo_light.9.png
deleted file mode 100644
index dff0939..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/progress_bg_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/progress_primary_holo_light.9.png b/packages/Keyguard/res/drawable-xhdpi/progress_primary_holo_light.9.png
deleted file mode 100644
index 60b8198..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/progress_primary_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/progress_secondary_holo_light.9.png b/packages/Keyguard/res/drawable-xhdpi/progress_secondary_holo_light.9.png
deleted file mode 100644
index 11b31be..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/progress_secondary_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_control_disabled_holo.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_disabled_holo.png
deleted file mode 100644
index ffe913d..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/scrubber_control_disabled_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_control_focused_holo.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_focused_holo.png
deleted file mode 100644
index 2fccb8f..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/scrubber_control_focused_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_control_normal_holo.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_normal_holo.png
deleted file mode 100644
index a638501..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/scrubber_control_normal_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_control_pressed_holo.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_control_pressed_holo.png
deleted file mode 100644
index f0e65ea..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/scrubber_control_pressed_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_primary_holo.9.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_primary_holo.9.png
deleted file mode 100644
index 04f6ae3..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/scrubber_primary_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_secondary_holo.9.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_secondary_holo.9.png
deleted file mode 100644
index 7fef98d..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/scrubber_secondary_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/scrubber_track_holo_light.9.png b/packages/Keyguard/res/drawable-xhdpi/scrubber_track_holo_light.9.png
deleted file mode 100644
index a712169..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/scrubber_track_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/sym_keyboard_return_holo.png b/packages/Keyguard/res/drawable-xhdpi/sym_keyboard_return_holo.png
deleted file mode 100644
index 55174e0..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/sym_keyboard_return_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/kg_add_widget_pressed.png b/packages/Keyguard/res/drawable-xxhdpi/kg_add_widget_pressed.png
deleted file mode 100644
index 0c0838b..0000000
--- a/packages/Keyguard/res/drawable-xxhdpi/kg_add_widget_pressed.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/kg_widget_bg_padded.9.png b/packages/Keyguard/res/drawable-xxhdpi/kg_widget_bg_padded.9.png
deleted file mode 100644
index f4e398b..0000000
--- a/packages/Keyguard/res/drawable-xxhdpi/kg_widget_bg_padded.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/progress_bg_holo_light.9.png b/packages/Keyguard/res/drawable-xxhdpi/progress_bg_holo_light.9.png
deleted file mode 100644
index 60a8e22..0000000
--- a/packages/Keyguard/res/drawable-xxhdpi/progress_bg_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/progress_primary_holo_light.9.png b/packages/Keyguard/res/drawable-xxhdpi/progress_primary_holo_light.9.png
deleted file mode 100644
index 18384d3..0000000
--- a/packages/Keyguard/res/drawable-xxhdpi/progress_primary_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/progress_secondary_holo_light.9.png b/packages/Keyguard/res/drawable-xxhdpi/progress_secondary_holo_light.9.png
deleted file mode 100644
index 82eb615..0000000
--- a/packages/Keyguard/res/drawable-xxhdpi/progress_secondary_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_disabled_holo.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_disabled_holo.png
deleted file mode 100644
index d1ac7ae..0000000
--- a/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_disabled_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_focused_holo.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_focused_holo.png
deleted file mode 100644
index 58a2976..0000000
--- a/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_focused_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_normal_holo.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_normal_holo.png
deleted file mode 100644
index 6f696fd..0000000
--- a/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_normal_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_pressed_holo.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_pressed_holo.png
deleted file mode 100644
index faae4e3..0000000
--- a/packages/Keyguard/res/drawable-xxhdpi/scrubber_control_pressed_holo.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_primary_holo.9.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_primary_holo.9.png
deleted file mode 100644
index 82c2b7e..0000000
--- a/packages/Keyguard/res/drawable-xxhdpi/scrubber_primary_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_secondary_holo.9.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_secondary_holo.9.png
deleted file mode 100644
index 800d95e..0000000
--- a/packages/Keyguard/res/drawable-xxhdpi/scrubber_secondary_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/scrubber_track_holo_light.9.png b/packages/Keyguard/res/drawable-xxhdpi/scrubber_track_holo_light.9.png
deleted file mode 100644
index 9991f7f..0000000
--- a/packages/Keyguard/res/drawable-xxhdpi/scrubber_track_holo_light.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable/ic_lockscreen_camera.xml b/packages/Keyguard/res/drawable/ic_lockscreen_camera.xml
deleted file mode 100644
index 41277fe..0000000
--- a/packages/Keyguard/res/drawable/ic_lockscreen_camera.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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:state_active="false"
- android:state_focused="false"
- android:drawable="@drawable/ic_lockscreen_camera_normal" />
-
- <item
- android:state_enabled="true"
- android:state_active="true"
- android:state_focused="false"
- android:drawable="@drawable/ic_lockscreen_camera_activated" />
-
- <item
- android:state_enabled="true"
- android:state_active="false"
- android:state_focused="true"
- android:drawable="@drawable/ic_lockscreen_camera_activated" />
-
-</selector>
diff --git a/packages/Keyguard/res/drawable/ic_lockscreen_handle.xml b/packages/Keyguard/res/drawable/ic_lockscreen_handle.xml
deleted file mode 100644
index e7b4a6e..0000000
--- a/packages/Keyguard/res/drawable/ic_lockscreen_handle.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?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:state_active="false"
- android:state_focused="false"
- android:drawable="@drawable/ic_lockscreen_handle_normal" />
-
- <item
- android:state_enabled="true"
- android:state_active="true"
- android:state_focused="false"
- android:drawable="@drawable/ic_lockscreen_handle_pressed" />
-
-</selector>
diff --git a/packages/Keyguard/res/drawable/ic_lockscreen_outerring.xml b/packages/Keyguard/res/drawable/ic_lockscreen_outerring.xml
deleted file mode 100644
index 75bea70..0000000
--- a/packages/Keyguard/res/drawable/ic_lockscreen_outerring.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?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.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="oval"
- >
- <size android:height="@dimen/keyguard_lockscreen_outerring_diameter"
- android:width="@dimen/keyguard_lockscreen_outerring_diameter" />
- <solid android:color="#00000000" />
- <stroke android:color="#1affffff" android:width="2dp" />
-</shape>
diff --git a/packages/Keyguard/res/drawable/ic_lockscreen_silent.xml b/packages/Keyguard/res/drawable/ic_lockscreen_silent.xml
deleted file mode 100644
index df23278..0000000
--- a/packages/Keyguard/res/drawable/ic_lockscreen_silent.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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:state_active="false"
- android:state_focused="false"
- android:drawable="@drawable/ic_lockscreen_silent_normal" />
-
- <item
- android:state_enabled="true"
- android:state_active="true"
- android:state_focused="false"
- android:drawable="@drawable/ic_lockscreen_silent_activated" />
-
- <item
- android:state_enabled="true"
- android:state_active="false"
- android:state_focused="true"
- android:drawable="@drawable/ic_lockscreen_silent_activated" />
-
-</selector>
diff --git a/packages/Keyguard/res/drawable/ic_lockscreen_soundon.xml b/packages/Keyguard/res/drawable/ic_lockscreen_soundon.xml
deleted file mode 100644
index b44c86c..0000000
--- a/packages/Keyguard/res/drawable/ic_lockscreen_soundon.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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:state_active="false"
- android:state_focused="false"
- android:drawable="@drawable/ic_lockscreen_soundon_normal" />
-
- <item
- android:state_enabled="true"
- android:state_active="true"
- android:state_focused="false"
- android:drawable="@drawable/ic_lockscreen_soundon_activated" />
-
- <item
- android:state_enabled="true"
- android:state_active="false"
- android:state_focused="true"
- android:drawable="@drawable/ic_lockscreen_soundon_activated" />
-
-</selector>
diff --git a/packages/Keyguard/res/drawable/ic_lockscreen_unlock.xml b/packages/Keyguard/res/drawable/ic_lockscreen_unlock.xml
deleted file mode 100644
index bb1d0ee..0000000
--- a/packages/Keyguard/res/drawable/ic_lockscreen_unlock.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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:state_active="false"
- android:state_focused="false"
- android:drawable="@drawable/ic_lockscreen_unlock_normal" />
-
- <item
- android:state_enabled="true"
- android:state_active="true"
- android:state_focused="false"
- android:drawable="@drawable/ic_lockscreen_unlock_activated" />
-
- <item
- android:state_enabled="true"
- android:state_active="false"
- android:state_focused="true"
- android:drawable="@drawable/ic_lockscreen_unlock_activated" />
-
-</selector>
diff --git a/packages/Keyguard/res/drawable/ic_lockscreen_unlock_phantom.xml b/packages/Keyguard/res/drawable/ic_lockscreen_unlock_phantom.xml
deleted file mode 100644
index 83f0aed..0000000
--- a/packages/Keyguard/res/drawable/ic_lockscreen_unlock_phantom.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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:state_active="false"
- android:state_focused="false"
- android:drawable="@color/transparent" />
-
- <item
- android:state_enabled="true"
- android:state_active="true"
- android:state_focused="false"
- android:drawable="@drawable/ic_lockscreen_unlock_activated" />
-
- <item
- android:state_enabled="true"
- android:state_active="false"
- android:state_focused="true"
- android:drawable="@drawable/ic_lockscreen_unlock_activated" />
-
-</selector>
diff --git a/packages/Keyguard/res/drawable/keyguard_add_widget_button.xml b/packages/Keyguard/res/drawable/keyguard_add_widget_button.xml
deleted file mode 100644
index c26f81d..0000000
--- a/packages/Keyguard/res/drawable/keyguard_add_widget_button.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true" android:drawable="@drawable/kg_add_widget_pressed" />
- <item android:state_enabled="false" android:drawable="@drawable/kg_add_widget_disabled" />
- <item android:drawable="@drawable/kg_add_widget" />
-</selector>
diff --git a/packages/Keyguard/res/drawable/keyguard_expand_challenge_handle.xml b/packages/Keyguard/res/drawable/keyguard_expand_challenge_handle.xml
deleted file mode 100644
index 3e0780b..0000000
--- a/packages/Keyguard/res/drawable/keyguard_expand_challenge_handle.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_focused="true" android:drawable="@drawable/kg_security_lock_focused" />
- <item android:state_pressed="true" android:drawable="@drawable/kg_security_lock_pressed" />
- <item android:drawable="@drawable/kg_security_lock_normal" />
-</selector>
diff --git a/packages/Keyguard/res/drawable/lockscreen_emergency_button.xml b/packages/Keyguard/res/drawable/lockscreen_emergency_button.xml
deleted file mode 100644
index 4ec6a96..0000000
--- a/packages/Keyguard/res/drawable/lockscreen_emergency_button.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_enabled="true" android:drawable="@drawable/ic_lockscreen_emergencycall_normal" />
- <item android:state_pressed="true" android:drawable="@drawable/ic_lockscreen_emergencycall_pressed" />
- <item android:drawable="@drawable/ic_lockscreen_emergencycall_normal" />
-</selector>
diff --git a/packages/Keyguard/res/drawable/scrubber_control_selector_holo.xml b/packages/Keyguard/res/drawable/scrubber_control_selector_holo.xml
deleted file mode 100644
index d09b1a5..0000000
--- a/packages/Keyguard/res/drawable/scrubber_control_selector_holo.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_enabled="false" android:drawable="@drawable/scrubber_control_disabled_holo" />
- <item android:state_pressed="true" android:drawable="@drawable/scrubber_control_pressed_holo" />
- <item android:state_selected="true" android:drawable="@drawable/scrubber_control_focused_holo" />
- <item android:drawable="@drawable/scrubber_control_normal_holo" />
-</selector>
diff --git a/packages/Keyguard/res/drawable/scrubber_progress_horizontal_holo_light.xml b/packages/Keyguard/res/drawable/scrubber_progress_horizontal_holo_light.xml
deleted file mode 100644
index f07c742..0000000
--- a/packages/Keyguard/res/drawable/scrubber_progress_horizontal_holo_light.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 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.
--->
-
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@android:id/background"
- android:drawable="@drawable/scrubber_track_holo_light" />
- <item android:id="@android:id/secondaryProgress">
- <scale android:scaleWidth="100%"
- android:drawable="@drawable/scrubber_secondary_holo" />
- </item>
- <item android:id="@android:id/progress">
- <scale android:scaleWidth="100%"
- android:drawable="@drawable/scrubber_primary_holo" />
- </item>
-</layer-list>
diff --git a/packages/Keyguard/res/layout-land/keyguard_host_view.xml b/packages/Keyguard/res/layout-land/keyguard_host_view.xml
deleted file mode 100644
index 891910e..0000000
--- a/packages/Keyguard/res/layout-land/keyguard_host_view.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- This is the host view that generally contains two sub views: the widget view
- and the security view. -->
-<com.android.keyguard.KeyguardHostView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/res-auto"
- android:id="@+id/keyguard_host_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal"
- android:clipChildren="false"
- android:clipToPadding="false">
-
- <com.android.keyguard.MultiPaneChallengeLayout
- android:id="@+id/multi_pane_challenge"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal"
- android:clipChildren="false"
- android:clipToPadding="false">
-
- <include layout="@layout/keyguard_widget_remove_drop_target"
- android:id="@+id/keyguard_widget_pager_delete_target"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="top|center_horizontal"
- androidprv:layout_childType="pageDeleteDropTarget" />
-
- <include layout="@layout/keyguard_widget_pager"
- android:id="@+id/app_widget_container"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- androidprv:layout_centerWithinArea="0.55"
- androidprv:layout_childType="widget"
- androidprv:layout_maxWidth="480dp"
- androidprv:layout_maxHeight="480dp" />
- <include layout="@layout/keyguard_multi_user_selector"/>
-
- <View android:layout_width="match_parent"
- android:layout_height="match_parent"
- androidprv:layout_childType="scrim"
- android:background="#99000000" />
-
- <com.android.keyguard.KeyguardSecurityContainer
- android:id="@+id/keyguard_security_container"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clipChildren="false"
- android:clipToPadding="false"
- androidprv:layout_childType="challenge"
- androidprv:layout_centerWithinArea="0.55">
- <com.android.keyguard.KeyguardSecurityViewFlipper
- android:id="@+id/view_flipper"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:paddingLeft="@dimen/keyguard_security_view_margin"
- android:paddingTop="@dimen/keyguard_security_view_margin"
- android:paddingRight="@dimen/keyguard_security_view_margin"
- android:paddingBottom="@dimen/keyguard_security_view_margin"
- android:gravity="center">
- </com.android.keyguard.KeyguardSecurityViewFlipper>
- </com.android.keyguard.KeyguardSecurityContainer>
-
- </com.android.keyguard.MultiPaneChallengeLayout>
-</com.android.keyguard.KeyguardHostView>
-
diff --git a/packages/Keyguard/res/layout-land/keyguard_widget_pager.xml b/packages/Keyguard/res/layout-land/keyguard_widget_pager.xml
deleted file mode 100644
index 50c2709..0000000
--- a/packages/Keyguard/res/layout-land/keyguard_widget_pager.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- This is the selector widget that allows the user to select an action. -->
-<com.android.keyguard.KeyguardWidgetCarousel
- xmlns:androidprv="http://schemas.android.com/apk/res-auto"
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:paddingLeft="25dp"
- android:paddingRight="25dp"
- android:paddingTop="25dp"
- android:paddingBottom="25dp"
- android:clipToPadding="false"
- androidprv:pageSpacing="10dp">
-</com.android.keyguard.KeyguardWidgetCarousel>
diff --git a/packages/Keyguard/res/layout-port/keyguard_host_view.xml b/packages/Keyguard/res/layout-port/keyguard_host_view.xml
deleted file mode 100644
index 1b8820b..0000000
--- a/packages/Keyguard/res/layout-port/keyguard_host_view.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- This is the host view that generally contains two sub views: the widget view
- and the security view. -->
-<com.android.keyguard.KeyguardHostView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/res-auto"
- android:id="@+id/keyguard_host_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center_horizontal"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:orientation="vertical">
-
- <com.android.keyguard.SlidingChallengeLayout
- android:id="@+id/sliding_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:clipChildren="false"
- android:clipToPadding="false">
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- androidprv:layout_childType="pageDeleteDropTarget">
- <include layout="@layout/keyguard_widget_remove_drop_target"
- android:id="@+id/keyguard_widget_pager_delete_target"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="top|center_horizontal" />
- </FrameLayout>
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- androidprv:layout_childType="widgets">
- <include layout="@layout/keyguard_widget_pager"
- android:id="@+id/app_widget_container"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_gravity="center"/>
- </FrameLayout>
-
- <View android:layout_width="match_parent"
- android:layout_height="match_parent"
- androidprv:layout_childType="scrim"
- android:background="#99000000" />
-
- <com.android.keyguard.KeyguardSecurityContainer
- android:id="@+id/keyguard_security_container"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clipChildren="false"
- android:clipToPadding="false"
- androidprv:layout_maxHeight="@dimen/keyguard_security_height"
- androidprv:layout_childType="challenge"
- android:padding="0dp"
- android:gravity="bottom|center_horizontal">
- <com.android.keyguard.KeyguardSecurityViewFlipper
- android:id="@+id/view_flipper"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:paddingTop="@dimen/keyguard_security_view_margin"
- android:gravity="center">
- </com.android.keyguard.KeyguardSecurityViewFlipper>
- </com.android.keyguard.KeyguardSecurityContainer>
-
- <ImageButton
- android:layout_width="match_parent"
- android:layout_height="@dimen/kg_widget_pager_bottom_padding"
- androidprv:layout_childType="expandChallengeHandle"
- android:focusable="true"
- android:background="@null"
- android:src="@drawable/keyguard_expand_challenge_handle"
- android:scaleType="center"
- android:contentDescription="@string/keyguard_accessibility_expand_lock_area" />
-
- </com.android.keyguard.SlidingChallengeLayout>
-</com.android.keyguard.KeyguardHostView>
-
diff --git a/packages/Keyguard/res/layout-port/keyguard_widget_pager.xml b/packages/Keyguard/res/layout-port/keyguard_widget_pager.xml
deleted file mode 100644
index 6d7d864..0000000
--- a/packages/Keyguard/res/layout-port/keyguard_widget_pager.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- This is the selector widget that allows the user to select an action. -->
-<com.android.keyguard.KeyguardWidgetPager
- xmlns:androidprv="http://schemas.android.com/apk/res-auto"
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/app_widget_container"
- android:paddingLeft="25dp"
- android:paddingRight="25dp"
- android:paddingTop="25dp"
- android:paddingBottom="@dimen/kg_widget_pager_bottom_padding"
- android:clipToPadding="false"
- androidprv:pageSpacing="10dp">
-</com.android.keyguard.KeyguardWidgetPager>
diff --git a/packages/Keyguard/res/layout-sw600dp-port/keyguard_host_view.xml b/packages/Keyguard/res/layout-sw600dp-port/keyguard_host_view.xml
deleted file mode 100644
index f2f3981..0000000
--- a/packages/Keyguard/res/layout-sw600dp-port/keyguard_host_view.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- This is the host view that generally contains two sub views: the widget view
- and the security view. -->
-<com.android.keyguard.KeyguardHostView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/res-auto"
- android:id="@+id/keyguard_host_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal"
- android:clipChildren="false"
- android:clipToPadding="false">
-
- <com.android.keyguard.MultiPaneChallengeLayout
- android:id="@+id/multi_pane_challenge"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:orientation="vertical">
-
- <include layout="@layout/keyguard_widget_remove_drop_target"
- android:id="@+id/keyguard_widget_pager_delete_target"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="top|center_horizontal"
- androidprv:layout_childType="pageDeleteDropTarget" />
-
- <include layout="@layout/keyguard_widget_pager"
- android:id="@+id/app_widget_container"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- androidprv:layout_centerWithinArea="0.5"
- androidprv:layout_childType="widget"
- androidprv:layout_maxWidth="480dp"
- androidprv:layout_maxHeight="480dp" />
-
- <include layout="@layout/keyguard_multi_user_selector"/>
-
- <View android:layout_width="match_parent"
- android:layout_height="match_parent"
- androidprv:layout_childType="scrim"
- android:background="#99000000" />
-
- <com.android.keyguard.KeyguardSecurityContainer
- android:id="@+id/keyguard_security_container"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clipChildren="false"
- android:clipToPadding="false"
- androidprv:layout_centerWithinArea="0.5"
- androidprv:layout_childType="challenge"
- android:layout_gravity="center_horizontal|bottom">
- <com.android.keyguard.KeyguardSecurityViewFlipper
- android:id="@+id/view_flipper"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:paddingLeft="@dimen/keyguard_security_view_margin"
- android:paddingTop="@dimen/keyguard_security_view_margin"
- android:paddingRight="@dimen/keyguard_security_view_margin"
- android:paddingBottom="@dimen/keyguard_security_view_margin"
- android:gravity="center">
- </com.android.keyguard.KeyguardSecurityViewFlipper>
- </com.android.keyguard.KeyguardSecurityContainer>
-
- </com.android.keyguard.MultiPaneChallengeLayout>
-</com.android.keyguard.KeyguardHostView>
diff --git a/packages/Keyguard/res/layout-sw600dp/keyguard_glow_pad_container.xml b/packages/Keyguard/res/layout-sw600dp/keyguard_glow_pad_container.xml
deleted file mode 100644
index 930b14e..0000000
--- a/packages/Keyguard/res/layout-sw600dp/keyguard_glow_pad_container.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <include layout="@layout/keyguard_glow_pad_view"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center" />
-</merge>
\ No newline at end of file
diff --git a/packages/Keyguard/res/layout/keyguard_account_view.xml b/packages/Keyguard/res/layout/keyguard_account_view.xml
deleted file mode 100644
index bde2ec6..0000000
--- a/packages/Keyguard/res/layout/keyguard_account_view.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<com.android.keyguard.KeyguardAccountView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/res-auto"
- android:id="@+id/keyguard_account_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- androidprv:layout_maxWidth="@dimen/keyguard_security_width"
- androidprv:layout_maxHeight="@dimen/keyguard_security_height"
- android:orientation="vertical">
-
- <include layout="@layout/keyguard_message_area"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1">
-
- <EditText
- android:id="@+id/login"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="8dip"
- android:layout_marginStart="7dip"
- android:layout_marginEnd="7dip"
- android:layout_alignParentTop="true"
- android:hint="@string/kg_login_username_hint"
- android:inputType="textEmailAddress"
- />
-
- <EditText
- android:id="@+id/password"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/login"
- android:layout_toLeftOf="@+id/ok"
- android:layout_marginTop="15dip"
- android:layout_marginStart="7dip"
- android:layout_marginEnd="7dip"
- android:inputType="textPassword"
- android:hint="@string/kg_login_password_hint"
- android:nextFocusRight="@+id/ok"
- android:nextFocusDown="@+id/ok"
- />
-
- <!-- ok below password, aligned to right of screen -->
- <Button
- android:id="@+id/ok"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="7dip"
- android:layout_alignParentEnd="true"
- android:layout_below="@id/login"
- android:text="@string/kg_login_submit_button"
- />
-
- </RelativeLayout>
-
- <!-- no room for ECA on this screen right now
- <include layout="@layout/keyguard_eca"
- android:id="@+id/keyguard_selector_fade_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_gravity="bottom|center_horizontal"
- android:gravity="center_horizontal" />
- -->
-
-</com.android.keyguard.KeyguardAccountView>
diff --git a/packages/Keyguard/res/layout/keyguard_add_widget.xml b/packages/Keyguard/res/layout/keyguard_add_widget.xml
deleted file mode 100644
index 01b616c..0000000
--- a/packages/Keyguard/res/layout/keyguard_add_widget.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2009, 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.
-*/
--->
-
-<!-- This is a view that shows general status information in Keyguard. -->
-<com.android.keyguard.KeyguardWidgetFrame
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/keyguard_add_widget"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:contentDescription="@string/keyguard_accessibility_widget_empty_slot"
- >
- <ImageView
- android:id="@+id/keyguard_add_widget_view"
- android:clickable="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:padding="24dp"
- android:src="@drawable/keyguard_add_widget_button"
- android:contentDescription="@string/keyguard_accessibility_add_widget"/>
- </FrameLayout>
-</com.android.keyguard.KeyguardWidgetFrame>
diff --git a/packages/Keyguard/res/layout/keyguard_bouncer.xml b/packages/Keyguard/res/layout/keyguard_bouncer.xml
index 296efb3..8c80e78 100644
--- a/packages/Keyguard/res/layout/keyguard_bouncer.xml
+++ b/packages/Keyguard/res/layout/keyguard_bouncer.xml
@@ -24,7 +24,7 @@
<include
style="@style/BouncerSecurityContainer"
- layout="@layout/keyguard_simple_host_view"
+ layout="@layout/keyguard_host_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
diff --git a/packages/Keyguard/res/layout/keyguard_emergency_carrier_area.xml b/packages/Keyguard/res/layout/keyguard_emergency_carrier_area.xml
index a083f89..7e09a5b 100644
--- a/packages/Keyguard/res/layout/keyguard_emergency_carrier_area.xml
+++ b/packages/Keyguard/res/layout/keyguard_emergency_carrier_area.xml
@@ -46,13 +46,11 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginTop="@dimen/eca_overlap"
- android:drawableLeft="@drawable/lockscreen_emergency_button"
android:text="@string/kg_emergency_call_label"
style="?android:attr/buttonBarButtonStyle"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textSize="@dimen/kg_status_line_font_size"
android:textColor="?android:attr/textColorSecondary"
- android:drawablePadding="8dip"
android:textAllCaps="@bool/kg_use_all_caps" />
</com.android.keyguard.EmergencyCarrierArea>
diff --git a/packages/Keyguard/res/layout/keyguard_face_unlock_view.xml b/packages/Keyguard/res/layout/keyguard_face_unlock_view.xml
deleted file mode 100644
index 0c85dab..0000000
--- a/packages/Keyguard/res/layout/keyguard_face_unlock_view.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- This is the screen that allows the user to unlock by showing their face. -->
-<com.android.keyguard.KeyguardFaceUnlockView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/res-auto"
- android:id="@+id/keyguard_face_unlock_view"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- androidprv:layout_maxWidth="@dimen/keyguard_security_width"
- androidprv:layout_maxHeight="@dimen/keyguard_security_height"
- android:contentDescription="@string/keyguard_accessibility_face_unlock">
-
- <include layout="@layout/keyguard_message_area"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- />
-
- <FrameLayout
- android:id="@+id/keyguard_bouncer_frame"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- >
- <com.android.internal.widget.FaceUnlockView
- android:id="@+id/face_unlock_area_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_gravity="center_horizontal"
- android:background="@drawable/intro_bg"
- android:gravity="center">
-
- <View
- android:id="@+id/spotlightMask"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/facelock_spotlight_mask"
- />
-
- <ImageButton
- android:id="@+id/face_unlock_cancel_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="5dip"
- android:layout_alignParentTop="true"
- android:layout_alignParentEnd="true"
- android:background="#00000000"
- android:src="@drawable/ic_facial_backup"
- />
- </com.android.internal.widget.FaceUnlockView>
- </FrameLayout>
-
- <include layout="@layout/keyguard_eca"
- android:id="@+id/keyguard_selector_fade_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_gravity="bottom|center_horizontal"
- android:gravity="center_horizontal" />
-</com.android.keyguard.KeyguardFaceUnlockView>
diff --git a/packages/Keyguard/res/layout/keyguard_glow_pad_container.xml b/packages/Keyguard/res/layout/keyguard_glow_pad_container.xml
deleted file mode 100644
index 07953b4..0000000
--- a/packages/Keyguard/res/layout/keyguard_glow_pad_container.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
- <include layout="@layout/keyguard_glow_pad_view"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom|center_horizontal"
- android:layout_marginBottom="@dimen/glowpadcontainer_bottom_margin"/>
-</merge>
diff --git a/packages/Keyguard/res/layout/keyguard_glow_pad_view.xml b/packages/Keyguard/res/layout/keyguard_glow_pad_view.xml
deleted file mode 100644
index 2432336..0000000
--- a/packages/Keyguard/res/layout/keyguard_glow_pad_view.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- This is the selector widget that allows the user to select an action. -->
-<com.android.internal.widget.multiwaveview.GlowPadView
- xmlns:prvandroid="http://schemas.android.com/apk/prv/res/android"
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/glow_pad_view"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:orientation="horizontal"
- android:gravity="@integer/kg_selector_gravity"
- android:contentDescription="@string/keyguard_accessibility_slide_area"
- prvandroid:handleDrawable="@drawable/ic_lockscreen_handle"
- prvandroid:outerRingDrawable="@drawable/ic_lockscreen_outerring"
- prvandroid:outerRadius="@dimen/glowpadview_target_placement_radius"
- prvandroid:innerRadius="@dimen/glowpadview_inner_radius"
- prvandroid:snapMargin="@dimen/glowpadview_snap_margin"
- prvandroid:firstItemOffset="@integer/kg_glowpad_rotation_offset"
- prvandroid:magneticTargets="true"
- prvandroid:feedbackCount="1"
- prvandroid:vibrationDuration="20"
- prvandroid:glowRadius="@dimen/glowpadview_glow_radius"
- prvandroid:pointDrawable="@drawable/ic_lockscreen_glowdot"
- prvandroid:allowScaling="true" />
diff --git a/packages/Keyguard/res/layout/keyguard_host_view.xml b/packages/Keyguard/res/layout/keyguard_host_view.xml
new file mode 100644
index 0000000..3635aff
--- /dev/null
+++ b/packages/Keyguard/res/layout/keyguard_host_view.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 2012, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License")
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<!-- This is the host view that generally contains two sub views: the widget view
+ and the security view. -->
+<com.android.keyguard.KeyguardHostView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/keyguard_host_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:clipChildren="false"
+ android:clipToPadding="false">
+
+ <com.android.keyguard.KeyguardSecurityContainer
+ android:id="@+id/keyguard_security_container"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ androidprv:layout_maxHeight="@dimen/keyguard_security_max_height"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:padding="0dp"
+ android:layout_gravity="center">
+ <com.android.keyguard.KeyguardSecurityViewFlipper
+ android:id="@+id/view_flipper"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:paddingTop="@dimen/keyguard_security_view_margin"
+ android:gravity="center">
+ </com.android.keyguard.KeyguardSecurityViewFlipper>
+ </com.android.keyguard.KeyguardSecurityContainer>
+
+</com.android.keyguard.KeyguardHostView>
+
diff --git a/packages/Keyguard/res/layout/keyguard_multi_user_avatar.xml b/packages/Keyguard/res/layout/keyguard_multi_user_avatar.xml
deleted file mode 100644
index 41b0be9..0000000
--- a/packages/Keyguard/res/layout/keyguard_multi_user_avatar.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2009, 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.
-*/
--->
-
-<!-- This is a view that shows general status information in Keyguard. -->
-<com.android.keyguard.KeyguardMultiUserAvatar
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="@dimen/keyguard_avatar_size"
- android:layout_height="@dimen/keyguard_avatar_size"
- android:background="#00000000"
- android:gravity="center_horizontal">
- <ImageView
- android:id="@+id/keyguard_user_avatar"
- android:scaleType="center"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_gravity="center"/>
- <TextView
- android:id="@+id/keyguard_user_name"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom"
- android:gravity="center"
- android:textSize="@dimen/keyguard_avatar_name_size"
- android:textColor="#ffffff"
- android:singleLine="true"
- android:ellipsize="end"
- android:paddingLeft="2dp"
- android:paddingRight="2dp" />
-</com.android.keyguard.KeyguardMultiUserAvatar>
diff --git a/packages/Keyguard/res/layout/keyguard_multi_user_selector.xml b/packages/Keyguard/res/layout/keyguard_multi_user_selector.xml
deleted file mode 100644
index 83036ab..0000000
--- a/packages/Keyguard/res/layout/keyguard_multi_user_selector.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2009, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<com.android.keyguard.KeyguardMultiUserSelectorView
- xmlns:androidprv="http://schemas.android.com/apk/res-auto"
- xmlns:android="http://schemas.android.com/apk/res/android"
- androidprv:layout_childType="userSwitcher"
- android:id="@+id/keyguard_user_selector"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom"
- android:contentDescription="@string/keyguard_accessibility_user_selector"
- android:visibility="gone">
-
- <com.android.keyguard.KeyguardLinearLayout
- android:id="@+id/keyguard_users_grid"
- android:orientation="horizontal"
- android:layout_width="wrap_content"
- android:layout_marginBottom="@dimen/keyguard_muliuser_selector_margin"
- android:layout_height="@dimen/keyguard_avatar_size"
- android:layout_gravity="center|bottom" />
-
-</com.android.keyguard.KeyguardMultiUserSelectorView>
diff --git a/packages/Keyguard/res/layout/keyguard_password_view.xml b/packages/Keyguard/res/layout/keyguard_password_view.xml
index b7d5d30..cff2fc7 100644
--- a/packages/Keyguard/res/layout/keyguard_password_view.xml
+++ b/packages/Keyguard/res/layout/keyguard_password_view.xml
@@ -41,7 +41,6 @@
<!-- Password entry field -->
<FrameLayout
- android:id="@+id/keyguard_bouncer_frame"
android:layout_height="wrap_content"
android:layout_width="280dp"
android:layout_gravity="center_horizontal"
diff --git a/packages/Keyguard/res/layout/keyguard_pattern_view.xml b/packages/Keyguard/res/layout/keyguard_pattern_view.xml
index 1fb0420..61480650 100644
--- a/packages/Keyguard/res/layout/keyguard_pattern_view.xml
+++ b/packages/Keyguard/res/layout/keyguard_pattern_view.xml
@@ -41,6 +41,7 @@
android:clipToPadding="false">
<LinearLayout
+ android:id="@+id/container"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="vertical"
@@ -53,18 +54,10 @@
android:layout_height="wrap_content"
/>
- <FrameLayout
- android:id="@+id/keyguard_bouncer_frame"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:clipChildren="false"
- android:clipToPadding="false"
- >
<com.android.internal.widget.LockPatternView
android:id="@+id/lockPatternView"
android:layout_width="match_parent"
- android:layout_height="match_parent"
+ android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginEnd="8dip"
android:layout_marginBottom="4dip"
@@ -74,7 +67,7 @@
android:contentDescription="@string/keyguard_accessibility_pattern_area"
android:clipChildren="false"
android:clipToPadding="false" />
- </FrameLayout>
+
<include layout="@layout/keyguard_eca"
android:id="@+id/keyguard_selector_fade_container"
android:layout_width="match_parent"
diff --git a/packages/Keyguard/res/layout/keyguard_pin_view.xml b/packages/Keyguard/res/layout/keyguard_pin_view.xml
index 2e7464b..d3fb982 100644
--- a/packages/Keyguard/res/layout/keyguard_pin_view.xml
+++ b/packages/Keyguard/res/layout/keyguard_pin_view.xml
@@ -33,7 +33,7 @@
android:layout_height="wrap_content"
/>
<LinearLayout
- android:id="@+id/keyguard_bouncer_frame"
+ android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="vertical"
diff --git a/packages/Keyguard/res/layout/keyguard_presentation.xml b/packages/Keyguard/res/layout/keyguard_presentation.xml
index ab676aa..920498f 100644
--- a/packages/Keyguard/res/layout/keyguard_presentation.xml
+++ b/packages/Keyguard/res/layout/keyguard_presentation.xml
@@ -29,8 +29,7 @@
android:id="@+id/clock"
android:orientation="vertical"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:contentDescription="@string/keyguard_accessibility_status">
+ android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/packages/Keyguard/res/layout/keyguard_selector_view.xml b/packages/Keyguard/res/layout/keyguard_selector_view.xml
deleted file mode 100644
index 5330363..0000000
--- a/packages/Keyguard/res/layout/keyguard_selector_view.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- This is the selector widget that allows the user to select an action. -->
-<com.android.keyguard.KeyguardSelectorView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/res-auto"
- android:id="@+id/keyguard_selector_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- androidprv:layout_maxWidth="420dp"
- androidprv:layout_maxHeight="@dimen/keyguard_security_height"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:orientation="vertical"
- android:contentDescription="@string/keyguard_accessibility_slide_unlock">
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_gravity="center"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:gravity="center">
-
- <include layout="@layout/keyguard_message_area"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
-
- <View
- android:id="@+id/keyguard_selector_view_frame"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginLeft="16dp"
- android:layout_marginRight="16dp"/>
-
- <include layout="@layout/keyguard_glow_pad_container" />
-
- <include layout="@layout/keyguard_eca"
- android:id="@+id/keyguard_selector_fade_container"
- android:layout_width="match_parent"
- android:layout_height="48dp"
- android:layout_gravity="bottom|center_horizontal" />
- </FrameLayout>
-
-</com.android.keyguard.KeyguardSelectorView>
-
diff --git a/packages/Keyguard/res/layout/keyguard_sim_pin_view.xml b/packages/Keyguard/res/layout/keyguard_sim_pin_view.xml
index 929fa09..b0a93e6 100644
--- a/packages/Keyguard/res/layout/keyguard_sim_pin_view.xml
+++ b/packages/Keyguard/res/layout/keyguard_sim_pin_view.xml
@@ -39,7 +39,6 @@
android:layout_height="wrap_content"
/>
<LinearLayout
- android:id="@+id/keyguard_bouncer_frame"
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="vertical"
diff --git a/packages/Keyguard/res/layout/keyguard_sim_puk_view.xml b/packages/Keyguard/res/layout/keyguard_sim_puk_view.xml
index 0cf802d..cf41bd3 100644
--- a/packages/Keyguard/res/layout/keyguard_sim_puk_view.xml
+++ b/packages/Keyguard/res/layout/keyguard_sim_puk_view.xml
@@ -40,7 +40,6 @@
android:layout_height="wrap_content"
/>
<LinearLayout
- android:id="@+id/keyguard_bouncer_frame"
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="vertical"
diff --git a/packages/Keyguard/res/layout/keyguard_simple_host_view.xml b/packages/Keyguard/res/layout/keyguard_simple_host_view.xml
deleted file mode 100644
index 28ce265..0000000
--- a/packages/Keyguard/res/layout/keyguard_simple_host_view.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<!-- This is the host view that generally contains two sub views: the widget view
- and the security view. -->
-<com.android.keyguard.KeyguardSimpleHostView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:androidprv="http://schemas.android.com/apk/res-auto"
- android:id="@+id/keyguard_host_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:clipChildren="false"
- android:clipToPadding="false">
-
- <com.android.keyguard.KeyguardSecurityContainer
- android:id="@+id/keyguard_security_container"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- androidprv:layout_maxHeight="@dimen/keyguard_security_max_height"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:padding="0dp"
- android:layout_gravity="center">
- <com.android.keyguard.KeyguardSecurityViewFlipper
- android:id="@+id/view_flipper"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:paddingTop="@dimen/keyguard_security_view_margin"
- android:gravity="center">
- </com.android.keyguard.KeyguardSecurityViewFlipper>
- </com.android.keyguard.KeyguardSecurityContainer>
-
-</com.android.keyguard.KeyguardSimpleHostView>
-
diff --git a/packages/Keyguard/res/layout/keyguard_transport_control_view.xml b/packages/Keyguard/res/layout/keyguard_transport_control_view.xml
deleted file mode 100644
index da82e40..0000000
--- a/packages/Keyguard/res/layout/keyguard_transport_control_view.xml
+++ /dev/null
@@ -1,151 +0,0 @@
-<?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.
--->
-
-<!-- This is a view to control music playback in keyguard. -->
-<com.android.keyguard.KeyguardTransportControlView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- android:id="@+id/keyguard_transport_control">
-
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:gravity="center">
- <ImageView
- android:id="@+id/badge"
- android:layout_width="32dp"
- android:layout_height="32dp"
- android:scaleType="fitCenter" />
- <FrameLayout
- android:id="@+id/info_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <LinearLayout
- android:id="@+id/metadata_container"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center">
- <TextView
- android:id="@+id/title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginStart="16dip"
- android:layout_marginEnd="16dip"
- android:gravity="center_horizontal"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:fontFamily="sans-serif-light" />
- <TextView
- android:id="@+id/artist_album"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginStart="16dip"
- android:layout_marginEnd="16dip"
- android:gravity="center_horizontal"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?android:attr/textColorSecondary" />
- </LinearLayout>
- <RelativeLayout
- android:id="@+id/transient_seek"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:visibility="invisible">
- <SeekBar
- android:id="@+id/transient_seek_bar"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- style="@style/Widget.TransportControl.SeekBar" />
- <TextView
- android:id="@+id/transient_seek_time_elapsed"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentStart="true"
- android:layout_below="@id/transient_seek_bar"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textSize="12dp" />
- <TextView
- android:id="@+id/transient_seek_time_remaining"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentEnd="true"
- android:layout_below="@id/transient_seek_bar"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textSize="12dp" />
- </RelativeLayout>
- </FrameLayout>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="4dp"
- android:orientation="horizontal">
- <FrameLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1">
- <ImageButton
- android:id="@+id/btn_prev"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:src="@drawable/ic_media_previous"
- android:background="?android:attr/selectableItemBackground"
- android:minWidth="48dp"
- android:minHeight="48dp"
- android:contentDescription="@string/keyguard_accessibility_transport_prev_description"/>
- </FrameLayout>
- <FrameLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1">
- <ImageButton
- android:id="@+id/btn_play"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:src="@drawable/ic_media_play"
- android:background="?android:attr/selectableItemBackground"
- android:minWidth="48dp"
- android:minHeight="48dp"
- android:contentDescription="@string/keyguard_accessibility_transport_play_description"/>
- </FrameLayout>
- <FrameLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1">
- <ImageButton
- android:id="@+id/btn_next"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:src="@drawable/ic_media_next"
- android:background="?android:attr/selectableItemBackground"
- android:minWidth="48dp"
- android:minHeight="48dp"
- android:contentDescription="@string/keyguard_accessibility_transport_next_description"/>
- </FrameLayout>
- </LinearLayout>
- </LinearLayout>
-
-</com.android.keyguard.KeyguardTransportControlView>
diff --git a/packages/Keyguard/res/layout/keyguard_widget_remove_drop_target.xml b/packages/Keyguard/res/layout/keyguard_widget_remove_drop_target.xml
deleted file mode 100644
index 58b5b27..0000000
--- a/packages/Keyguard/res/layout/keyguard_widget_remove_drop_target.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License")
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<TextView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:gravity="center"
- android:padding="30dp"
- android:paddingLeft="60dp"
- android:paddingRight="60dp"
- android:drawableLeft="@drawable/kg_widget_delete_drop_target"
- android:drawablePadding="4dp"
- android:text="@string/kg_reordering_delete_drop_target_text"
- android:textColor="#FFF"
- android:textSize="12dp"
- android:shadowColor="#000"
- android:shadowDy="1.0"
- android:shadowRadius="1.0"
- android:visibility="gone" />
diff --git a/packages/Keyguard/res/values-af/strings.xml b/packages/Keyguard/res/values-af/strings.xml
index 4bfd98e..287d1e4 100644
--- a/packages/Keyguard/res/values-af/strings.xml
+++ b/packages/Keyguard/res/values-af/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Voer wagwoord in om te ontsluit"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Voer PIN in om te ontsluit"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Verkeerde PIN-kode."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Om te ontsluit, druk Kieslys dan 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Maksimum gesigontsluit-pogings oorskry"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Gelaai"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Laai tans"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Koppel jou herlaaier."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-kaart is gesluit."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kaart is PUK-geslote."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Ontsluit tans SIM-kaart…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Legstuk %2$d van %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Voeg legstuk by."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Leeg"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Ontsluitruimte uitgevou."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Ontsluitruimte ingevou."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>-legstuk."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Gebruikerkieser"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Media-kontroles"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Herordening van legstuk begin."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Herordening van legstuk beëindig."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Legstuk <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> uitgevee."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Vou ontsluitruimte uit."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Sleep-ontsluit."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Patroon ontsluit."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Gesigslot."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN ontsluit."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-area"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM-PIN-area"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM-PUK-area"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Vorigesnit-knoppie"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Volgendesnit-knoppie"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Laatwag-knoppie"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Speel-knoppie"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop-knoppie"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Laaik baie"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Laaik niks"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hart"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Ontsluit om voort te gaan"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Begin gekanselleer"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Laat los <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> om uit te vee."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> sal nie uitgevee word nie."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Volgende wekker gestel vir <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Kanselleer"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Vee uit"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Klaar"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Modus verander"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Invoersleutel"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Ontsluit"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Stil"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Klank aan"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Soek"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Gly op vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Gly af vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Gly links vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Gly regs vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Huidige gebruiker <xliff:g id="NAME">%1$s</xliff:g> ."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Noodoproep"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Het jy die patroon vergeet?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Verkeerde patroon"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Voer weer die korrekte PUK-kode in. Herhaalde pogings sal die SIM permanent deaktiveer."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN-kodes stem nie ooreen nie"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Te veel patroonpogings"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Om te ontsluit, meld met jou Google-rekening aan."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Gebruikernaam (e-pos)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Wagwoord"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Meld aan"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Ongeldige gebruikernaam of wagwoord."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Het jy jou gebruikernaam of wagwoord vergeet?\nBesoek "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Kontroleer tans rekening..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Jy het jou PIN <xliff:g id="NUMBER_0">%d</xliff:g> keer verkeerd ingetik. \n\nProbeer weer oor <xliff:g id="NUMBER_1">%d</xliff:g> sekondes."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Jy het <xliff:g id="NUMBER_0">%d</xliff:g> keer jou wagwoord verkeerdelik getik. \n\nProbeer weer oor <xliff:g id="NUMBER_1">%d</xliff:g> sekondes."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Jy het jou ontsluitpatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer verkeerdelik geteken. \n\nProbeer weer oor <xliff:g id="NUMBER_1">%d</xliff:g> sekondes."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Jy het die foon <xliff:g id="NUMBER">%d</xliff:g> keer verkeerd probeer ontsluit. Die werkprofiel sal verwyder word, wat alle profieldata sal uitvee."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Jy het jou ontsluitpatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer verkeerdelik geteken. Na nog <xliff:g id="NUMBER_1">%d</xliff:g> onsuksesvolle pogings, sal jy gevra word om jou tablet te ontsluit deur middel van \'n e-posrekening.\n\n Probeer weer oor <xliff:g id="NUMBER_2">%d</xliff:g> sekondes."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Jy het jou ontsluitpatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer verkeerdelik geteken. Na nog <xliff:g id="NUMBER_1">%d</xliff:g> onsuksesvolle pogings, sal jy gevra word om jou foon te ontsluit deur middel van \'n e-posrekening.\n\n Probeer weer oor <xliff:g id="NUMBER_2">%d</xliff:g> sekondes."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Verwyder"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Verkeerde SIM PIN-kode, jy sal nou jou diensverskaffer moet kontak om jou toestel te ontsluit."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Verkeerde SIM PIN-kode, jy het <xliff:g id="NUMBER">%d</xliff:g> oorblywende poging voordat jy jou diensverskaffer sal moet kontak om jou toestel te ontsluit."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN-bewerking het misluk!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK-bewerking het misluk!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Kode is aanvaar!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Vorigesnit-knoppie"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Volgendesnit-knoppie"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Laatwag-knoppie"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Speel-knoppie"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Stop-knoppie"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Geen diens nie."</string>
</resources>
diff --git a/packages/Keyguard/res/values-am/strings.xml b/packages/Keyguard/res/values-am/strings.xml
index 714a3eb..3e7e997 100644
--- a/packages/Keyguard/res/values-am/strings.xml
+++ b/packages/Keyguard/res/values-am/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"ለመክፈት የይለፍ ቃል ተይብ"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"ለመክፈት ፒን ተይብ"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ትክክል ያልሆነ ፒን ኮድ።"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"ለመክፈት፣ምናሌ ተጫን ከዛ 0"</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"የመጨረሻውን የገጽ ክፈት ሙከራዎችን አልፏል"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"ባትሪ ሞልቷል"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"ኃይል በመሙላት ላይ"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"የኃይል መሙያዎን ይሰኩ።"</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"ሲም ካርድ ተዘግቷል።"</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ሲም ካርድ በፒዩኬ ተዘግቷል።"</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"ሲም ካርዱን በመክፈት ላይ…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s። ምግብር %2$d ከ%3$d።"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ንዑስ ፕሮግራም አክል"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ባዶ"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"የመክፈቻ አካባቢ ተስፋፍቷል።"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"የመክፈቻ አካባቢ ተሰብስቧል።"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"የ<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ንዑስ ፕሮግራም።"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"ተጠቃሚ መራጭ"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"ካሜራ"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"የሚዲያ መቆጣጠሪያዎች"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"የንዑስ ፕሮግራም ዳግም መደርደር ተጀምሯል።"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"የንዑስ ፕሮግራም ዳግም መደርደር አብቅቷል።"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"ንዑስ ፕሮግራም <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ተሰርዟል።"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"የመክፈቻ አካባቢውን አስፋፋ።"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"በማንሸራተት ክፈት።"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"በስርዓተ-ጥለት መክፈት።"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"በፊት መክፈት።"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"በፒን መክፈት።"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"የፒን አካባቢ"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"የሲም ፒን አካባቢ"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"የሲም PUK አካባቢ"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"የቀዳሚ ትራክ አዝራር"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"የቀጣይ ትራክ አዝራር"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ለአፍታ አቁም አዝራር"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"የአጫውት አዝራር"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"አቁም አዝራር"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"አሪፍ"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ደባሪ"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"ልብ"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ለመቀጠል ይክፈቱ"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ማስጀመር ተሰርዟል"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ለመሰረዝ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>ን ጣል ያድርጉ።"</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> አይሰርዝም።"</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"ቀጣዩ ማንቂያ ለ<xliff:g id="ALARM">%1$s</xliff:g> ተዘጋጅቷል"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"ይቅር"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ሰርዝ"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"ተከናውኗል"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ሞድ ለውጥ"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"ቀይር"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"አስገባ"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"ክፈት"</string>
- <string name="description_target_camera" msgid="969071997552486814">"ካሜራ"</string>
- <string name="description_target_silent" msgid="893551287746522182">"ፀጥታ"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"ድምፅ አብራ"</string>
- <string name="description_target_search" msgid="3091587249776033139">"ፍለጋ"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ላይ አንሸራትት።"</string>
- <string name="description_direction_down" msgid="5087739728639014595">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ታች አንሸራትት።"</string>
- <string name="description_direction_left" msgid="7207478719805562165">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ግራ አንሸራትት።"</string>
- <string name="description_direction_right" msgid="8034433242579600980">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ቀኝ አንሸራትት።"</string>
- <string name="user_switched" msgid="3768006783166984410">"የአሁኑ ተጠቃሚ <xliff:g id="NAME">%1$s</xliff:g>።"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"የአደጋ ጊዜ ጥሪ"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ስርዓተ ጥለቱን እርሳ"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"የተሳሳተ ስርዓተ ጥለት"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"ትክክለኛውን የPUK ኮድ እንደገና ያስገቡ። ተደጋጋሚ ሙከራዎች ሲም ካርዱን እስከመጨረሻው ያሰናክሉታል።"</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"ፒን ኮዶች አይገጣጠሙም"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"በጣም ብዙ የስርዓተ ጥለት ሙከራዎች"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"ለመክፈት በGoogle መለያዎ ይግቡ።"</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"የተጠቃሚ ስም (ኢሜይል)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"የይለፍ ቃል"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"ግባ"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"ልክ ያልሆነ የተጠቃሚ ስም ወይም የይለፍ ቃል።"</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"የተጠቃሚ ስምዎን ወይም የይለፍ ቃልዎን ረሱት?\n"<b>"google.com/accounts/recovery"</b>"ይጎብኙ።"</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"መለያውን በማረጋገጥ ላይ…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"ፒንዎን <xliff:g id="NUMBER_0">%d</xliff:g> ጊዜ በትክክል አልተየቡም። \n\nበ<xliff:g id="NUMBER_1">%d</xliff:g> ሰኮንዶች ውስጥ እንደገና ይሞክሩ።"</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"የይለፍ ቃልዎን <xliff:g id="NUMBER_0">%d</xliff:g> ጊዜ ትክክል ባልሆነ መንገድ ተይበዋል።\n\nበ<xliff:g id="NUMBER_1">%d</xliff:g> ሰኮንዶች ውስጥ እንደገና ይሞክሩ።"</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"የመክፈቻ ስርዓተ ጥለትዎን <xliff:g id="NUMBER_0">%d</xliff:g> ጊዜ በትክክል አልሳሉትም። \n\n ከ<xliff:g id="NUMBER_1">%d</xliff:g> ሰከንዶች በኋላ እንደገና ይሞክሩ።"</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"ስልኩን <xliff:g id="NUMBER">%d</xliff:g> ጊዜ ትክክል ባልሆነ መልኩ ለማስከፈት ሞክረዋል። የስራ መገለጫው ይወገዳል፣ ይህም ሁሉንም የመገለጫ ውሂብ ይሰርዛል።"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"የመክፈቻ ስርዓተ ጥለቱን <xliff:g id="NUMBER_0">%d</xliff:g> ጊዜ በትክክል አልሳሉትም። ከ<xliff:g id="NUMBER_1">%d</xliff:g> ተጨማሪ ያልተሳኩ ሙከራዎች በኋላ የኢሜይል መለያ ተጠቅመው ጡባዊ ቱኮዎን እንዲከፍቱ ይጠየቃሉ።\n\n ከ<xliff:g id="NUMBER_2">%d</xliff:g> ከሰከንዶች በኋላ እንደገና ይሞክሩ።"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"የመክፈቻ ስርዓተ ጥለቱን <xliff:g id="NUMBER_0">%d</xliff:g> ጊዜ በትክክል አልሳሉትም። ከ<xliff:g id="NUMBER_1">%d</xliff:g> ተጨማሪ ያልተሳኩ ሙከራዎች በኋላ የኢሜይል መለያ ተጠቅመው ስልክዎን እንዲከፍቱ ይጠየቃሉ።\n\nእባክዎ ከ<xliff:g id="NUMBER_2">%d</xliff:g> ሰከንዶች በኋላ እንደገና ይሞክሩ።"</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"አስወግድ"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"ልክ ያልሆነ የሲም ኮድ። አሁን መሳሪያዎን ለማስከፈት ድምጸ ተያያዥ ሞደምዎን ማግኘት አለብዎ።"</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"ልክ ያልሆነ የሲም ፒን ኮድ፣ መሳሪያዎን ለማስከፈት ድምጸ ተያያዥ ሞደምዎን ማግኘት ግዴታዎ ሊሆን <xliff:g id="NUMBER">%d</xliff:g> ሙከራ ይቀርዎታል።"</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"የሲም ፒን ክወና አልተሳካም!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"የሲም PUK ክወና አልተሳካም!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"ኮዱ ተቀባይነት አግኝቷል!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"የቀዳሚ ትራክ አዝራር"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"የቀጣይ ትራክ አዝራር"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"ለአፍታ አቁም አዝራር"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"የአጫውት አዝራር"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"አቁም አዝራር"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"ከአገልግሎት መስጫ ክልል ውጪ።"</string>
</resources>
diff --git a/packages/Keyguard/res/values-ar/strings.xml b/packages/Keyguard/res/values-ar/strings.xml
index 5a8d2bd..408096f 100644
--- a/packages/Keyguard/res/values-ar/strings.xml
+++ b/packages/Keyguard/res/values-ar/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"اكتب كلمة المرور لإلغاء التأمين"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"اكتب رمز PIN لإلغاء التأمين"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"رمز PIN غير صحيح."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"لإلغاء التأمين، اضغط على \"القائمة\" ثم على 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"تم تجاوز الحد الأقصى لعدد محاولات تأمين الجهاز بالوجه"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"تم الشحن"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"جارٍ الشحن"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"توصيل جهاز الشحن."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"بطاقة SIM مؤمّنة."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"بطاقة SIM مؤمّنة بكود PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"جارٍ إلغاء تأمين بطاقة SIM…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. الأداة %2$d من %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"إضافة أداة."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"فارغة"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"تم توسيع منطقة إلغاء القفل."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"تم تصغير منطقة إلغاء القفل."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"أداة <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"محدد المستخدم"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"الكاميرا"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"أدوات التحكم في الوسائط"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"بدأت إعادة ترتيب الأدوات."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"انتهت إعادة ترتيب الأدوات."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"تم حذف أداة <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"توسيع منطقة إلغاء القفل."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"إلغاء القفل باستخدام التمرير."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"إلغاء القفل باستخدام النقش."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"تأمين الجهاز بالوجه."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"إلغاء القفل باستخدام رمز PIN."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"منطقة رقم التعريف الشخصي"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"منطقة رقم التعريف الشخصي لبطاقة SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"منطقة PUK لبطاقة SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"زر المقطع الصوتي السابق"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"زر المقطع الصوتي التالي"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"زر الإيقاف المؤقت"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"زر التشغيل"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"زر الإيقاف"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"رائعة"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"معارضة"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"قلب"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"إلغاء القفل للمتابعة"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"تم إلغاء التشغيل"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"أسقط <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> للحذف."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"لن يتم حذف <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"تم ضبط التنبيه التالي على <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ب ت ث"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"إلغاء"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"حذف"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"تم"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"تغيير الوضع"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"العالي"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"إلغاء تأمين"</string>
- <string name="description_target_camera" msgid="969071997552486814">"الكاميرا"</string>
- <string name="description_target_silent" msgid="893551287746522182">"صامت"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"تشغيل الصوت"</string>
- <string name="description_target_search" msgid="3091587249776033139">"بحث"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"تمرير لأعلى لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"تمرير لأسفل لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"تمرير لليسار لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"تمرير لليمين لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"المستخدم الحالي <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"الاتصال بالطوارئ"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"نسيت النقش"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"نقش خاطئ"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"أعد إدخال رمز PUK الصحيح. وستؤدي المحاولات المتكررة إلى تعطيل بطاقة SIM نهائيًا."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"لا يتطابق رمزا رمز PIN"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"محاولات النقش كثيرة جدًا"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"لإلغاء التأمين، سجّل الدخول بحسابك في Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"اسم المستخدم (البريد إلكتروني)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"كلمة المرور"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"تسجيل الدخول"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"اسم مستخدم غير صحيح أو كلمة مرور غير صالحة."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"هل نسيت اسم المستخدم أو كلمة المرور؟\nانتقل إلى "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"جارٍ فحص الحساب…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"لقد كتبت رمز PIN بشكل غير صحيح <xliff:g id="NUMBER_0">%d</xliff:g> مرة. \n\nأعد المحاولة خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"لقد كتبت كلمة المرور بشكل غير صحيح <xliff:g id="NUMBER_0">%d</xliff:g> مرة. \n\nأعد المحاولة خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"لقد رسمت نقش إلغاء التأمين بطريقة غير صحيحة <xliff:g id="NUMBER_0">%d</xliff:g> مرة. \n\nأعد المحاولة خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"أخطأت في محاولة إلغاء قفل الهاتف <xliff:g id="NUMBER">%d</xliff:g> من المرات. ستتم إزالة الملف الشخصي للعمل والتي بدورها تحذف جميع بياناته."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"لقد رسمت نقش إلغاء التأمين بشكل غير صحيح <xliff:g id="NUMBER_0">%d</xliff:g> مرة. بعد إجراء <xliff:g id="NUMBER_1">%d</xliff:g> من المحاولات غير الناجحة الأخرى، ستطالَب بإلغاء تأمين الجهاز اللوحي باستخدام معلومات حساب بريد إلكتروني.\n\n أعد المحاولة خلال <xliff:g id="NUMBER_2">%d</xliff:g> ثانية."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"لقد رسمت نقش إلغاء التأمين بشكل غير صحيح <xliff:g id="NUMBER_0">%d</xliff:g> مرة. بعد إجراء <xliff:g id="NUMBER_1">%d</xliff:g> من المحاولات غير الناجحة الأخرى، ستُطالب بإلغاء تأمين الهاتف باستخدام حساب بريد إلكتروني لإلغاء تأمين الهاتف.\n\n أعد المحاولة خلال <xliff:g id="NUMBER_2">%d</xliff:g> ثانية."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"إزالة"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"رمز \"رقم التعريف الشخصي\" لبطاقة SIM غير صحيح، ويلزمك الاتصال الآن بمشغّل شبكة الجوّال لإلغاء قفل الجهاز."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"رمز \"رقم التعريف الشخصي\" لبطاقة SIM غير صحيح، ويتبقى لديك محاولة واحدة (<xliff:g id="NUMBER">%d</xliff:g>) يتعين عليك بعدها الاتصال بمشغّل شبكة الجوّال لإلغاء قفل الجهاز."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"أخفقت عملية \"رقم التعريف الشخصي\" لبطاقة SIM!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"أخفقت عملية PUK لبطاقة SIM!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"تم قبول الرمز!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"زر المقطع الصوتي السابق"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"زر المقطع الصوتي التالي"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"زر الإيقاف المؤقت"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"زر التشغيل"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"زر الإيقاف"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"لا تتوفر خدمة"</string>
</resources>
diff --git a/packages/Keyguard/res/values-bg/strings.xml b/packages/Keyguard/res/values-bg/strings.xml
index bdfbdff..6eb8a73 100644
--- a/packages/Keyguard/res/values-bg/strings.xml
+++ b/packages/Keyguard/res/values-bg/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Въведете парола, за да отключите"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Въведете ПИН, за да отключите"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Неправилен ПИН код."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"За да отключите, натиснете „Меню“ и после 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Максималният брой опити за отключване с лице е надвишен"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Заредена"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Зарежда се"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Свържете зарядното си устройство."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM картата е заключена."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM картата е заключена с PUK код."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM картата се отключва…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Приспособление %2$d от %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Добавяне на приспособление."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Празно"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Областта за отключване е разгъната."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Областта за отключване е свита."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Приспособление за <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Инструмент за избор на потребители"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Камера"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Контроли за мултимедията"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Пренареждането на приспособленията започна."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Пренареждането на приспособленията завърши."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Приспособлението за <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> е изтрито."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Разгъване на областта за отключване."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Отключване с плъзгане."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Отключване с фигура."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Отключване с лице."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Отключване с ПИН код."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Област за ПИН кода"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Област за ПИН кода на SIM картата"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Област за PUK кода на SIM картата"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Бутон за предишния запис"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Бутон за следващия запис"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Бутон за пауза"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Бутон за пускане"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Бутон за спиране"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Харесва ми"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Не ми харесва"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Сърце"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Отключете, за да продължите"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Стартирането е анулирано"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Пуснете <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, за да изтриете."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> няма да се изтрие."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Следващият будилник е зададен за <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"АБВ"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Отказ"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Изтриване"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Готово"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Промяна на режима"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Отключване"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Камера"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Тих режим"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Включване на звука"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Търсене"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Плъзнете нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Плъзнете надолу за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Плъзнете наляво за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Плъзнете надясно за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Текущ потребител <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Спешно обаждане"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Забравена фигура"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Грешна фигура"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Въведете отново правилния PUK код. Многократните опити ще деактивират за постоянно SIM картата."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"ПИН кодовете не съвпадат"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Опитите за фигурата са твърде много"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"За да отключите, влезте с профила си в Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Потребителско име (имейл)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Парола"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Вход"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Невалидно потребителско име или парола."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Забравили сте потребителското име или паролата си?\nПосетете "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Профилът се проверява…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Въведохте неправилно ПИН кода си <xliff:g id="NUMBER_0">%d</xliff:g> пъти. \n\nОпитайте отново след <xliff:g id="NUMBER_1">%d</xliff:g> секунди."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Въведохте неправилно паролата си <xliff:g id="NUMBER_0">%d</xliff:g> пъти. \n\nОпитайте отново след <xliff:g id="NUMBER_1">%d</xliff:g> секунди."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Начертахте неправилно фигурата си за отключване <xliff:g id="NUMBER_0">%d</xliff:g> пъти. \n\nОпитайте отново след <xliff:g id="NUMBER_1">%d</xliff:g> секунди."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Неправилно опитахте да отключите телефона <xliff:g id="NUMBER">%d</xliff:g> пъти. Служебният потребителски профил ще бъде премахнат, при което ще се изтрият всички данни за него."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Начертахте неправилно фигурата си за отключване <xliff:g id="NUMBER_0">%d</xliff:g> пъти. След още <xliff:g id="NUMBER_1">%d</xliff:g> неуспешни опита ще бъдете помолени да отключите таблета посредством имейл адрес.\n\n Опитайте отново след <xliff:g id="NUMBER_2">%d</xliff:g> секунди."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Начертахте неправилно фигурата си за отключване <xliff:g id="NUMBER_0">%d</xliff:g> пъти. След още <xliff:g id="NUMBER_1">%d</xliff:g> неуспешни опита ще бъдете помолени да отключите телефона посредством имейл адрес.\n\n Опитайте отново след <xliff:g id="NUMBER_2">%d</xliff:g> секунди."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Премахване"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Неправилен ПИН код за SIM картата – сега трябва да се свържете с оператора си, за да отключите устройството."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Неправилен ПИН код за SIM картата – остава ви <xliff:g id="NUMBER">%d</xliff:g> опит, преди да трябва да се свържете с оператора си, за да отключите устройството."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Операцията с ПИН кода за SIM картата не бе успешна!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Операцията с PUK кода за SIM картата не бе успешна!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Кодът е приет!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Бутон за предишния запис"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Бутон за следващия запис"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Бутон за пауза"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Бутон за пускане"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Бутон за спиране"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Няма покритие."</string>
</resources>
diff --git a/packages/Keyguard/res/values-bn-rBD/strings.xml b/packages/Keyguard/res/values-bn-rBD/strings.xml
index 77acaf80..35a5531 100644
--- a/packages/Keyguard/res/values-bn-rBD/strings.xml
+++ b/packages/Keyguard/res/values-bn-rBD/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"আনলক করতে পাসওয়ার্ড লিখুন"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"আনলক করতে PIN লিখুন"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ভুল PIN কোড৷"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"আনলক করতে, মেনু টিপুন তারপর ০ টিপুন৷"</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"মুখের সাহায্যে আনলক করার প্রচেষ্টা যতবার করা যায় তার সীমা পেরিয়ে গেছে"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"চার্জ হয়েছে"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"চার্জ হচ্ছে"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"আপনার চার্জার সংযুক্ত করুন৷"</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"সিম কার্ড লক করা আছে৷"</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"সিম কার্ডটি PUK কোড দিয়ে লক করা আছে৷"</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"সিম কার্ড আনলক করা হচ্ছে…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s৷ %3$d এর %2$d উইজেট৷"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"উইজেট যোগ করুন"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"খালি"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"আনলক করার এলাকা প্রসারিত হয়েছে৷"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"আনলক করার এলাকা সঙ্কুচিত হয়েছে৷"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> উইজেট৷"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"ব্যবহারকারী নির্বাচক"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"ক্যামেরা"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"মিডিয়া নিয়ন্ত্রণগুলি"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"উইজেট রেকর্ড করা শুরু হয়েছে৷"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"উইজেট রেকর্ড করা শেষ হয়েছে৷"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> উইজেট মুছে ফেলা হয়েছে৷"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"আনলক এলাকা প্রসারিত করুন৷"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"স্লাইড দিয়ে আনলক৷"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"প্যাটার্ন দিয়ে আনলক৷"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"মুখের সাহায্যে আনলক করুন৷"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"পিন দিয়ে আনলক৷"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN অঞ্চল"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN অঞ্চল"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK অঞ্চল"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"পূর্ববর্তী ট্র্যাকে যাওয়ার বোতাম"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"পরবর্তী ট্র্যাকে যাওয়ার বোতাম"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"বিরাম বোতাম"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"প্লে বোতাম"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"বন্ধ করার বোতাম"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"অঙ্গুষ্ঠ উপরের দিকে করে"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"অঙ্গুষ্ঠ নীচের দিকে করে"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"হৃদয়"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"চালিয়ে যেতে আনলক করুন"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"লঞ্চ করা বাতিল করা হয়েছে"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"মুছে ফেলতে <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ছাড়ুন৷"</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> মুছে ফেলা যাবে না৷"</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"<xliff:g id="ALARM">%1$s</xliff:g> এ পরবর্তী অ্যালার্ম সেট করা হয়েছে"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?১২৩"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"বাতিল করুন"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"মুছুন"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"সম্পন্ন"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"মোড পরিবর্তন করুন"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"আনলক করুন"</string>
- <string name="description_target_camera" msgid="969071997552486814">"ক্যামেরা"</string>
- <string name="description_target_silent" msgid="893551287746522182">"নীরব"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"শব্দ চালু"</string>
- <string name="description_target_search" msgid="3091587249776033139">"অনুসন্ধান করুন"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য উপরের দিকে স্লাইড করুন৷"</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য নীচের দিকে স্লাইড করুন৷"</string>
- <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য বাম দিকে স্লাইড করুন৷"</string>
- <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য ডান দিকে স্লাইড করুন৷"</string>
- <string name="user_switched" msgid="3768006783166984410">"বর্তমান ব্যবহারকারী <xliff:g id="NAME">%1$s</xliff:g>৷"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"জরুরি কল"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"প্যাটার্ন ভুলে গেছেন"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ভুল প্যাটার্ন"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"সঠিক PUK কোড পুনরায় লিখুন৷ বার বার প্রচেষ্টা করা হলে তা স্থায়ীভাবে সিমটিকে অক্ষম করে দেবে৷"</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN কোডগুলি মিলছে না"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"বিভিন্ন প্যাটার্নের সাহায্যে খুব বেশি বার প্রচেষ্টা করা হয়ে গেছে"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"আনলক করতে আপনার Google অ্যাকাউন্টের মাধ্যমে সাইন ইন করুন৷"</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"ব্যবহারকারী নাম (ইমেল)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"পাসওয়ার্ড"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"সাইন ইন করুন"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"অবৈধ ব্যবহারকারী নাম অথবা পাসওয়ার্ড৷"</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"আপনার ব্যবহারকারী নাম অথবা পাসওয়ার্ড ভুলে গেছেন?\n"<b>"google.com/accounts/recovery"</b>" এ যান৷"</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"অ্যাকাউন্ট পরীক্ষা করা হচ্ছে..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"আপনি আপনার PIN টাইপ করতে <xliff:g id="NUMBER_0">%d</xliff:g> বার ভুল করেছেন৷ \n\n<xliff:g id="NUMBER_1">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন৷"</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"আপনি আপনার পাসওয়ার্ড টাইপ করতে <xliff:g id="NUMBER_0">%d</xliff:g> বার ভুল করেছেন৷ \n\n<xliff:g id="NUMBER_1">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন৷"</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"আপনি আপনার আনলকের প্যাটার্ন আঁকার ক্ষেত্রে <xliff:g id="NUMBER_0">%d</xliff:g> বার ভুল করেছেন৷ \n\n<xliff:g id="NUMBER_1">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন৷"</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"আপনি <xliff:g id="NUMBER">%d</xliff:g> বার ভুল করে ফোনটি আনলক করার চেষ্টা করেছেন৷ কাজের প্রোফাইল সরানো হবে যা সমস্ত প্রোফাইল ডেটা মুছে ফেলবে৷"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"আপনি আপনার আনলকের প্যাটার্ন আঁকার ক্ষেত্রে <xliff:g id="NUMBER_0">%d</xliff:g> বার ভুল করেছেন৷ আর <xliff:g id="NUMBER_1">%d</xliff:g> বার অসফল প্রচেষ্টা করা হলে আপনাকে একটি ইমেল অ্যাকাউন্ট মারফত আপনার ট্যাবলেট আনলক করতে বলা হবে৷\n\n <xliff:g id="NUMBER_2">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন৷"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"আপনি আপনার আনলকের প্যাটার্ন আঁকার ক্ষেত্রে <xliff:g id="NUMBER_0">%d</xliff:g> বার ভুল করেছেন৷ আর <xliff:g id="NUMBER_1">%d</xliff:g> বার অসফল প্রচেষ্টা করা হলে আপনাকে একটি ইমেল অ্যাকাউন্ট মারফত আপনার ফোন আনলক করতে বলা হবে৷\n\n <xliff:g id="NUMBER_2">%d</xliff:g> সেকেন্ডের মধ্যে আবার চেষ্টা করুন৷"</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"সরান"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"ভুল সিম PIN কোড, আপনার ডিভাইসটি আনলক করতে এখন আপনাকে অবশ্যই আপনার ক্যারিয়ারের সাথে যোগাযোগ করতে হবে৷"</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"ভুল সিম PIN কোড, আপনার কাছে আর <xliff:g id="NUMBER">%d</xliff:g>টি প্রচেষ্টা বাকি রয়েছে, তার পরে আপনার ডিভাইসটি আনলক করতে আপনাকে অবশ্যই আপনার ক্যারিয়ারের সাথে যোগাযোগ করতে হবে৷"</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"সিম PIN ক্রিয়াকলাপটি ব্যর্থ হয়েছে!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"সিম PUK ক্রিয়াকলাপটি ব্যর্থ হয়েছে!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"কোড স্বীকৃত হয়েছে!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"পূর্ববর্তী ট্র্যাকে যাওয়ার বোতাম"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"পরবর্তী ট্র্যাকে যাওয়ার বোতাম"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"বিরাম বোতাম"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"প্লে বোতাম"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"বন্ধ করার বোতাম"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"কোনো পরিষেবা নেই৷"</string>
</resources>
diff --git a/packages/Keyguard/res/values-ca/strings.xml b/packages/Keyguard/res/values-ca/strings.xml
index ac745f1..1e13d40 100644
--- a/packages/Keyguard/res/values-ca/strings.xml
+++ b/packages/Keyguard/res/values-ca/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Introdueix la contrasenya per desbloquejar"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Introdueix la contrasenya per desbloquejar"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Codi PIN incorrecte."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Per desbloquejar-lo, premeu Menú i després 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"S\'ha superat el nombre màxim d\'intents de desbloqueig facial"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Carregada"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Carregant"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Connecta el carregador."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"La targeta SIM està bloquejada."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La targeta SIM està bloquejada pel PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"S\'està desbloquejant la targeta SIM..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Afegeix un widget"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Buit"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"S\'ha ampliat l\'àrea de desbloqueig."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"L\'àrea de desbloqueig està replegada."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget de <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Selector d\'usuaris"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Càmera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Controls multimèdia"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"S\'ha iniciat la reorganització del widget."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Ha finalitzat la reorganització del widget."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"S\'ha suprimit el widget de <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Desplega l\'àrea de desbloqueig."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Desbloqueig lliscant el dit"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueig mitjançant patró"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueig facial"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueig mitjançant PIN"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Zona del PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Zona del PIN de la SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Zona del PUK de la SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Botó de pista anterior"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Botó de pista següent"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Botó de pausa"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Botó de reproducció"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botó de parada"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"M\'agrada"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"No m\'agrada"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Cor"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloqueja per continuar"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"S\'ha cancel·lat l\'inici"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Deixa anar <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> per suprimir-lo."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"No se suprimirà <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"S\'ha definit la pròxima alarma per a les: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Cancel·la"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Suprimeix"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Fet"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Canvi de mode"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Maj"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Retorn"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Desbloqueja"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Càmera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Silenci"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Activa el so"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Cerca"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Fes lliscar el dit cap amunt per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Fes lliscar el dit cap avall per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Fes lliscar el dit cap a l\'esquerra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Fes lliscar el dit cap a la dreta per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Usuari actual: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Trucada d\'emergència"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Patró oblidat"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Patró incorrecte"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Torna a introduir el codi PUK correcte. Els intents repetits faran que es desactivi la SIM de manera permanent."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Els codis PIN no coincideixen"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Massa intents incorrectes"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Per desbloquejar el telèfon, inicia la sessió amb el compte de Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Nom d\'usuari (correu electrònic)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Contrasenya"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Inicia la sessió"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Nom d\'usuari o contrasenya no vàlids."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Has oblidat el teu nom d\'usuari o la contrasenya?\nVisita "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"S\'està comprovant el compte…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Has escrit malament el PIN <xliff:g id="NUMBER_0">%d</xliff:g> vegades. \n\nTorna-ho a provar d\'aquí a <xliff:g id="NUMBER_1">%d</xliff:g> segons."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Has escrit malament la contrasenya <xliff:g id="NUMBER_0">%d</xliff:g> vegades. \n\nTorna-ho a provar d\'aquí a <xliff:g id="NUMBER_1">%d</xliff:g> segons."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Has dibuixat el patró de desbloqueig de manera incorrecta <xliff:g id="NUMBER_0">%d</xliff:g> vegades. \n\nTorna-ho a provar d\'aquí a <xliff:g id="NUMBER_1">%d</xliff:g> segons."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Has provat de desbloquejar el telèfon incorrectament <xliff:g id="NUMBER">%d</xliff:g> vegades. El perfil professional se suprimirà, juntament amb totes les dades que contingui."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Has dibuixat el patró de desbloqueig <xliff:g id="NUMBER_0">%d</xliff:g> vegades de manera incorrecta. Després de <xliff:g id="NUMBER_1">%d</xliff:g> intents incorrectes més, se\'t demanarà que desbloquegis la tauleta amb un compte de correu electrònic.\n\n Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%d</xliff:g> segons."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Has dibuixat el patró de desbloqueig <xliff:g id="NUMBER_0">%d</xliff:g> vegades de manera incorrecta. Després de <xliff:g id="NUMBER_1">%d</xliff:g> intents incorrectes més, se\'t demanarà que desbloquegis el telèfon amb un compte de correu electrònic.\n\n Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%d</xliff:g> segons."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Elimina"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"El codi PIN de la SIM no és correcte. Has de contactar amb l\'operador de telefonia mòbil per desbloquejar el dispositiu."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"El codi PIN de la SIM no és correcte. Et queda <xliff:g id="NUMBER">%d</xliff:g> intent; si no l\'encertes, contacta amb l\'operador de telefonia mòbil per desbloquejar el dispositiu."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Hi ha hagut un problema en l\'operació del PIN de la SIM."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Hi ha hagut un problema en l\'operació del PUK de la SIM."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"S\'ha acceptat el codi."</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Botó de pista anterior"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Botó de pista següent"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Botó de pausa"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Botó de reproducció"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Botó de parada"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Sense servei."</string>
</resources>
diff --git a/packages/Keyguard/res/values-cs/strings.xml b/packages/Keyguard/res/values-cs/strings.xml
index 141fe41..138cec2 100644
--- a/packages/Keyguard/res/values-cs/strings.xml
+++ b/packages/Keyguard/res/values-cs/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Zadejte heslo pro odemknutí"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Zadejte kód PIN pro odemknutí"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Nesprávný kód PIN."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Chcete-li telefon odemknout, stiskněte Menu a poté 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Překročili jste maximální povolený počet pokusů o odemknutí obličejem."</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Nabito"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Nabíjení"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Připojte dobíjecí zařízení."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM karta je zablokována."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM karta je zablokována pomocí kódu PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Odblokování SIM karty…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d z %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Přidat widget"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Prázdné"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Oblast odemknutí byla rozšířena."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Oblast odemknutí byla sbalena."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Výběr uživatele"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Fotoaparát"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Ovládání médií"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Přeuspořádání widgetů bylo zahájeno."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Přeuspořádání widgetů bylo dokončeno."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> byl smazán."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Rozšířit oblast odemknutí"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Odemknutí přejetím prstem."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odemknutí gestem."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Odemknutí obličejem."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odemknutí kódem PIN."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Oblast kódu PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Oblast kódu PIN SIM karty"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Oblast kódu PUK SIM karty"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Tlačítko Předchozí stopa"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Tlačítko Další stopa"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Tlačítko Pozastavit"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Tlačítko Přehrát"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Tlačítko Zastavit"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Líbí se mi"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Nelíbí se mi"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Srdíčko"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Pokračujte odemknutím"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Spuštění zrušeno"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Uvolněním dotyku widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> vymažete."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> nebude vymazán."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Další budík je nastaven na <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"Alt"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Zrušit"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Smazat"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Hotovo"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Změna režimu"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Odemknout"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Fotoaparát"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Tichý"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Zapnout zvuk"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Vyhledávání"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Přejeďte prstem nahoru: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Přejeďte prstem dolů: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Přejeďte prstem doleva: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Přejeďte prstem doprava: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
- <string name="user_switched" msgid="3768006783166984410">"Aktuální uživatel je <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Tísňové volání"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Zapomenuté gesto"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Nesprávné gesto"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Znovu zadejte správný kód PUK. Opakovanými pokusy SIM kartu trvale deaktivujete."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Kódy PIN se neshodují."</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Příliš mnoho pokusů o nakreslení gesta"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Chcete-li telefon odemknout, přihlaste se pomocí svého účtu Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Uživatelské jméno (e-mail)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Heslo"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Přihlásit se"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Neplatné uživatelské jméno nebo heslo."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Zapomněli jste uživatelské jméno nebo heslo?\nPřejděte na stránku "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Kontrola účtu…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Již <xliff:g id="NUMBER_0">%d</xliff:g>krát jste zadali nesprávný kód PIN. \n\nZkuste to znovu za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Již <xliff:g id="NUMBER_0">%d</xliff:g>krát jste nesprávně zadali heslo. \n\nZkuste to znovu za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Již <xliff:g id="NUMBER_0">%d</xliff:g>krát jste zadali nesprávné bezpečnostní gesto. \n\nZkuste to znovu za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Již jste se <xliff:g id="NUMBER">%d</xliff:g>krát pokusili odemknout telefon nesprávným způsobem. Pracovní profil bude odstraněn, čímž budou smazána všechna jeho data."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Již <xliff:g id="NUMBER_0">%d</xliff:g>krát jste nesprávně nakreslili své heslo odemknutí. Po <xliff:g id="NUMBER_1">%d</xliff:g>dalších neúspěšných pokusech budete požádáni o odemčení tabletu pomocí e-mailového účtu.\n\n Zkuste to znovu za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Již <xliff:g id="NUMBER_0">%d</xliff:g>krát jste nesprávně nakreslili své heslo odemknutí. Po <xliff:g id="NUMBER_1">%d</xliff:g> dalších neúspěšných pokusech budete požádáni o odemčení telefonu pomocí e-mailového účtu.\n\n Zkuste to znovu za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Odebrat"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Zadali jste nesprávný kód PIN SIM karty. Nyní musíte za účelem odemknutí zařízení kontaktovat svého operátora."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Zadali jste nesprávný kód PIN SIM karty. Máte ještě <xliff:g id="NUMBER">%d</xliff:g> pokus, poté budete muset o odemknutí zařízení požádat svého operátora."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Operace pomocí kódu PIN SIM karty se nezdařila!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Operace pomocí kódu PUK SIM karty se nezdařila!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Kód byl přijat."</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Tlačítko Předchozí stopa"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Tlačítko Další stopa"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Tlačítko Pozastavit"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Tlačítko Přehrát"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Tlačítko Zastavit"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Žádný signál."</string>
</resources>
diff --git a/packages/Keyguard/res/values-da/strings.xml b/packages/Keyguard/res/values-da/strings.xml
index 93b5756..a640dc4 100644
--- a/packages/Keyguard/res/values-da/strings.xml
+++ b/packages/Keyguard/res/values-da/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Indtast adgangskoden for at låse op"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Indtast pinkode for at låse op"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Forkert pinkode."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Tryk på Menu og dernæst på 0 for at låse op."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Det maksimale antal forsøg på at bruge Ansigtslås er overskredet"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Opladet"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Oplader"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Tilslut din oplader."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-kortet er låst."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kort er låst med PUK-koden."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM-kortet låses op…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d af %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Tilføj widget."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tom"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Oplåsningsområdet er udvidet."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Oplåsningsområdet er skjult."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget til <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Brugervælger"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Mediekontrolelementer"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Omrokering af widgets er påbegyndt."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Omrokering af widgets er afsluttet."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widgetten <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> er slettet."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Udvid oplåsningsområdet."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Lås op ved at stryge."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Lås op med mønster."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Lås op med ansigt."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Lås op med pinkode."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Område for pinkoden"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Område for pinkoden til simkortet"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Område for PUK-koden til simkortet"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Knap til forrige nummer"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Knap til næste nummer"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pause-knap"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Afspil-knap"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop-knap"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Synes om"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Synes ikke om"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hjerte"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Lås op for at gå videre"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Starten blev annulleret"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Slip <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> for at slette."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> slettes ikke."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Næste alarm er indstillet til <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Annuller"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Slet"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Udfør"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Ændring af tilstand"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Angiv"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Lås op"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Lydløs"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Lyd slået til"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Søgning"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Glid op for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Glid ned for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Glid til venstre for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Glid til højre for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Nuværende bruger <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Nødopkald"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Glemt mønster"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Forkert mønster"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Indtast den korrekte PUK-kode. Gentagne forsøg vil permanent deaktivere SIM-kortet."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Pinkoderne stemmer ikke overens"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"For mange forsøg på at tegne mønstret korrekt"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Lås op ved at logge ind med din Google-konto."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Brugernavn (e-mail)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Adgangskode"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Log ind"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Ugyldigt brugernavn eller ugyldig adgangskode."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Har du glemt dit brugernavn eller din adgangskode?\nGå til "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Kontoen kontrolleres…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Du har indtastet en forkert pinkode <xliff:g id="NUMBER_0">%d</xliff:g> gange. \n\nPrøv igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Du har indtastet din adgangskode forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. \n\nPrøv igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. \n\nPrøv igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Du har forsøgt at låse telefonen forkert op <xliff:g id="NUMBER">%d</xliff:g> gange. Arbejdsprofilen fjernes, hvilket vil slette alle profildata."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. Efter <xliff:g id="NUMBER_1">%d</xliff:g> yderligere mislykkede forsøg vil du blive bedt om at låse din tablet op ved hjælp af en e-mailkonto\n\n Prøv igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%d</xliff:g> gange. Efter <xliff:g id="NUMBER_1">%d</xliff:g> yderligere mislykkede forsøg til vil du blive bedt om at låse din telefon op ved hjælp af en e-mailkonto.\n\n Prøv igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Fjern"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Forkert pinkode til SIM-kort. Du skal nu kontakte dit mobilselskab for at låse din enhed op."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Forkert pinkode til SIM-kort. Du har <xliff:g id="NUMBER">%d</xliff:g> forsøg tilbage, før du skal kontakte dit mobilselskab for at låse din enhed op."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Pinkoden til SIM-kortet blev afvist."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"PUK-koden til SIM-kortet blev afvist."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Koden blev accepteret."</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Knap til forrige nummer"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Knap til næste nummer"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pause-knap"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Afspil-knap"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Stop-knap"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Ingen dækning."</string>
</resources>
diff --git a/packages/Keyguard/res/values-de/strings.xml b/packages/Keyguard/res/values-de/strings.xml
index f6545a1..466dbad 100644
--- a/packages/Keyguard/res/values-de/strings.xml
+++ b/packages/Keyguard/res/values-de/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Passwort zum Entsperren eingeben"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"PIN zum Entsperren eingeben"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Falscher PIN-Code"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Drücken Sie zum Entsperren die Menütaste und dann auf \"0\"."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Die maximal zulässige Anzahl an Face Unlock-Versuchen wurde überschritten."</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Aufgeladen"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Wird aufgeladen"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Bitte Ladegerät anschließen"</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-Karte ist gesperrt."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-Karte ist gesperrt. PUK-Eingabe erforderlich."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM-Karte wird entsperrt…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d von %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget hinzufügen"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Leer"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Entsperr-Bereich maximiert"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Entsperr-Bereich mminimiert"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Nutzerauswahl"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Mediensteuerelemente"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Neuordnung der Widgets gestartet"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Neuordnung der Widgets abgeschlossen"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> gelöscht"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Entsperr-Bereich maximieren"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Entsperrung mit Fingerbewegung"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Entsperrung mit Muster"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face Unlock"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Entsperrung mit PIN"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-Bereich"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM-PIN-Bereich"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM-PUK-Bereich"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Schaltfläche für vorherigen Titel"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Schaltfläche für nächsten Titel"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Schaltfläche für Pause"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Schaltfläche für Wiedergabe"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Schaltfläche für Stopp"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Mag ich"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Mag ich nicht"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Herz"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Zum Fortfahren entsperren"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Start abgebrochen"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Legen Sie <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> zum Löschen ab."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> wird nicht gelöscht."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Nächster Wecker gestellt für <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Abbrechen"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Löschen"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Fertig"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Modusänderung"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Eingabetaste"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Entsperren"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Lautlos"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Ton ein"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Suche"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach oben schieben"</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach unten schieben"</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach links schieben"</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach rechts schieben"</string>
- <string name="user_switched" msgid="3768006783166984410">"Aktueller Nutzer <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Notruf"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Muster vergessen"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Falsches Muster"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Geben Sie den richtigen PUK-Code ein. Bei wiederholten Versuchen wird die SIM-Karte dauerhaft deaktiviert."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN-Codes stimmen nicht überein"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Zu viele Musterversuche"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Melden Sie sich zum Entsperren mit Ihrem Google-Konto an."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Nutzername (E-Mail)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Passwort"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Anmelden"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Ungültiger Nutzername oder ungültiges Passwort"</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Nutzernamen oder Passwort vergessen?\nBesuchen Sie "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Konto wird geprüft…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Sie haben Ihre PIN <xliff:g id="NUMBER_0">%d</xliff:g>-mal falsch eingegeben.\n\nVersuchen Sie es in <xliff:g id="NUMBER_1">%d</xliff:g> Sekunden erneut."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Sie haben Ihr Passwort <xliff:g id="NUMBER_0">%d</xliff:g>-mal falsch eingegeben.\n\nVersuchen Sie es in <xliff:g id="NUMBER_1">%d</xliff:g> Sekunden erneut."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Sie haben Ihr Entsperrungsmuster <xliff:g id="NUMBER_0">%d</xliff:g>-mal falsch gezeichnet. \n\nVersuchen Sie es in <xliff:g id="NUMBER_1">%d</xliff:g> Sekunden erneut."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Sie haben <xliff:g id="NUMBER">%d</xliff:g>-mal erfolglos versucht, das Telefon zu entsperren. Das Arbeitsprofil wird nun entfernt und alle Profildaten werden gelöscht."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Sie haben Ihr Entsperrungsmuster <xliff:g id="NUMBER_0">%d</xliff:g>-mal falsch gezeichnet. Nach <xliff:g id="NUMBER_1">%d</xliff:g> weiteren erfolglosen Versuchen werden Sie aufgefordert, Ihr Tablet mithilfe eines E-Mail-Kontos zu entsperren.\n\n Versuchen Sie es in <xliff:g id="NUMBER_2">%d</xliff:g> Sekunden erneut."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Sie haben Ihr Entsperrungsmuster <xliff:g id="NUMBER_0">%d</xliff:g>-mal falsch gezeichnet. Nach <xliff:g id="NUMBER_1">%d</xliff:g> weiteren erfolglosen Versuchen werden Sie aufgefordert, Ihr Telefon mithilfe eines E-Mail-Kontos zu entsperren.\n\n Versuchen Sie es in <xliff:g id="NUMBER_2">%d</xliff:g> Sekunden erneut."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Entfernen"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Falscher PIN-Code der SIM-Karte. Bitte wenden Sie sich an Ihren Mobilfunkanbieter, damit er Ihr Gerät entsperrt."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Falscher PIN-Code der SIM-Karte. Sie haben noch <xliff:g id="NUMBER">%d</xliff:g> Versuch, bevor Sie das Gerät von Ihrem Mobilfunkanbieter entsperren lassen müssen."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Fehler beim Entsperren mit der PIN der SIM-Karte"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Fehler beim Entsperren mithilfe des PUK-Codes der SIM-Karte"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Code akzeptiert"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Schaltfläche für vorherigen Titel"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Schaltfläche für nächsten Titel"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Schaltfläche für Pause"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Schaltfläche für Wiedergabe"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Schaltfläche für Stopp"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Kein Dienst"</string>
</resources>
diff --git a/packages/Keyguard/res/values-el/strings.xml b/packages/Keyguard/res/values-el/strings.xml
index 9dbe709..3cae49c 100644
--- a/packages/Keyguard/res/values-el/strings.xml
+++ b/packages/Keyguard/res/values-el/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Πληκτρολογήστε τον κωδικό πρόσβασης για ξεκλείδωμα"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Πληκτρολογήστε τον αριθμό PIN για ξεκλείδωμα"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Εσφαλμένος κωδικός PIN."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Για ξεκλείδωμα, πατήστε το πλήκτρο Menu και, στη συνέχεια, το πλήκτρο 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Έγινε υπέρβαση του μέγιστου αριθμού προσπαθειών Face Unlock"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Φορτίστηκε"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Φόρτιση"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Συνδέστε τον φορτιστή."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Η κάρτα SIM είναι κλειδωμένη."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Η κάρτα SIM είναι κλειδωμένη με κωδικό PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Ξεκλείδωμα κάρτας SIM…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Γραφικό στοιχείο %2$d από %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Προσθήκη γραφικού στοιχείου"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Κενή"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Ανάπτυξη της περιοχής ξεκλειδώματος."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Σύμπτυξη της περιοχής ξεκλειδώματος."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Γραφικό στοιχείο <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Επιλογέας χρήστη"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Φωτογραφική μηχανή"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Στοιχεία ελέγχου μέσων"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Έχει ξεκινήσει η αναδιάταξη των γραφικών στοιχείων."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Έχει ολοκληρωθεί η αναδιάταξη των γραφικών στοιχείων."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Το γραφικό στοιχείο <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> έχει διαγραφεί."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Ανάπτυξη περιοχής ξεκλειδώματος."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Ξεκλείδωμα ολίσθησης."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ξεκλείδωμα μοτίβου."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Ξεκλείδωμα κωδικού ασφαλείας"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Περιοχή PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Περιοχή PIN SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Περιοχή PUK SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Κουμπί προηγούμενου κομματιού"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Κουμπί επόμενου κομματιού"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Κουμπί παύσης"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Κουμπί αναπαραγωγής"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Κουμπί διακοπής"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Επιδοκιμασία"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Αποδοκιμασία"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Καρδιά"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Ξεκλειδώστε για να συνεχίσετε"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Η εκκίνηση ακυρώθηκε"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Αποθέστε <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> για διαγραφή."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> δεν θα διαγραφεί."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Το επόμενο ξυπνητήρι ορίστηκε στις <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ΑΒΓ"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Ακύρωση"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Διαγραφή"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Τέλος"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Αλλαγή τρόπου"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Ξεκλείδωμα"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Φωτογραφική μηχανή"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Αθόρυβο"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Ενεργοποίηση ήχου"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Αναζήτηση"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Κύλιση προς τα επάνω για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Κύλιση προς τα κάτω για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Κύλιση προς τα αριστερά για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Κύλιση προς τα δεξιά για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Τρέχων χρήστης <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Κλήσεις επείγουσας ανάγκης"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Ξεχάσατε το μοτίβο"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Εσφαλμένο μοτίβο"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Εισαγάγετε ξανά τον κωδικό PUK. Οι επαναλαμβανόμενες προσπάθειες θα απενεργοποιήσουν οριστικά την κάρτα SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Δεν υπάρχει αντιστοιχία των κωδικών PIN"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Πάρα πολλές προσπάθειες μοτίβου"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Για ξεκλείδωμα, συνδεθείτε με τον λογαριασμό σας Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Όνομα χρήστη (διεύθυνση ηλεκτρονικού ταχυδρομείου)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Κωδικός πρόσβασης"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Σύνδεση"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Μη έγκυρο όνομα χρήστη ή κωδικός πρόσβασης."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Ξεχάσατε το όνομα χρήστη ή τον κωδικό πρόσβασής σας;\nΕπισκεφτείτε τη διεύθυνση "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Έλεγχος λογαριασμού…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Έχετε πληκτρολογήσει εσφαλμένα τον κωδικό σας PIN <xliff:g id="NUMBER_0">%d</xliff:g> φορές. \n\nΔοκιμάστε ξανά σε <xliff:g id="NUMBER_1">%d</xliff:g> δευτερόλεπτα."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Έχετε πληκτρολογήσει τον κωδικό πρόσβασης εσφαλμένα <xliff:g id="NUMBER_0">%d</xliff:g> φορές. \n\nΔοκιμάστε ξανά σε <xliff:g id="NUMBER_1">%d</xliff:g> δευτερόλεπτα."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Σχεδιάσατε εσφαλμένα το μοτίβο ξεκλειδώματος <xliff:g id="NUMBER_0">%d</xliff:g> φορές. \n\nΔοκιμάστε ξανά σε <xliff:g id="NUMBER_1">%d</xliff:g> δευτερόλετπα."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Δοκιμάσατε να ξεκλειδώσετε το τηλέφωνο <xliff:g id="NUMBER">%d</xliff:g> φορές χωρίς επιτυχία. Το προφίλ εργασίας θα καταργηθεί, και έτσι θα διαγραφούν όλα τα δεδομένα προφίλ."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Σχεδιάσατε το μοτίβο ξεκλειδώματος εσφαλμένα <xliff:g id="NUMBER_0">%d</xliff:g> φορές. Μετά από <xliff:g id="NUMBER_1">%d</xliff:g> ανεπιτυχείς προσπάθειες ακόμη, θα σας ζητηθεί να ξεκλειδώσετε το tablet σας με τη χρήση ενός λογαριασμού ηλεκτρονικού ταχυδρομείου.\n\n Δοκιμάστε να συνδεθείτε ξανά σε <xliff:g id="NUMBER_2">%d</xliff:g> δευτερόλεπτα."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Σχεδιάσατε το μοτίβο ξεκλειδώματος εσφαλμένα <xliff:g id="NUMBER_0">%d</xliff:g> φορές. Μετά από <xliff:g id="NUMBER_1">%d</xliff:g> ανεπιτυχείς προσπάθειες ακόμη, θα σας ζητηθεί να ξεκλειδώσετε το τηλέφωνό σας με τη χρήση ενός λογαριασμού ηλεκτρονικού ταχυδρομείου.\n\n Δοκιμάστε ξανά σε <xliff:g id="NUMBER_2">%d</xliff:g> δευτερόλεπτα."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Κατάργηση"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Εσφαλμένος κωδικός PIN κάρτας SIM. Θα πρέπει να επικοινωνήσετε με τον πάροχο κινητής τηλεφωνίας σας για να ξεκλειδώσετε τη συσκευή σας."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Εσφαλμένος κωδικός PIN κάρτας SIM. Απομένει άλλη <xliff:g id="NUMBER">%d</xliff:g> προσπάθεια. Στη συνέχεια, θα πρέπει να επικοινωνήσετε με τον πάροχο κινητής τηλεφωνίας σας για να ξεκλειδώσετε τη συσκευή σας."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Αποτυχία λειτουργίας κωδικού PIN κάρτας SIM!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Αποτυχία λειτουργίας κωδικού PUK κάρτας SIM!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Αποδεκτός κωδικός!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Κουμπί προηγούμενου κομματιού"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Κουμπί επόμενου κομματιού"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Κουμπί παύσης"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Κουμπί αναπαραγωγής"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Κουμπί διακοπής"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Καμία υπηρεσία."</string>
</resources>
diff --git a/packages/Keyguard/res/values-en-rGB/strings.xml b/packages/Keyguard/res/values-en-rGB/strings.xml
index 6ac27be..ab4f7e8 100644
--- a/packages/Keyguard/res/values-en-rGB/strings.xml
+++ b/packages/Keyguard/res/values-en-rGB/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Type password to unlock"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Type PIN to unlock"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Incorrect PIN code."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"To unlock, press Menu, then 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Maximum Face Unlock attempts exceeded"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Charged"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Charging"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Connect your charger."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM card is locked."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM card is PUK-locked."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Unlocking SIM card…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Add widget"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Empty"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Unlock area expanded."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Unlock area collapsed."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"User selector"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Camera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Media controls"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Widget reordering started."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Widget reordering ended."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> deleted."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Expand unlock area."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Slide unlock."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pattern unlock."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin unlock."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN area"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN area"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK area"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Previous track button"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Next track button"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pause button"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Play button"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop button"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Thumbs up"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Thumbs down"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Heart"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Unlock to continue"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Launch cancelled"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Drop <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> to delete."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> will not be deleted."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Next alarm set for <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Cancel"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Done"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Mode change"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Unlock"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Camera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Silent"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Sound on"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Search"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Slide down for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Slide right for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Emergency call"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Forgot Pattern"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Re-enter the correct PUK code. Repeated attempts will permanently disable the SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN codes do not match"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Too many pattern attempts"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"To unlock, sign in with your Google account."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Username (email)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Password"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Sign in"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Invalid username or password."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Forgot your username or password?\nVisit "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Checking account…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"You have incorrectly typed your PIN <xliff:g id="NUMBER_0">%d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%d</xliff:g> seconds."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"You have incorrectly typed your password <xliff:g id="NUMBER_0">%d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%d</xliff:g> seconds."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%d</xliff:g> seconds."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. After <xliff:g id="NUMBER_1">%d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. After <xliff:g id="NUMBER_1">%d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Remove"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Incorrect SIM PIN code; you must now contact your operator to unlock your device."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Incorrect SIM PIN code; you have <xliff:g id="NUMBER">%d</xliff:g> remaining attempt/s before you must contact your carrier to unlock your device."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN operation failed!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK operation failed!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Code accepted"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Previous track button"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Next track button"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pause button"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Play button"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Stop button"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"No service."</string>
</resources>
diff --git a/packages/Keyguard/res/values-en-rIN/strings.xml b/packages/Keyguard/res/values-en-rIN/strings.xml
index 6ac27be..ab4f7e8 100644
--- a/packages/Keyguard/res/values-en-rIN/strings.xml
+++ b/packages/Keyguard/res/values-en-rIN/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Type password to unlock"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Type PIN to unlock"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Incorrect PIN code."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"To unlock, press Menu, then 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Maximum Face Unlock attempts exceeded"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Charged"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Charging"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Connect your charger."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM card is locked."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM card is PUK-locked."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Unlocking SIM card…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d of %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Add widget"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Empty"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Unlock area expanded."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Unlock area collapsed."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"User selector"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Camera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Media controls"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Widget reordering started."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Widget reordering ended."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> deleted."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Expand unlock area."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Slide unlock."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pattern unlock."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin unlock."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN area"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN area"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK area"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Previous track button"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Next track button"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pause button"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Play button"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop button"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Thumbs up"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Thumbs down"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Heart"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Unlock to continue"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Launch cancelled"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Drop <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> to delete."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> will not be deleted."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Next alarm set for <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Cancel"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Done"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Mode change"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Unlock"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Camera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Silent"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Sound on"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Search"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Slide down for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Slide right for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Emergency call"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Forgot Pattern"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Re-enter the correct PUK code. Repeated attempts will permanently disable the SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN codes do not match"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Too many pattern attempts"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"To unlock, sign in with your Google account."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Username (email)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Password"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Sign in"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Invalid username or password."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Forgot your username or password?\nVisit "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Checking account…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"You have incorrectly typed your PIN <xliff:g id="NUMBER_0">%d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%d</xliff:g> seconds."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"You have incorrectly typed your password <xliff:g id="NUMBER_0">%d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%d</xliff:g> seconds."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. \n\nTry again in <xliff:g id="NUMBER_1">%d</xliff:g> seconds."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. After <xliff:g id="NUMBER_1">%d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%d</xliff:g> times. After <xliff:g id="NUMBER_1">%d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%d</xliff:g> seconds."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Remove"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Incorrect SIM PIN code; you must now contact your operator to unlock your device."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Incorrect SIM PIN code; you have <xliff:g id="NUMBER">%d</xliff:g> remaining attempt/s before you must contact your carrier to unlock your device."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN operation failed!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK operation failed!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Code accepted"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Previous track button"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Next track button"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pause button"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Play button"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Stop button"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"No service."</string>
</resources>
diff --git a/packages/Keyguard/res/values-es-rUS/strings.xml b/packages/Keyguard/res/values-es-rUS/strings.xml
index 80058ba..8afbd13 100644
--- a/packages/Keyguard/res/values-es-rUS/strings.xml
+++ b/packages/Keyguard/res/values-es-rUS/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Ingresar contraseña para desbloquear"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Ingresa el PIN para desbloquear"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Código PIN incorrecto"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Para desbloquear, presiona el menú y luego 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Se superó el máximo de intentos permitido para el desbloqueo facial del dispositivo."</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Cargada"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Cargando"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Conecta tu cargador."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"La tarjeta SIM está bloqueada."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La tarjeta SIM está bloqueada por código PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Desbloqueando tarjeta SIM…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Agregar widget"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vacío"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Área desbloqueada expandida."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"El área desbloqueada se contrajo."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Selector de usuarios"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Cámara"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Controles de medios"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Se comenzaron a reordenar los widgets."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Se terminaron de reordenar los widgets."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> eliminado"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Expandir el área desbloqueada"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Desbloqueo por deslizamiento"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueo por patrón"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueo facial"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueo por PIN"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Área de PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Área de PIN de SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Área de PUK de SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Botón de pista anterior"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Botón de pista siguiente"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Botón de pausa"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Botón de reproducción"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botón de detención"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Votos a favor"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Votos en contra"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Corazón"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloquea para continuar."</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Se canceló el inicio."</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Suelta <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> para eliminarlo."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"No se eliminará <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Próxima alarma establecida: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Cancelar"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Eliminar"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Listo"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Cambio de modo"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Mayúscula"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Ingresar"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Desbloquear"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Cámara"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Silencioso"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Sonido activado"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Buscar"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Desliza el dedo hacia arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Desliza el dedo hacia abajo para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Desliza el dedo hacia la izquierda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Desliza el dedo hacia la derecha para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Realizar llamada de emergencia"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"¿Olvidaste el patrón?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Patrón incorrecto"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Vuelve a ingresar el código PUK correcto. Si ingresas un código incorrecto varias veces, se inhabilitará la tarjeta SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Los códigos PIN no coinciden."</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Demasiados intentos incorrectos de ingresar el patrón"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Para desbloquear, accede con tu cuenta de Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Nombre de usuario (correo)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Contraseña"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Acceder"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Nombre de usuario o contraseña incorrectos"</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"¿Olvidaste tu nombre de usuario o contraseña?\nAccede a "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Comprobando la cuenta…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Escribiste incorrectamente tu PIN <xliff:g id="NUMBER_0">%d</xliff:g> veces. \n\nVuelve a intentarlo en <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Escribiste incorrectamente tu contraseña <xliff:g id="NUMBER_0">%d</xliff:g> veces. \n\nVuelve a intentarlo en <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Dibujaste incorrectamente tu patrón de desbloqueo <xliff:g id="NUMBER_0">%d</xliff:g> veces. \n\nVuelve a intentarlo en <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Intentaste desbloquear el teléfono <xliff:g id="NUMBER">%d</xliff:g> veces de manera incorrecta. Se eliminará el perfil de trabajo y se perderán todos los datos de perfil."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Dibujaste incorrectamente tu patrón de desbloqueo <xliff:g id="NUMBER_0">%d</xliff:g> veces. Luego de <xliff:g id="NUMBER_1">%d</xliff:g> intentos incorrectos más, se te solicitará que desbloquees tu tablet mediante el uso de una cuenta de correo.\n\n Vuelve a intentarlo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Dibujaste incorrectamente tu patrón de desbloqueo <xliff:g id="NUMBER_0">%d</xliff:g> veces. Luego de <xliff:g id="NUMBER_1">%d</xliff:g> intentos incorrectos más, se te solicitará que desbloquees tu dispositivo mediante el uso de una cuenta de correo.\n\n Vuelve a intentarlo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eliminar"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"El código PIN de la tarjeta SIM es incorrecto. Debes comunicarte con el proveedor para desbloquear el dispositivo."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"El código PIN de la tarjeta SIM es incorrecto. Te queda <xliff:g id="NUMBER">%d</xliff:g> intento antes de que debas comunicarte con el proveedor para desbloquear el dispositivo."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Error al desbloquear la tarjeta SIM con el PIN"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Error al desbloquear la tarjeta SIM con el PUK"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Código aceptado"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Botón de pista anterior"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Botón de pista siguiente"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Botón de pausa"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Botón de reproducción"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Botón de detención"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Sin servicio"</string>
</resources>
diff --git a/packages/Keyguard/res/values-es/strings.xml b/packages/Keyguard/res/values-es/strings.xml
index 9d6cdc4..d8c548b 100644
--- a/packages/Keyguard/res/values-es/strings.xml
+++ b/packages/Keyguard/res/values-es/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Introduce la contraseña para desbloquear."</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Introduce el código PIN para desbloquear."</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Código PIN incorrecto"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Para desbloquear el teléfono, pulsa la tecla de menú y, a continuación, pulsa 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Se ha superado el número máximo de intentos de desbloqueo facial."</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Cargada"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Cargando"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Conecta el cargador."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"La tarjeta SIM está bloqueada."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La tarjeta SIM está bloqueada con el código PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Desbloqueando tarjeta SIM…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Añadir widget"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vacío"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Área de desbloqueo ampliada"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Área de desbloqueo contraída"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget de <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Selector de usuarios"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Cámara"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Controles multimedia"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Se ha empezado a cambiar el orden de los widgets."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Se ha terminado de cambiar el orden de los widgets."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> eliminado"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Ampliar área de desbloqueo"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Desbloqueo deslizando el dedo"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueo por patrón"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueo facial"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueo por PIN"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Área de PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Área de PIN de SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Área de PUK de SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Botón de canción anterior"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Botón de siguiente canción"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Botón de pausa"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Botón de reproducción"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botón para detener la reproducción"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Me gusta"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"No me gusta"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Corazón"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloquear para continuar"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Inicio cancelado"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Suelta <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> para eliminarlo."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> no se eliminará."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Próxima alarma: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Cancelar"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Eliminar"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Listo"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Cambio de modo"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Mayús"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Intro"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Desbloquear"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Cámara"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Silencio"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Sonido activado"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Buscar"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Desliza el dedo hacia arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Desliza el dedo hacia abajo para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Desliza el dedo hacia la izquierda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Desliza el dedo hacia la derecha para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Llamada de emergencia"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"¿Has olvidado el patrón?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"El patrón es incorrecto"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Vuelve a introducir el código PUK correcto. Si introduces un código incorrecto varias veces, se inhabilitará la tarjeta SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Los códigos PIN no coinciden."</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Demasiados intentos incorrectos de crear el patrón"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Para desbloquear el teléfono, inicia sesión con tu cuenta de Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Nombre de usuario (correo electrónico)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Contraseña"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Iniciar sesión"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"El nombre de usuario o la contraseña no son válidos."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Si has olvidado tu nombre de usuario o tu contraseña,\naccede a la página "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Comprobando cuenta…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Has introducido un código PIN incorrecto <xliff:g id="NUMBER_0">%d</xliff:g> veces. \n\nInténtalo de nuevo en <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Has introducido una contraseña incorrecta <xliff:g id="NUMBER_0">%d</xliff:g> veces. \n\nInténtalo de nuevo en <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Has fallado <xliff:g id="NUMBER_0">%d</xliff:g> veces al dibujar tu patrón de desbloqueo. \n\nInténtalo de nuevo en <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Has intentado desbloquear el teléfono de forma incorrecta <xliff:g id="NUMBER">%d</xliff:g> veces. El perfil de trabajo se eliminará, lo que borrará todos sus datos."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Has fallado <xliff:g id="NUMBER_0">%d</xliff:g> veces al dibujar el patrón de desbloqueo. Si fallas otras <xliff:g id="NUMBER_1">%d</xliff:g> veces, deberás usar una cuenta de correo electrónico para desbloquear el tablet.\n\n Inténtalo de nuevo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Has fallado <xliff:g id="NUMBER_0">%d</xliff:g> veces al dibujar el patrón de desbloqueo. Si fallas otras <xliff:g id="NUMBER_1">%d</xliff:g> veces, deberás usar una cuenta de correo electrónico para desbloquear el teléfono.\n\n Inténtalo de nuevo en <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eliminar"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Código PIN de la tarjeta SIM incorrecto. Debes ponerte en contacto con tu operador para desbloquear el dispositivo."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Código PIN de la tarjeta SIM incorrecto. Queda <xliff:g id="NUMBER">%d</xliff:g> intento para tener que ponerte en contacto con tu operador para desbloquear el dispositivo."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Error al intentar desbloquear la tarjeta SIM con el código PIN"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Error al intentar desbloquear la tarjeta SIM con el código PUK"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Código aceptado"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Botón de canción anterior"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Botón de siguiente canción"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Botón de pausa"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Botón de reproducción"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Botón para detener la reproducción"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Sin servicio"</string>
</resources>
diff --git a/packages/Keyguard/res/values-et-rEE/strings.xml b/packages/Keyguard/res/values-et-rEE/strings.xml
index ab953e1..55e6a97 100644
--- a/packages/Keyguard/res/values-et-rEE/strings.xml
+++ b/packages/Keyguard/res/values-et-rEE/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Avamiseks sisestage parool"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Avamiseks sisestage PIN-kood"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Vale PIN-kood."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Avamiseks vajutage menüüklahvi, seejärel klahvi 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Maksimaalne teenusega Face Unlock avamise katsete arv on ületatud"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Laetud"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Laadimine"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Ühendage laadija."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-kaart on lukus."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kaart on PUK-lukus."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM-kaardi avamine ..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Vidin %2$d/%3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Vidina lisamine."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tühi"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Avamisala on laiendatud."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Avamisala on ahendatud."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Vidin <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Kasutaja valija"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kaamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Meedia juhtnupud"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Vidina ümberkorraldamine algas."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Vidina ümberkorraldamine lõppes."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Vidin <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> on kustutatud."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Avamisala laiendamine."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Lohistamisega avamine."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Mustriga avamine."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Näoga avamine."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-koodiga avamine."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-koodi ala"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM-kaardi PIN-koodi ala"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM-kaardi PUK-koodi ala"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Nupp Eelmine lugu"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Nupp Järgmine lugu"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Nupp Peata"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Nupp Esita"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Nupp Peata"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Meeldib"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Ei meeldi"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Süda"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Jätkamiseks tühistage lukustus"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Käivitamine on tühistatud"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Kustutamiseks laske vidin <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> lahti."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Vidinat <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ei kustutata."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Järgmine alarm on määratud ajaks <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Tühista"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Kustuta"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Valmis"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Režiimi muutmine"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Tõstuklahv"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Sisestusklahv"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Luku avamine"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Kaamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Hääletu"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Heli on sees"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Otsing"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Lohistage üles: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Lohistage alla: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Lohistage vasakule: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Lohistage paremale: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Praegune kasutaja <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Hädaabikõne"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Unustasin mustri"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Vale muster"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Sisestage uuesti õige PUK-kood. Korduvkatsete korral keelatakse SIM jäädavalt."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN-koodid ei ole vastavuses"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Liiga palju mustrikatseid"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Avamiseks logige sisse oma Google\'i kontoga."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Kasutajanimi (e-post)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Parool"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Logi sisse"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Vale kasutajanimi või parool."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Kas unustasite kasutajanime või parooli?\nKülastage aadressi "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Konto kontrollimine ..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Olete PIN-koodi <xliff:g id="NUMBER_0">%d</xliff:g> korda valesti sisestanud.\n\nProovige <xliff:g id="NUMBER_1">%d</xliff:g> sekundi pärast uuesti."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Olete parooli <xliff:g id="NUMBER_0">%d</xliff:g> korda valesti sisestanud. \n\nProovige uuesti <xliff:g id="NUMBER_1">%d</xliff:g> sekundi pärast."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Joonistasite oma avamismustri <xliff:g id="NUMBER_0">%d</xliff:g> korda valesti.\n\nProovige <xliff:g id="NUMBER_1">%d</xliff:g> sekundi pärast uuesti."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Olete püüdnud <xliff:g id="NUMBER">%d</xliff:g> korda valesti telefoni avada. Tööprofiil eemaldatakse ja kõik profiili andmed kustutatakse."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Joonistasite oma avamismustri <xliff:g id="NUMBER_0">%d</xliff:g> korda valesti. Pärast veel <xliff:g id="NUMBER_1">%d</xliff:g> ebaõnnestunud katset palutakse teil tahvelarvuti avada meilikontoga.\n\n Proovige uuesti <xliff:g id="NUMBER_2">%d</xliff:g> sekundi pärast."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Joonistasite oma avamismustri <xliff:g id="NUMBER_0">%d</xliff:g> korda valesti. Pärast veel <xliff:g id="NUMBER_1">%d</xliff:g> ebaõnnestunud katset palutakse teil telefon avada meilikontoga.\n\n Proovige uuesti <xliff:g id="NUMBER_2">%d</xliff:g> sekundi pärast."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eemalda"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Vale SIM-i PIN-kood, seadme avamiseks peate nüüd ühendust võtma oma operaatoriga."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Vale SIM-i PIN-kood, teil on jäänud veel <xliff:g id="NUMBER">%d</xliff:g> katse, enne kui peate seadme avamiseks operaatoriga ühendust võtma."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM-i PIN-koodi toiming ebaõnnestus."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM-i PUK-koodi toiming ebaõnnestus."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Kood on õige."</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Nupp Eelmine lugu"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Nupp Järgmine lugu"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Nupp Peata"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Nupp Esita"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Nupp Peata"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Teenus puudub."</string>
</resources>
diff --git a/packages/Keyguard/res/values-eu-rES/strings.xml b/packages/Keyguard/res/values-eu-rES/strings.xml
index ba2c931..ba07523 100644
--- a/packages/Keyguard/res/values-eu-rES/strings.xml
+++ b/packages/Keyguard/res/values-eu-rES/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Idatzi desblokeatzeko pasahitza"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Idatzi desblokeatzeko PIN kodea"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"PIN kode okerra."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Desblokeatzeko, sakatu Menua eta, ondoren, 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Aurpegiaren bidez desblokeatzeko saiakera muga gainditu da"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Kargatuta"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Kargatzen"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Konektatu kargagailura."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM txartela blokeatuta dago."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM txartela PUK bidez blokeatuta dago."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM txartela desblokeatzen…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %2$d/%3$d widgeta."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Gehitu widgeta."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Hutsik"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Desblokeatzeko eremua zabaldu da."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Desblokeatzeko eremua tolestu da."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widgeta."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Erabiltzaile-hautatzailea"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Multimedia-kontrolak"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Widgetak berrantolatzen hasi da."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Widgetak berrantolatu dira."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widgeta ezabatu da."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Zabaldu desblokeatzeko eremua."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Hatza lerratuta desblokeatzea."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ereduaren bidez desblokeatzea."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Aurpegiaren bidez desblokeatzea."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN kodearen bidez desblokeatzea."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN kodearen eremua"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM txartelaren PIN kodearen eremua"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM txartelaren PUK kodearen eremua"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Aurreko pistara joateko botoia"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Hurrengo pistara joateko botoia"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pausatzeko botoia"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Erreproduzitzeko botoia"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Gelditzeko botoia"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Gustatu zait"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Ez zait gustatu"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Bihotza"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Jarraitzeko, desblokeatu"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Abiaraztea bertan behera utzi da"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Ezabatzeko, jaregin <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Ez da <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ezabatuko."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Hurrengo alarmak ordu honetan joko du: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Utzi"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Ezabatu"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Eginda"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Modu aldaketa"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Maius"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Sartu"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Desblokeatu"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Isila"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Soinua aktibatuta"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Bilatu"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Lerratu gora hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Lerratu behera hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Lerratu ezkerrera hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Lerratu eskuinera hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Uneko erabiltzailea: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Larrialdi-deia"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Eredua ahaztu zaizu"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Eredu okerra"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Idatzi berriro PUK kode zuzena. Hainbat saiakera oker eginez gero, betirako desgaituko da SIMa."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN kodeak ez datoz bat"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Eredua marrazteko saiakera gehiegi egin dira"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Desblokeatzeko, hasi saioa Google kontuarekin."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Erabiltzaile-izena (helbide elektronikoa)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Pasahitza"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Hasi saioa"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Erabiltzaile-izen edo pasahitz baliogabea."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Erabiltzaile-izena edo pasahitza ahaztu zaizu?\nZoaz "<b>"google.com/accounts/recovery"</b>" helbidera."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Kontua egiaztatzen…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PINa oker idatzi duzu <xliff:g id="NUMBER_0">%d</xliff:g> aldiz. \n\nSaiatu berriro <xliff:g id="NUMBER_1">%d</xliff:g> segundo barru."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Pasahitza oker idatzi duzu <xliff:g id="NUMBER_0">%d</xliff:g> aldiz. \n\nSaiatu berriro <xliff:g id="NUMBER_1">%d</xliff:g> segundo barru."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Desblokeatzeko eredua oker marraztu duzu <xliff:g id="NUMBER_0">%d</xliff:g> aldiz. \n\nSaiatu berriro <xliff:g id="NUMBER_1">%d</xliff:g> segundo barru."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"<xliff:g id="NUMBER">%d</xliff:g> aldiz saiatu zara telefonoa desblokeatzen, baina huts egin duzu denetan. Laneko profila kendu egingo da eta, ondorioz, profileko datu guztiak ezabatuko dira."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Desblokeatzeko eredua oker marraztu duzu <xliff:g id="NUMBER_0">%d</xliff:g> aldiz. Beste <xliff:g id="NUMBER_1">%d</xliff:g> aldiz oker marrazten baduzu, tableta posta-kontu baten bidez desblokeatzeko eskatuko dizugu.\n\n Saiatu berriro <xliff:g id="NUMBER_2">%d</xliff:g> segundo barru."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Desblokeatzeko eredua oker marraztu duzu <xliff:g id="NUMBER_0">%d</xliff:g> aldiz. Beste <xliff:g id="NUMBER_1">%d</xliff:g> aldiz oker marrazten baduzu, telefonoa posta-kontu baten bidez desblokeatzeko eskatuko dizugu.\n\n Saiatu berriro <xliff:g id="NUMBER_2">%d</xliff:g> segundo barru."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Kendu"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM txartelaren PIN kodea okerra da. Gailua desblokeatzeko, jarri operadorearekin harremanetan."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"SIM txartelaren PIN kodea ez da zuzena; <xliff:g id="NUMBER">%d</xliff:g> saiakera geratzen zaizu. Saiakerak agortuz gero, operadoreari eskatu beharko diozu gailua desblokeatzeko."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM txartelaren PIN eragiketak huts egin du!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM txartelaren PUK eragiketak huts egin du!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Kodea onartu da!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Aurreko pistara joateko botoia"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Hurrengo pistara joateko botoia"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pausatzeko botoia"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Erreproduzitzeko botoia"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Gelditzeko botoia"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Zerbitzurik gabe."</string>
</resources>
diff --git a/packages/Keyguard/res/values-fa/strings.xml b/packages/Keyguard/res/values-fa/strings.xml
index fea1f59..c41a3d6 100644
--- a/packages/Keyguard/res/values-fa/strings.xml
+++ b/packages/Keyguard/res/values-fa/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"برای بازکردن قفل، گذرواژه را وارد کنید"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"برای بازکردن قفل، پین را تایپ کنید"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"پین کد اشتباه است."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"برای بازگشایی قفل، منو را فشار دهید و سپس 0 را فشار دهید."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"دفعات تلاش برای Face Unlock از حداکثر مجاز بیشتر شد"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"شارژ شد"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"شارژ کردن"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"شارژر خود را وصل کنید."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"سیم کارت قفل شد."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"سیم کارت با PUK قفل شده است."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"درحال بازگشایی قفل سیم کارت..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ابزارک %2$d از %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ابزارک اضافه کنید."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"خالی"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"منطقه بازگشایی گسترده شد."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"منطقه بازگشایی کوچک شد."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"ابزارک <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"انتخابگر کاربر"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"دوربین"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"کنترلهای رسانه"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"مرتب سازی مجدد ابزارک آغاز شد."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"مرتبسازی مجدد ابزارک به پایان رسید."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"ابزارک <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> حذف شد."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"گسترده کردن منطقه بازگشایی شده."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"باز کردن قفل با کشیدن انگشت روی صفحه."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"باز کردن قفل با الگو."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"باز کردن قفل با چهره."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"باز کردن قفل با پین."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"قسمت پین"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"قسمت پین سیمکارت"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"قسمت PUK سیمکارت"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"دکمه تراک قبلی"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"دکمه تراک بعدی"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"دکمه توقف موقت"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"دکمه پخش"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"دکمه توقف"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"رأی موافق"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"رأی مخالف"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"قلب"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"برای ادامه قفل را باز کنید"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"راهاندازی لغو شد"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"جهت حذف، <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> را بکشید."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> پاک نخواهد شد."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"زنگ هشدار بعدی برای <xliff:g id="ALARM">%1$s</xliff:g> تنظیم شد"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"لغو"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"انجام شد"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"تغییر حالت"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"بازکردن قفل"</string>
- <string name="description_target_camera" msgid="969071997552486814">"دوربین"</string>
- <string name="description_target_silent" msgid="893551287746522182">"ساکت"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"صدا روشن"</string>
- <string name="description_target_search" msgid="3091587249776033139">"جستجو"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"لغزاندن به بالا برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"لغزاندن به پایین برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"لغزاندن به چپ برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"لغزاندن به راست برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"کاربر کنونی <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"تماس اضطراری"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"الگو را فراموش کردهاید"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"الگوی اشتباه"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"پین کد صحیح را دوباره وارد کنید. تلاشهای مکرر بهطور دائم سیم کارت را غیرفعال خواهد کرد."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"پین کدها منطبق نیستند"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"تلاشهای زیادی برای کشیدن الگو صورت گرفته است"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"برای بازگشایی قفل، با حساب Google خود وارد سیستم شوید."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"نام کاربری (ایمیل)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"گذرواژه"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"ورود به سیستم"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"نام کاربری یا گذرواژه نامعتبر."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"نام کاربری یا گذرواژه خود را فراموش کردید؟\nاز "<b>"google.com/accounts/recovery"</b>" بازدید کنید."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"درحال بررسی حساب..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"پین خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه تایپ کردید. \n\nپس از <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"گذرواژه خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه تایپ کردید. \n\nپس از <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"الگوی بازگشایی قفل خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیدید. \n\nلطفاً پس از <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"<xliff:g id="NUMBER">%d</xliff:g> تلاش ناموفق برای باز کردن قفل تلفن داشتهاید. نمایه کار حذف میشود که با آن همه اطلاعات نمایه حذف میشود."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"شما الگوی بازگشایی قفل خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیدهاید. بعد از <xliff:g id="NUMBER_1">%d</xliff:g> تلاش ناموفق، از شما خواسته میشود که با استفاده از یک حساب ایمیل قفل رایانه لوحی خود را باز کنید.\n\n لطفاً پس از <xliff:g id="NUMBER_2">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"شما الگوی بازگشایی قفل خود را <xliff:g id="NUMBER_0">%d</xliff:g> بار اشتباه کشیدهاید. پس از <xliff:g id="NUMBER_1">%d</xliff:g> تلاش ناموفق، از شما خواسته میشود که با استفاده از یک حساب ایمیل قفل تلفن خود را باز کنید.\n\n لطفاً پس از <xliff:g id="NUMBER_2">%d</xliff:g> ثانیه دوباره امتحان کنید."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"حذف"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"کد پین سیم کارت اشتباه است، اکنون برای گشودن قفل دستگاهتان باید با شرکت مخابراتی تماس بگیرید."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"کد پین سیم کارت اشتباه است، <xliff:g id="NUMBER">%d</xliff:g> بار دیگر میتوانید تلاش کنید و پس از آن برای گشودن قفل دستگاهتان باید با شرکت مخابراتی تماس بگیرید."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"عملیات پین سیم کارت ناموفق بود!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"عملیات PUK سیم کارت ناموفق بود!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"کد پذیرفته شد!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"دکمه تراک قبلی"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"دکمه تراک بعدی"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"دکمه توقف موقت"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"دکمه پخش"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"دکمه توقف"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"خدماتی وجود ندارد."</string>
</resources>
diff --git a/packages/Keyguard/res/values-fi/strings.xml b/packages/Keyguard/res/values-fi/strings.xml
index 6cbc029..8485cbe 100644
--- a/packages/Keyguard/res/values-fi/strings.xml
+++ b/packages/Keyguard/res/values-fi/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Poista lukitus antamalla salasana"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Poista lukitus antamalla PIN-koodi"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"PIN-koodi väärin."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Poista lukitus painamalla Valikko-painiketta ja 0-näppäintä."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Face Unlock -yrityksiä tehty suurin sallittu määrä."</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Täynnä"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Ladataan"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Kytke laturi."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-kortti on lukittu."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kortti on PUK-lukittu."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM-kortin lukitusta poistetaan…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d/%3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Lisää widget."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tyhjä"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Lukituksen poiston alue laajennettu."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Lukituksen poiston alue tiivistetty."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>-widget."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Käyttäjävalitsin"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Mediaohjaimet"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Widgetien järjestely aloitettu."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Widgetien järjestely päättyi."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> poistettu."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Laajenna lukituksen poiston aluetta."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Lukituksen poisto liu\'uttamalla."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Lukituksen poisto salasanalla."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face Unlock"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Lukituksen poisto PIN-koodilla."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-koodin alue"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM-kortin PIN-koodin alue"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM-kortin PUK-koodin alue"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Edellinen kappale -painike"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Seuraava kappale -painike"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Tauko-painike"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Toista-painike"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Keskeytä-painike"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Tykkään"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"En tykkää"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Sydän"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Jatka poistamalla lukitus"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Käynnistys peruutettu"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Poista <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> pudottamalla."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Kohdetta <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ei poisteta."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Seuraava hälytys asetettu: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Peruuta"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Poista"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Valmis"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Tilan muutos"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Poista lukitus"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Äänetön"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Ääni käytössä"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Haku"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Liu\'uta ylös ja <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Liu\'uta alas ja <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Liu\'uta vasemmalle ja <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Liu\'uta oikealle ja <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Nykyinen käyttäjä: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Hätäpuhelu"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Unohtunut kuvio"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Väärä kuvio"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Anna uudelleen oikea PUK-koodi. Jos teet liian monta yritystä, SIM-kortti poistetaan käytöstä pysyvästi."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN-koodit eivät täsmää"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Liikaa kuvionpiirtoyrityksiä"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Poista lukitus kirjautumalla sisään Google-tililläsi."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Käyttäjänimi (sähköposti)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Salasana"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Kirjaudu sisään"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Virheellinen käyttäjänimi tai salasana."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Unohditko käyttäjänimesi tai salasanasi?\nKäy osoitteessa "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Tarkistetaan tiliä..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Olet kirjoittanut PIN-koodin väärin <xliff:g id="NUMBER_0">%d</xliff:g> kertaa. \n\nYritä uudelleen <xliff:g id="NUMBER_1">%d</xliff:g> sekunnin kuluttua."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Olet kirjoittanut salasanan väärin <xliff:g id="NUMBER_0">%d</xliff:g> kertaa. \n\nYritä uudelleen <xliff:g id="NUMBER_1">%d</xliff:g> sekunnin kuluttua."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Olet piirtänyt lukituksenpoistokuvion väärin <xliff:g id="NUMBER_0">%d</xliff:g> kertaa. \n\nYritä uudelleen <xliff:g id="NUMBER_1">%d</xliff:g> sekunnin kuluttua."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Yritit avata puhelimen lukituksen virheellisillä tiedoilla <xliff:g id="NUMBER">%d</xliff:g> kertaa. Työprofiili ja kaikki sen tiedot poistetaan."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Piirsit lukituksenpoistokuvion väärin <xliff:g id="NUMBER_0">%d</xliff:g> kertaa. Jos piirrät kuvion väärin vielä <xliff:g id="NUMBER_1">%d</xliff:g> kertaa, sinua pyydetään poistamaan tablet-laitteesi lukitus sähköpostitilin avulla.\n\n Yritä uudelleen <xliff:g id="NUMBER_2">%d</xliff:g> sekunnin kuluttua."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Piirsit lukituksenpoistokuvion väärin <xliff:g id="NUMBER_0">%d</xliff:g> kertaa. Jos piirrät kuvion väärin vielä <xliff:g id="NUMBER_1">%d</xliff:g> kertaa, sinua pyydetään poistamaan puhelimesi lukitus sähköpostitilin avulla.\n\n Yritä uudelleen <xliff:g id="NUMBER_2">%d</xliff:g> sekunnin kuluttua."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Poista"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Virheellinen SIM-kortin PIN-koodi. Sinun on nyt otettava yhteys operaattoriin laitteen lukituksen avaamiseksi."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Virheellinen SIM-kortin PIN-koodi. Sinulla on <xliff:g id="NUMBER">%d</xliff:g> yritys jäljellä, ennen kuin sinun on otettava yhteys operaattoriin laitteen lukituksen avaamiseksi."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM-kortin PIN-toiminto epäonnistui!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM-kortin PUK-toiminto epäonnistui!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Koodi hyväksytty!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Edellinen kappale -painike"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Seuraava kappale -painike"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Tauko-painike"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Toista-painike"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Keskeytä-painike"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Ei yhteyttä."</string>
</resources>
diff --git a/packages/Keyguard/res/values-fr-rCA/strings.xml b/packages/Keyguard/res/values-fr-rCA/strings.xml
index d5b62ee..e45f7f4 100644
--- a/packages/Keyguard/res/values-fr-rCA/strings.xml
+++ b/packages/Keyguard/res/values-fr-rCA/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Saisissez le mot de passe pour déverrouiller le clavier."</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Saisissez le NIP pour déverrouiller le clavier."</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"NIP erroné."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Pour déverrouiller le téléphone, appuyez sur \"Menu\", puis sur 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Nombre maximal autorisé de tentatives Face Unlock atteint."</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Chargé"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Charge en cours..."</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Branchez votre chargeur."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"La carte SIM est verrouillée."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La carte SIM est verrouillée par clé PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Déverrouillage de la carte SIM en cours…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d sur %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ajouter un widget"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vide"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Développement de la zone de déverrouillage"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Réduction de la zone de déverrouillage"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Sélecteur d\'utilisateur"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Caméra"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Commandes multimédias"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Début de la réorganisation des widgets"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Fin de la réorganisation des widgets"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Le widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> a été supprimé."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Développer la zone de déverrouillage"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Déverrouillage en faisant glisser votre doigt sur l\'écran"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Déverrouillage par schéma"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Déverrouillage par reconnaissance faciale"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Déverrouillage par NIP"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Zone du NIP"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Zone du NIP de la carte SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Zone du code PUK de la carte SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Bouton pour revenir au titre précédent"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Bouton pour atteindre le titre suivant"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Bouton de pause"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Bouton de lecture"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Bouton d\'arrêt"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"J\'aime"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Je n\'aime pas"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Cœur"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Déverrouiller pour continuer"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lancement annulé"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Déposez <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> pour supprimer."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ne sera pas supprimé."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Heure de la prochaine alarme : <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Annuler"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Supprimer"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Terminé"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Changement de mode"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Maj"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Entrée"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Déverrouiller"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Appareil photo"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Mode silencieux"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Son activé"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Recherche"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Faire glisser le doigt vers le haut : <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Faire glisser le doigt vers le bas : <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Faites glisser votre doigt vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Faites glisser votre doigt vers la droite pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Utilisateur actuel : <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Appel d\'urgence"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"J\'ai oublié le schéma"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Schéma incorrect."</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Veuillez saisir de nouveau le code PUK correct. Des tentatives répétées désactivent définitivement la carte SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Les codes PIN ne correspondent pas."</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Trop de tentatives."</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Pour déverrouiller l\'appareil, connectez-vous avec votre compte Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Nom d\'utilisateur (courriel)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Mot de passe"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Connexion"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Nom d\'utilisateur ou mot de passe non valide."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Vous avez oublié votre nom d\'utilisateur ou votre mot de passe?\nRendez-vous sur la page "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Vérification du compte en cours…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Vous avez saisi un NIP incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. \n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Vous avez saisi un mot de passe incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. \n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Vous avez tenté de déverrouiller ce téléphone à <xliff:g id="NUMBER">%d</xliff:g> reprises. Le profil professionnel sera supprimé, ce qui entraîne la suppression de toutes ses données."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%d</xliff:g> fois, vous devrez déverrouiller votre tablette à l\'aide d\'un compte de messagerie électronique.\n\n Veuillez réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%d</xliff:g> fois, vous devrez déverrouiller votre téléphone à l\'aide d\'un compte de messagerie électronique.\n\n Veuillez réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Supprimer"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"NIP de carte SIM incorrect. Vous devez maintenant communiquer avec votre fournisseur de services pour déverrouiller votre appareil."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"NIP de carte SIM incorrect. Il vous reste <xliff:g id="NUMBER">%d</xliff:g> tentative. Après cela, vous devrez communiquer avec votre fournisseur de services pour déverrouiller votre appareil."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Le déverrouillage par NIP de la carte SIM a échoué."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Le déverrouillage de la carte SIM par code PUK a échoué."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Code accepté"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Bouton pour revenir au titre précédent"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Bouton pour atteindre le titre suivant"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Bouton de pause"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Bouton de lecture"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Bouton d\'arrêt"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Aucun service"</string>
</resources>
diff --git a/packages/Keyguard/res/values-fr/strings.xml b/packages/Keyguard/res/values-fr/strings.xml
index 5a62057..a87da9a 100644
--- a/packages/Keyguard/res/values-fr/strings.xml
+++ b/packages/Keyguard/res/values-fr/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Saisissez le mot de passe pour déverrouiller le clavier."</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Saisissez le code PIN pour déverrouiller le clavier."</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Le code PIN est erroné."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Pour déverrouiller le clavier, appuyez sur \"Menu\" puis sur 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Nombre maximal autorisé de tentatives Face Unlock atteint."</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Chargé"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Batterie en charge…"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Branchez votre chargeur."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"La carte SIM est verrouillée."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La carte SIM est verrouillée par clé PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Déverrouillage de la carte SIM en cours…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d sur %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ajouter un widget"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vide"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Zone de déverrouillage développée."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Zone de déverrouillage réduite."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Sélecteur d\'utilisateur"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Caméra"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Commandes multimédias"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Début de la réorganisation des widgets"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Réorganisation des widgets terminée."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Le widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> a été supprimé."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Développer la zone de déverrouillage"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Déverrouillage en faisant glisser votre doigt sur l\'écran"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Déverrouillage par schéma"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Déverrouillage par reconnaissance faciale"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Déverrouillage par code PIN"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Champ du code PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Champ du code PIN de la carte SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Champ du code PUK de la carte SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Bouton pour revenir au titre précédent"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Bouton pour atteindre le titre suivant"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Bouton de pause"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Bouton de lecture"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Bouton d\'arrêt"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"J\'aime"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Je n\'aime pas"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Cœur"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Déverrouillez l\'appareil pour continuer."</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lancement annulé."</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Relâchez le widget \"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>\" pour le supprimer."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Le widget \"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>\" ne va pas être supprimé."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Prochaine alarme définie à <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Annuler"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Supprimer"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Terminé"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Changement de mode"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Maj"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Entrée"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Déverrouiller"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Appareil photo"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Mode silencieux"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Son activé"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Rechercher"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Faites glisser vers le haut pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Faites glisser vers le bas pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Faites glisser vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Faites glisser vers la droite pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Utilisateur actuel : <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Appel d\'urgence"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"J\'ai oublié le schéma"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Schéma incorrect."</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Veuillez saisir de nouveau le code PUK correct. Des tentatives répétées désactivent définitivement la carte SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Les codes PIN ne correspondent pas."</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Trop de tentatives."</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Pour déverrouiller le téléphone, veuillez vous connecter avec votre compte Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Nom d\'utilisateur (e-mail)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Mot de passe"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Connexion"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Nom d\'utilisateur ou mot de passe non valide."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Vous avez oublié votre nom d\'utilisateur ou votre mot de passe ?\nRendez-vous sur la page "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Vérification du compte en cours…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Vous avez saisi un code PIN incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. \n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Vous avez saisi un mot de passe incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. \n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Vous avez tenté de déverrouiller le téléphone à <xliff:g id="NUMBER">%d</xliff:g> reprises. Le profil professionnel et toutes les données associées vont être supprimés."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%d</xliff:g> fois, vous devrez déverrouiller votre tablette à l\'aide d\'un compte de messagerie électronique.\n\n Veuillez réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%d</xliff:g> fois, vous devrez déverrouiller votre téléphone à l\'aide d\'un compte de messagerie électronique.\n\n Veuillez réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Supprimer"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Code PIN de la carte SIM incorrect. Vous devez désormais contacter votre opérateur pour déverrouiller votre appareil."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Code PIN de la carte SIM incorrect. Il vous reste <xliff:g id="NUMBER">%d</xliff:g> tentative. Après cela, vous devrez contacter votre opérateur pour déverrouiller votre appareil."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Échec du déverrouillage à l\'aide du code PIN de la carte SIM."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Échec du déverrouillage à l\'aide de la clé PUK de la carte SIM."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Code accepté."</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Bouton pour revenir au titre précédent"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Bouton pour atteindre le titre suivant"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Bouton de pause"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Bouton de lecture"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Bouton d\'arrêt"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Aucun service"</string>
</resources>
diff --git a/packages/Keyguard/res/values-gl-rES/strings.xml b/packages/Keyguard/res/values-gl-rES/strings.xml
index 4cd8ae0..1a5595a 100644
--- a/packages/Keyguard/res/values-gl-rES/strings.xml
+++ b/packages/Keyguard/res/values-gl-rES/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Escribe o contrasinal para desbloquear"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Escribe o PIN para desbloquear"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Código PIN incorrecto"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Para desbloquear, preme Menú e, a continuación, 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Superouse o número máximo de intentos de desbloqueo facial"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Cargado"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Cargando"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Conecta o cargador."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"A tarxeta SIM está bloqueada."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"A tarxeta SIM está bloqueada mediante un PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Desbloqueando tarxeta SIM…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Engadir widget."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Baleiro"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Área de desbloqueo ampliada"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Área de desbloqueo contraída"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Selector de usuarios"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Cámara"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Controis multimedia"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Reordenación de widget iniciada"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Reordenación de widget finalizada"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> eliminado"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Ampliar zona de desbloqueo."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Desbloqueo pasando o dedo."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueo mediante padrón"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueo facial"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueo mediante PIN"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Área do PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Área do PIN da tarxeta SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Área do PUK da tarxeta SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Botón de pista anterior"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Botón de pista seguinte"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Botón de pausa"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Botón de reprodución"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botón de parada"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Gustoume"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Non me gustou"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Corazón"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloquea para continuar"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Inicio cancelado"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Solta <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> para eliminalo."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Non se eliminará <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Próxima alarma definida para <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Cancelar"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Eliminar"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Feito"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Cambio de modo"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Mayús"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Intro"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Desbloquear"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Cámara"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Silencio"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Son activado"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Buscar"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Pasa o dedo cara arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Pasa o dedo cara abaixo para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Pasa o dedo cara a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Pasa o dedo cara a dereita para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Usuario actual <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Chamada de emerxencia"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Esqueciches o padrón"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Padrón incorrecto"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Volve introducir o código PUK correcto. Se realizas intentos repetidos é posible que se desactive a tarxeta SIM permanentemente."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Os códigos PIN non coinciden"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Tentaches debuxar o padrón moitas veces"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Para desbloquear, inicia sesión coa túa conta de Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Nome de usuario (correo electrónico)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Contrasinal"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Iniciar sesión"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"O nome de usuario ou o contrasinal non son válidos."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Esqueciches o teu nome de usuario ou contrasinal?\nVisita a páxina "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Comprobando a conta..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Introduciches o PIN incorrectamente <xliff:g id="NUMBER_0">%d</xliff:g> veces. \n\nTéntao de novo en <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Introduciches o contrasinal incorrectamente <xliff:g id="NUMBER_0">%d</xliff:g> veces. \n\nTéntao de novo en <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Debuxaches incorrectamente o padrón de desbloqueo <xliff:g id="NUMBER_0">%d</xliff:g> veces. \n\nTéntao de novo en <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Tentaches desbloquear o teléfono <xliff:g id="NUMBER">%d</xliff:g> veces de forma incorrecta. Eliminarase o perfil de traballo e, por conseguinte, todos os datos do perfil."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Debuxaches o padrón de desbloqueo incorrectamente <xliff:g id="NUMBER_0">%d</xliff:g> veces. Se realizas <xliff:g id="NUMBER_1">%d</xliff:g> intentos incorrectos máis, terás que desbloquear o tablet a través dunha unha conta de correo electrónico.\n\n Téntao de novo dentro de <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Debuxaches o padrón de desbloqueo incorrectamente <xliff:g id="NUMBER_0">%d</xliff:g> veces. Se realizas <xliff:g id="NUMBER_1">%d</xliff:g> intentos incorrectos máis, terás que desbloquear o teléfono a través dunha conta de correo electrónico.\n\n Téntao de novo dentro de <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eliminar"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"O código PIN da SIM non é correcto. Agora debes contactar co teu operador para desbloquear o dispositivo."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"O código PIN da SIM non é correcto. Quédache <xliff:g id="NUMBER">%d</xliff:g> intento antes de que teñas que contactar co operador para desbloquear o dispositivo."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Erro ao tentar desbloquear a tarxeta SIM co código PIN."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Erro ao tentar desbloquar a tarxeta SIM co código PUK."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Código aceptado"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Botón de pista anterior"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Botón de pista seguinte"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Botón de pausa"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Botón de reprodución"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Botón de parada"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Non hai servizo."</string>
</resources>
diff --git a/packages/Keyguard/res/values-hi/strings.xml b/packages/Keyguard/res/values-hi/strings.xml
index c1f2b6c..788891e 100644
--- a/packages/Keyguard/res/values-hi/strings.xml
+++ b/packages/Keyguard/res/values-hi/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"अनलॉक करने के लिए पासवर्ड लिखें"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"अनलॉक करने के लिए पिन लिखें"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"गलत पिन कोड."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"अनलॉक करने के लिए, मेनू दबाएं और फिर 0 दबाएं."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"फेस अनलॉक के अधिकतम प्रयासों की सीमा पार हो गई"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"चार्ज हो गई है"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"चार्ज हो रहा है"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"अपना चार्जर कनेक्ट करें."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"सिम कार्ड लॉक है."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"सिम कार्ड PUK द्वारा लॉक किया हुआ है."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"सिम कार्ड अनलॉक हो रहा है…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d विजेट में से %2$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"विजेट जोड़ें"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"खाली"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"अनलॉक क्षेत्र को विस्तृत कर दिया गया."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"अनलॉक क्षेत्र को संक्षिप्त कर दिया गया."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> विजेट."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"उपयोगकर्ता चयनकर्ता"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"कैमरा"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"मीडिया नियंत्रण"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"विजेट फिर से क्रमित करना प्रारंभ."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"विजेट फिर से क्रमित करना समाप्त."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"विजेट <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> को हटा दिया गया."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"अनलॉक क्षेत्र विस्तृत करें."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"स्लाइड अनलॉक."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"आकार अनलॉक."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"फेस अनलॉक."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"पिन अनलॉक."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"पिन क्षेत्र"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"सिम पिन क्षेत्र"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"सिम पिइउके क्षेत्र"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"पिछला ट्रैक बटन"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"अगला ट्रैक बटन"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"पॉज़ करें बटन"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"चलाएं बटन"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"रोकें बटन"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"पसंद"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"नापसंद"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"दिल"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"जारी रखने के लिए अनलॉक करें"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"लॉन्च रद्द कर दिया गया"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"हटाने के लिए <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> खींचें."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> को नहीं हटाया जाएगा."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"अगला अलार्म <xliff:g id="ALARM">%1$s</xliff:g> के लिए सेट किया गया"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"रहने दें"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"हटाएं"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"पूर्ण"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Mode change"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"अनलॉक करें"</string>
- <string name="description_target_camera" msgid="969071997552486814">"कैमरा"</string>
- <string name="description_target_silent" msgid="893551287746522182">"मौन"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"ध्वनि चालू करें"</string>
- <string name="description_target_search" msgid="3091587249776033139">"खोजें"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> के लिए ऊपर स्लाइड करें."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> के लिए नीचे स्लाइड करें."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> के लिए बाएं स्लाइड करें."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> के लिए दाएं स्लाइड करें."</string>
- <string name="user_switched" msgid="3768006783166984410">"वर्तमान उपयोगकर्ता <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"आपातकालीन कॉल"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"आकार भूल गए"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत आकार"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"सही PUK कोड पुन: डालें. बार-बार प्रयास करने से सिम स्थायी रूप से अक्षम हो जाएगी."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"पिन कोड का मिलान नहीं होता"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"बहुत अधिक आकार प्रयास"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"अनलॉक करने के लिए, अपने Google खाते से प्रवेश करें."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"उपयोगकर्ता नाम (ईमेल)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"पासवर्ड"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"प्रवेश करें"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"अमान्य उपयोगकर्ता नाम या पासवर्ड."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"अपना उपयोगकर्ता नाम या पासवर्ड भूल गए?\n "<b>"google.com/accounts/recovery"</b>" पर जाएं."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"खाते की जांच की जा रही है…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"आप अपना PIN <xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से लिख चुके हैं. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकंड में पुन: प्रयास करें."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"आप अपना पासवर्ड <xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से लिख चुके हैं. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकंड में पुन: प्रयास करें."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"आपने अपना अनलॉक आकार <xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से आरेखित किया है. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकंड में पुन: प्रयास करें."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"आपने फ़ोन को अनलॉक करने के लिए <xliff:g id="NUMBER">%d</xliff:g> बार गलत तरीके से प्रयास किया है. कार्य प्रोफ़ाइल को निकाल दिया जाएगा, जिससे सभी प्रोफ़ाइल डेटा हट जाएगा."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"आपने अपने अनलॉक आकार को <xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से आरेखित किया है. <xliff:g id="NUMBER_1">%d</xliff:g> और असफल प्रयासों के बाद, आपसे अपने टेबलेट को किसी ईमेल खाते के उपयोग से अनलॉक करने के लिए कहा जाएगा.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> सेकंड में पुन: प्रयास करें."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"आपने अपने अनलॉक आकार को <xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से आरेखित किया है. <xliff:g id="NUMBER_1">%d</xliff:g> और असफल प्रयासों के बाद, आपसे अपने फ़ोन को किसी ईमेल खाते का उपयोग करके अनलॉक करने के लिए कहा जाएगा.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> सेकंड में पुन: प्रयास करें."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"निकालें"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"गलत सिम PIN कोड अपने डिवाइस को अनलॉक करने के लिए अब आपको अपने वाहक से संपर्क करना होगा."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"गलत सिम PIN कोड, अपने डिवाइस को अनलॉक करने के लिए अपने वाहक से संपर्क करने से पहले आपके पास <xliff:g id="NUMBER">%d</xliff:g> प्रयास शेष है."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"सिम PIN की कार्यवाही विफल रही!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"सिम PUK की कार्यवाही विफल रही!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"कोड स्वीकार किया गया!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"पिछला ट्रैक बटन"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"अगला ट्रैक बटन"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"पॉज़ करें बटन"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"चलाएं बटन"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"रोकें बटन"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"कोई सेवा नहीं."</string>
</resources>
diff --git a/packages/Keyguard/res/values-hr/strings.xml b/packages/Keyguard/res/values-hr/strings.xml
index 56c4bb1..c659e5d 100644
--- a/packages/Keyguard/res/values-hr/strings.xml
+++ b/packages/Keyguard/res/values-hr/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Unesite zaporku za otključavanje"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Unesite PIN za otključavanje"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Netočan PIN kôd."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Za otključavanje pritisnite Izbornik pa 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Premašen je maksimalni broj Otključavanja licem"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Napunjeno"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Punjenje"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Priključite punjač."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM kartica je zaključana."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM kartica zaključana je PUK-om."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Otključavanje SIM kartice…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d od %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Dodavanje widgeta."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Prazno"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Područje za otključavanje prošireno je."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Područje za otključavanje sažeto je."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Birač korisnika"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Fotoaparat"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Nadzor medija"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Pokrenuta je promjena redoslijeda widgeta."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Završena je promjena redoslijeda widgeta."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> izbrisan je."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Proširivanje područja za otključavanje."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Otključavanje klizanjem."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Uzorak za otključavanje."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Otključavanje licem."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Otključavanje PIN-om."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Područje PIN-a"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Područje PIN-a za SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Područje PUK-a za SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Gumb Prethodni zapis"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Gumb Sljedeći zapis"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Gumb Pauza"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Gumb Reprodukcija"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Gumb Zaustavi"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Palac gore"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Palac dolje"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Srce"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Otključajte za nastavak"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Pokretanje je otkazano"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Ispustite widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> da biste ga izbrisali."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> neće se izbrisati."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Sljedeći alarm postavljen za <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Odustani"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Izbriši"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Gotovo"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Promjena načina"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Otključaj"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Fotoaparat"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Bešumno"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Zvuk je uključen"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Pretraživanje"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Kliznite prema gore za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Kliznite prema dolje za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Kliznite lijevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Kliznite desno za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Trenutačni korisnik <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Hitan poziv"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Zaboravili ste obrazac"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Pogrešan obrazac"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Ponovo unesite ispravan PUK kôd. Ponovljeni pokušaji trajno će onemogućiti SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN kodovi nisu jednaki"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Previše pokušaja iscrtavanja obrasca"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Za otključavanje prijavite se Google računom."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Korisničko ime (e-pošta)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Zaporka"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Prijava"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Nevažeće korisničko ime ili zaporka."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Zaboravili ste korisničko ime ili zaporku?\nPosjetite "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Provjera računa..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Netočno ste napisali PIN <xliff:g id="NUMBER_0">%d</xliff:g> puta. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Netočno ste napisali zaporku <xliff:g id="NUMBER_0">%d</xliff:g> puta. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Netočno ste iscrtali obrazac za otključavanje <xliff:g id="NUMBER_0">%d</xliff:g> puta. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"<xliff:g id="NUMBER">%d</xliff:g> put/a ste neuspješno pokušali otključati telefon. Radni će se profil ukloniti, a time će se izbrisati i svi njegovi podaci."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Netočno ste iscrtali obrazac za otključavanje <xliff:g id="NUMBER_0">%d</xliff:g> puta. Nakon još ovoliko neuspješnih pokušaja: <xliff:g id="NUMBER_1">%d</xliff:g> morat ćete otključati tabletno računalo pomoću računa e-pošte.\n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Netočno ste iscrtali obrazac za otključavanje <xliff:g id="NUMBER_0">%d</xliff:g> puta. Nakon još ovoliko neuspješnih pokušaja: <xliff:g id="NUMBER_1">%d</xliff:g> morat ćete otključati telefon pomoću računa e-pošte.\n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Ukloni"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Netočan PIN kôd SIM kartice; sada morate kontaktirati svog mobilnog operatera da bi otključao vaš uređaj."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Netočan PIN kôd SIM kartice; imate još <xliff:g id="NUMBER">%d</xliff:g> pokušaj prije nego što budete morali kontaktirati svog mobilnog operatera da bi otključao vaš uređaj."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Operacija PIN-a SIM kartice nije uspjela!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Operacija PUK-a SIM kartice nije uspjela!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Kôd je prihvaćen!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Gumb Prethodni zapis"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Gumb Sljedeći zapis"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Gumb Pauza"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Gumb Reprodukcija"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Gumb Zaustavi"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Nema usluge."</string>
</resources>
diff --git a/packages/Keyguard/res/values-hu/strings.xml b/packages/Keyguard/res/values-hu/strings.xml
index 74a63bb..144e76d 100644
--- a/packages/Keyguard/res/values-hu/strings.xml
+++ b/packages/Keyguard/res/values-hu/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"A feloldáshoz írja be a jelszót"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Feloldáshoz írja be a PIN kódot"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Helytelen PIN kód."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"A feloldáshoz nyomja meg a Menü, majd a 0 gombot."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Elérte az arcalapú feloldási kísérletek maximális számát"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Feltöltve"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Töltés"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Csatlakoztassa a töltőt."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"A SIM kártya le van zárva."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"A SIM kártya le van zárva a PUK kóddal."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM kártya feloldása..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Modul %3$d/%2$d"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Modul hozzáadása."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Üres"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Feloldási terület kiterjesztve."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Feloldási terület összecsukva."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> modul."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Felhasználóválasztó"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Médiaelemek vezérlője"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"A modulátrendezés elkezdődött."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"A modulátrendezés véget ért."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> modul törölve."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"A feloldási terület kiterjesztése."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Feloldás csúsztatással"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Feloldás mintával"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Arcalapú feloldás"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Feloldás PIN kóddal"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN kód területe"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN kód területe"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK kód területe"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Előző szám gomb"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Következő szám gomb"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Szünet gomb"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Lejátszás gomb"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Leállítás gomb"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Tetszik"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Nem tetszik"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Szív"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"A folytatáshoz oldja fel a billentyűzárat"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Indítás törölve"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Engedje el a(z) <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> törléséhez."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"A(z) <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> nem lesz törölve."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"A következő riasztás beállított ideje: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Mégse"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Kész"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Mód váltása"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Feloldás"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Némítás"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Hang bekapcsolása"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Keresés"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa felfelé."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa lefelé."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa balra."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa jobbra."</string>
- <string name="user_switched" msgid="3768006783166984410">"<xliff:g id="NAME">%1$s</xliff:g> az aktuális felhasználó."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Segélyhívás"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Elfelejtett minta"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Helytelen minta"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Adja meg újra a helyes PUK kódot. Az ismételt próbálkozással véglegesen letiltja a SIM kártyát."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"A PIN kódok nem egyeznek."</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Túl sok mintarajzolási próbálkozás"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"A feloldáshoz jelentkezzen be Google-fiókjával."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Felhasználónév (e-mail cím)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Jelszó"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Bejelentkezés"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Érvénytelen felhasználónév vagy jelszó."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Elfelejtette a felhasználónevét vagy jelszavát?\nKeresse fel a "<b>"google.com/accounts/recovery"</b>" webhelyet."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Fiók ellenőrzése..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"<xliff:g id="NUMBER_0">%d</xliff:g> alkalommal helytelenül adta meg PIN kódját. \n\nPróbálja újra <xliff:g id="NUMBER_1">%d</xliff:g> másodperc múlva."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"<xliff:g id="NUMBER_0">%d</xliff:g> alkalommal helytelenül adta meg a jelszót. \n\n Próbálja újra <xliff:g id="NUMBER_1">%d</xliff:g> másodperc múlva."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"<xliff:g id="NUMBER_0">%d</xliff:g> alkalommal rosszul rajzolta le feloldási mintát. \n\nPróbálja újra <xliff:g id="NUMBER_1">%d</xliff:g> másodperc múlva."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"<xliff:g id="NUMBER">%d</xliff:g> alkalommal próbálkozott sikertelenül a telefon zárolásának feloldásával. A rendszer eltávolítja munkahelyi profilját, és összes profiladata törlődik."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"<xliff:g id="NUMBER_0">%d</xliff:g> alkalommal helytelenül rajzolta le a feloldási mintát. További <xliff:g id="NUMBER_1">%d</xliff:g> sikertelen kísérlet után egy e-mail fiók használatával kell feloldania a táblagépét.\n\n Kérjük, próbálja újra <xliff:g id="NUMBER_2">%d</xliff:g> másodperc múlva."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"<xliff:g id="NUMBER_0">%d</xliff:g> alkalommal helytelenül rajzolta le a feloldási mintát. További <xliff:g id="NUMBER_1">%d</xliff:g> sikertelen kísérlet után egy e-mail fiók használatával kell feloldania a telefonját.\n\n Kérjük, próbálja újra <xliff:g id="NUMBER_2">%d</xliff:g> másodperc múlva."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eltávolítás"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Helytelen PIN kód a SIM kártyához; vegye fel a kapcsolatot szolgáltatójával az eszköz feloldásához."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Helytelen PIN kód a SIM kártyához; még <xliff:g id="NUMBER">%d</xliff:g> próbálkozása van, mielőtt fel kellene vennie a kapcsolatot szolgáltatójával az eszköz feloldásához."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"A SIM kártya PIN-művelete sikertelen!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"A SIM kártya PUK-művelete sikertelen!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Kód elfogadva."</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Előző szám gomb"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Következő szám gomb"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Szünet gomb"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Lejátszás gomb"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Leállítás gomb"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Nincs szolgáltatás."</string>
</resources>
diff --git a/packages/Keyguard/res/values-hy-rAM/strings.xml b/packages/Keyguard/res/values-hy-rAM/strings.xml
index e233d12..1c9c8a0 100644
--- a/packages/Keyguard/res/values-hy-rAM/strings.xml
+++ b/packages/Keyguard/res/values-hy-rAM/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Մուտքագրեք գաղտնաբառը ապակողպման համար"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Մուտքագրեք PIN-ը ապակողպման համար"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Սխալ PIN ծածկագիր:"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Ապակողպման համար սեղմեք Ցանկ, ապա 0:"</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Առավելագույն Դեմքով ապակողպման փորձերը գերազանցված են"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Լիցքավորված է"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Լիցքավորում"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Միացրեք ձեր լիցքավորիչը:"</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM քարտը կողպված է:"</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM քարտը PUK-ով կողպված է:"</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM քարտը ապակողպվում է..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Վիջեթ %2$d of %3$d:"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ավելացնել վիջեթ:"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Դատարկ"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Ապակողպման տարածքն ընդլայնված է:"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Ապակողպման տարածքը ետ է ծալված:"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> վիջեթ:"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Օգտվողի ընտրիչ"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Ֆոտոխցիկ"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Մեդիա կարգավորումներ"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Վիջեթների վերադասավորումը մեկնարկել է:"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Վիջեթի վերադասավորումն ավարտվեց:"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Վիջեթ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>-ը ջնջված է:"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Ընդլայնել ապակողպման տարածությունը:"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Էջի ապակողպում:"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Սխեմայով ապակողպում:"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Դեմքով ապակողպում:"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin-ն ապակողպված է:"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN կոդի տարածք"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM քարտի PIN կոդի տարածք"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM քարտի PUK կոդի տարածք"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Նախորդ հետագծի կոճակը"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Հաջորդ հետագծի կոճակը"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Դադարի կոճակ"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Նվագարկման կոճակ"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Կանգի կոճակ"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Լավն է"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Լավը չէ"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Սիրտ"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Շարունակելու համար ապակողպեք"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Գործարկումը չեղարկվեց"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> վիջեթը ջնջելու համար բաց թողեք այն այստեղ:"</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> վիջեթը չի ջնջվի:"</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Հաջորդ զարթուցիչը դրված է <xliff:g id="ALARM">%1$s</xliff:g>-ի վրա"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Չեղարկել"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Ջնջել"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Կատարված է"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Ռեժիմի փոփոխում"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Մուտք"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Ապակողպել"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Ֆոտոխցիկ"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Լուռ"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Ձայնը միացնել"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Որոնել"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Սահեցրեք վերև <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ի համար:"</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Սահեցրեք ցած <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ի համար:"</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Սահեցրեք ձախ` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ի համար:"</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Սահեցրեք աջ` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ի համար:"</string>
- <string name="user_switched" msgid="3768006783166984410">"Ներկայիս օգտվողը <xliff:g id="NAME">%1$s</xliff:g>:"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Արտակարգ իրավիճակի հեռախոսազանգ"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Մոռացել եմ սխեման"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Սխալ սխեմա"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Վերամուտքագրեք ճիշտ PUK ծածկագիրը: Կրկնվող փորձերը ընդմիշտ կկասեցնեն SIM քարտը:"</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN ծածկագրերը չեն համընկնում"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Չափից շատ սխեմայի փորձեր"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Ապակողպելու համար` մուտք գործեք ձեր Google հաշվով:"</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Օգտանուն (էլփոստ)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Գաղտնաբառը"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Մուտք գործել"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Սխալ օգտանուն կամ գաղտնաբառ:"</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Մոռացե՞լ եք ձեր օգտանունը կամ գաղտնաբառը:\nԱյցելեք "<b>"google.com /accounts/recovery"</b>":"</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Հաշիվը ստուգվում է..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> անգամ սխալ եք մուտքագրել ձեր PIN-ը: \n\nՓորձեք կրկին <xliff:g id="NUMBER_1">%d</xliff:g> վայրկյանից:"</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Դուք սխալ եք մուտքագրել ձեր գաղտնաբառը <xliff:g id="NUMBER_0">%d</xliff:g> անգամ: \n\nՓորձեք կրկին <xliff:g id="NUMBER_1">%d</xliff:g> վայրկյանից:"</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> անգամ սխալ եք հավաքել ձեր ապակողպման սխեման: \n\nՓորձեք կրկին <xliff:g id="NUMBER_1">%d</xliff:g> վայրկյանից:"</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Դուք կատարել եք հեռախոսն ապակողպելու <xliff:g id="NUMBER">%d</xliff:g> անհաջող փորձ: Աշխատանքային պրոֆիլը կհեռացվի և պրոֆիլի բոլոր տվյալները կջնջվեն:"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Դուք սխալ եք հավաքել ձեր ապակողպման սխեման <xliff:g id="NUMBER_0">%d</xliff:g> անգամ: Եվս <xliff:g id="NUMBER_1">%d</xliff:g> անհաջող փորձից հետո ձեզանից կպահանջվի ապակողպել ձեր գրասալիկը` օգտագործելով էլփոստի հաշիվ:\n\n Փորձեք կրկին <xliff:g id="NUMBER_2">%d</xliff:g> վայրկյանից:"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Դուք <xliff:g id="NUMBER_0">%d</xliff:g> անգամ սխալ եք հավաքել ձեր ապակողպման նմուշը: <xliff:g id="NUMBER_1">%d</xliff:g> անգամից ավել անհաջող փորձերից հետո ձեզ կառաջարկվի ապակողպել ձեր հեռախոսը` օգտագործելով էլփոստի հաշիվ:\n\n Փորձեք կրկին <xliff:g id="NUMBER_2">%d</xliff:g> վայրկյանից:"</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Հեռացնել"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Սխալ SIM PIN կոդի պատճառով պետք է դիմեք ձեր օպերատորին՝ սարքն արգելաբացելու համար:"</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"SIM PIN կոդը սխալ է: Մնաց <xliff:g id="NUMBER">%d</xliff:g> փորձ, որից հետո պետք է դիմեք ձեր օպերատորին՝ սարքն արգելաբացելու համար:"</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN գործողությունը ձախողվեց:"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK գործողությունը ձախողվեց:"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Կոդն ընդունվեց:"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Նախորդ հետագծի կոճակ"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Հաջորդ հետագծի կոճակ"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Դադարի կոճակ"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Նվագարկման կոճակ"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Դադարի կոճակ"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Ծառայություն չկա:"</string>
</resources>
diff --git a/packages/Keyguard/res/values-in/strings.xml b/packages/Keyguard/res/values-in/strings.xml
index d637208..6539cc1 100644
--- a/packages/Keyguard/res/values-in/strings.xml
+++ b/packages/Keyguard/res/values-in/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Ketik sandi untuk membuka kunci"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Ketik PIN untuk membuka kunci"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Kode PIN salah."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Untuk membuka, tekan Menu lalu 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Percobaan Face Unlock melebihi batas maksimum"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Terisi"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Mengisi daya"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Hubungkan pengisi daya."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Kartu SIM terkunci."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Kartu SIM terkunci PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Membuka kartu SIM…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d dari %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Tambahkan widget."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Kosong"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Area buka kunci diluaskan."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Area buka kunci diciutkan."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Pemilih pengguna"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Kontrol media"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Pengurutan ulang widget dimulai."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Pengurutan ulang widget berakhir."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> dihapus."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Luaskan area buka kunci."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Buka kunci dengan menggeser."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Buka kunci dengan pola."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Buka kunci dengan face unlock."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Buka kunci dengan PIN."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Bidang PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Bidang PIN SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Bidang PUK SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Tombol lagu sebelumnya"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Tombol lagu berikutnya"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Tombol jeda"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Tombol putar"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Tombol hentikan"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Bagus"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Jelek"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hati"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Buka kunci untuk melanjutkan"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Peluncuran dibatalkan"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Jatuhkan <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> untuk menghapus."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> tidak akan dihapus."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Alarm berikutnya disetel untuk <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Batal"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Hapus"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Selesai"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Pengubahan mode"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Membuka gembok"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Senyap"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Suara hidup"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Telusuri"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Geser ke atas untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Geser ke bawah untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Geser ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Geser ke kanan untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Pengguna saat ini <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Panggilan darurat"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Lupa Pola?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Pola Salah"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Masukkan kembali kode PUK yang benar. Jika berulang kali gagal, SIM akan dinonaktifkan secara permanen."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Kode PIN tidak cocok"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Terlalu banyak upaya pola"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Untuk membuka kunci, masuk dengan akun Google Anda."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Nama pengguna (email)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Sandi"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Masuk"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Nama pengguna atau sandi tidak valid."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Lupa nama pengguna atau sandi Anda?\nKunjungi "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Memeriksa akun…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Anda telah <xliff:g id="NUMBER_0">%d</xliff:g> kali salah mengetik PIN. \n\nCoba lagi dalam <xliff:g id="NUMBER_1">%d</xliff:g> detik."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Anda telah <xliff:g id="NUMBER_0">%d</xliff:g> kali salah mengetik sandi. \n\nCoba lagi dalam <xliff:g id="NUMBER_1">%d</xliff:g> detik."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Anda telah <xliff:g id="NUMBER_0">%d</xliff:g> kali salah menggambar pola pembuka kunci. \n\nCoba lagi dalam <xliff:g id="NUMBER_1">%d</xliff:g> detik."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Sudah <xliff:g id="NUMBER">%d</xliff:g> kali Anda berupaya membuka kunci ponsel dengan tidak benar. Profil kerja akan dihapus, sehingga menghapus semua data profil."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Anda telah <xliff:g id="NUMBER_0">%d</xliff:g> kali salah menggambar pola pembuka kunci. Setelah <xliff:g id="NUMBER_1">%d</xliff:g> lagi upaya gagal, Anda akan diminta membuka kunci tablet menggunakan akun email.\n\nCoba lagi dalam <xliff:g id="NUMBER_2">%d</xliff:g> detik."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Anda telah <xliff:g id="NUMBER_0">%d</xliff:g> kali salah menggambar pola pembuka kunci. Setelah <xliff:g id="NUMBER_1">%d</xliff:g> lagi upaya gagal, Anda akan diminta membuka kunci ponsel menggunakan akun email.\n\nCoba lagi dalam <xliff:g id="NUMBER_2">%d</xliff:g> detik."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Hapus"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Kode PIN SIM salah. Hubungi operator untuk membuka kunci perangkat."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Kode PIN SIM salah, sisa <xliff:g id="NUMBER">%d</xliff:g> percobaan sebelum Anda harus menghubungi operator untuk membuka kunci perangkat."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Operasi PIN SIM gagal!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Operasi PUK SIM gagal!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Kode Diterima!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Tombol lagu sebelumnya"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Tombol lagu berikutnya"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Tombol jeda"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Tombol putar"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Tombol hentikan"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Tidak ada layanan."</string>
</resources>
diff --git a/packages/Keyguard/res/values-is-rIS/strings.xml b/packages/Keyguard/res/values-is-rIS/strings.xml
index d1d8dc2..4037533 100644
--- a/packages/Keyguard/res/values-is-rIS/strings.xml
+++ b/packages/Keyguard/res/values-is-rIS/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Sláðu inn aðgangsorðið til að opna"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Sláðu inn PIN-númer til að opna"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Rangt PIN-númer."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Til að taka úr lás ýtirðu á valmyndartakkann og síðan 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Hámarksfjölda tilrauna til að opna með andliti náð"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Fullhlaðið"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Í hleðslu"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Tengdu hleðslutækið."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-kortið er læst."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kortið er PUK-læst."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Tekur SIM-kort úr lás…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Græja %2$d af %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Bæta græju við."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Autt"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Opnunarsvæði stækkað."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Opnunarsvæði fellt saman."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Græjan <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Notandaval"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Myndavél"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Margmiðlunarstýringar"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Endurröðun græja hafin."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Endurröðun græja lokið."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Græjunni <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> eytt."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Stækka opnunarsvæði."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Opnun með stroku."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Opnun með mynstri."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Opnun með andliti."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Opnun með PIN-númeri."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-svæði"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"PIN-svæði SIM-korts"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"PUK-svæði SIM-korts"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Hnappur fyrir fyrra lag"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Hnappur fyrir næsta lag"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Hnappur til að gera hlé"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Hnappur til að spila"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Hnappur til að stöðva"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Þumall upp"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Þumall niður"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hjarta"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Taktu úr lás til að halda áfram"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Hætt við ræsingu"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Slepptu <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> til að eyða."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> verður ekki eytt."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Næsti vekjari stilltur á <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Hætta við"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Eyða"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Lokið"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Breyta stillingu"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Taka úr lás"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Myndavél"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Hljóðlaust"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Kveikt á hljóði"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Leita"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Strjúktu upp til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Strjúktu niður til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Strjúktu til vinstri til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Strjúktu til hægri til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Núverandi notandi <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Neyðarsímtal"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Man ekki mynstrið"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Rangt mynstur"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Prófaðu aftur að setja inn rétt PUK-númer. Endurteknar tilraunir gera SIM-kortið varanlega óvirkt."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN-númerin stemma ekki"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Of margar tilraunir til að teikna mynstur"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Skráðu þig inn með Google reikningnum þínum til að opna."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Notandanafn (netfang)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Aðgangsorð"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Skrá inn"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Ógilt notandanafn eða aðgangsorð."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Gleymdirðu notandanafninu eða aðgangsorðinu?\nFarðu á "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Athugar reikninginn…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Þú hefur slegið inn rangt PIN-númer <xliff:g id="NUMBER_0">%d</xliff:g> sinnum. \n\nReyndu aftur eftir <xliff:g id="NUMBER_1">%d</xliff:g> sekúndur."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Þú hefur slegið inn rangt aðgangsorð <xliff:g id="NUMBER_0">%d</xliff:g> sinnum. \n\nReyndu aftur eftir <xliff:g id="NUMBER_1">%d</xliff:g> sekúndur."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Þú hefur teiknað rangt opnunarmynstur <xliff:g id="NUMBER_0">%d</xliff:g> sinnum. \n\nReyndu aftur eftir <xliff:g id="NUMBER_1">%d</xliff:g> sekúndur."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Þú hefur gert <xliff:g id="NUMBER">%d</xliff:g> árangurslausar tilraunir til að opna símann. Vinnusniðið verður fjarlægt, með þeim afleiðingum að öllum gögnum þess verður eytt."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Þú hefur teiknað rangt opnunarmynstur <xliff:g id="NUMBER_0">%d</xliff:g> sinnum. Eftir <xliff:g id="NUMBER_1">%d</xliff:g> árangurslausar tilraunir í viðbót verður þú beðin(n) um að opna spjaldtölvuna með tölvupóstreikningi.\n\n Reyndu aftur eftir <xliff:g id="NUMBER_2">%d</xliff:g> sekúndur."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Þú hefur teiknað rangt opnunarmynstur <xliff:g id="NUMBER_0">%d</xliff:g> sinnum. Eftir <xliff:g id="NUMBER_1">%d</xliff:g> árangurslausar tilraunir í viðbót verður þú beðin(n) um að opna símann með tölvupóstreikningi.\n\n Reyndu aftur eftir <xliff:g id="NUMBER_2">%d</xliff:g> sekúndur."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Fjarlægja"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Rangt PIN-númer SIM-korts. Þú þarft núna að hafa samband við símafyrirtækið þitt til að taka tækið úr lás."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Rangt PIN-númer SIM-korts. Þú átt <xliff:g id="NUMBER">%d</xliff:g> tilraun eftir áður en þú þarft að hafa samband við símafyrirtækið þitt til að taka tækið úr lás."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"PIN-aðgerð SIM-korts mistókst!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"PUK-aðgerð SIM-korts mistókst!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Númer samþykkt!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Hnappur fyrir fyrra lag"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Hnappur fyrir næsta lag"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Hnappur til að gera hlé"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Hnappur til að spila"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Hnappur til að stöðva"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Ekkert símasamband."</string>
</resources>
diff --git a/packages/Keyguard/res/values-it/strings.xml b/packages/Keyguard/res/values-it/strings.xml
index ac7de84..3b8fdd7 100644
--- a/packages/Keyguard/res/values-it/strings.xml
+++ b/packages/Keyguard/res/values-it/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Inserisci password per sbloccare"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Inserisci PIN per sbloccare"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Codice PIN errato."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Per sbloccare, premi Menu, poi 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Numero massimo di tentativi di Sblocco col sorriso superato"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Carico"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"In carica"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Collega il caricabatterie."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"La SIM è bloccata."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La SIM è bloccata tramite PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Sblocco scheda SIM..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d di %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Aggiungi widget."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vuoto"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Area di sblocco estesa."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Area di sblocco compressa."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Selettore utente"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Fotocamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Controlli media"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Riordino dei widget iniziato."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Riordino dei widget terminato."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> eliminato."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Espandi area di sblocco."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Sblocco con scorrimento."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Sblocco con sequenza."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Sblocco col sorriso."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Sblocco con PIN."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Area PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Area PIN SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Area PUK SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Pulsante traccia precedente"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Pulsante traccia successiva"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pulsante Pausa"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Pulsante Riproduci"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Pulsante di arresto"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Mi piace"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Pollice giù"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Cuore"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Sblocca per continuare"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Avvio annullato"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Rilascia <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> per eliminarlo."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> non sarà eliminato."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Prossima sveglia impostata a: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Annulla"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Canc"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Fine"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Cambio modalità"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Maiuscolo"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Invio"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Sblocca"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Fotocamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Silenzioso"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Audio attivato"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Ricerca"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Su per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Giù per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"A sinistra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"A destra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Utente corrente <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Chiamata di emergenza"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Sequenza dimenticata"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Sequenza sbagliata"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Inserisci di nuovo il codice PUK corretto. Ripetuti tentativi comportano la disattivazione definitiva della scheda SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"I codici PIN non corrispondono"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Troppi tentativi di inserimento della sequenza"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Per sbloccare, accedi con il tuo account Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Nome utente (email)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Password"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Accedi"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Nome utente o password non validi."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Hai dimenticato il nome utente o la password?\nVisita "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Controllo account…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Hai digitato il tuo PIN <xliff:g id="NUMBER_0">%d</xliff:g> volte in modo errato. \n\nRiprova tra <xliff:g id="NUMBER_1">%d</xliff:g> secondi."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Hai digitato la tua password <xliff:g id="NUMBER_0">%d</xliff:g> volte in modo errato. \n\nRiprova tra <xliff:g id="NUMBER_1">%d</xliff:g> secondi."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"<xliff:g id="NUMBER_0">%d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. \n\nRiprova tra <xliff:g id="NUMBER_1">%d</xliff:g> secondi."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Hai tentato di sbloccare il telefono senza riuscirci per <xliff:g id="NUMBER">%d</xliff:g> volte. Il profilo di lavoro verrà rimosso e verranno quindi eliminati tutti i dati associati."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"<xliff:g id="NUMBER_0">%d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. Dopo altri <xliff:g id="NUMBER_1">%d</xliff:g> tentativi falliti, ti verrà chiesto di sbloccare il tablet con un account email.\n\n Riprova tra <xliff:g id="NUMBER_2">%d</xliff:g> secondi."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"<xliff:g id="NUMBER_0">%d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. Dopo altri <xliff:g id="NUMBER_1">%d</xliff:g> tentativi falliti, ti verrà chiesto di sbloccare il telefono con un account email.\n\n Riprova tra <xliff:g id="NUMBER_2">%d</xliff:g> secondi."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Rimuovi"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Codice PIN della SIM errato. Devi contattare l\'operatore per sbloccare il dispositivo."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Codice PIN della SIM errato. Hai ancora <xliff:g id="NUMBER">%d</xliff:g> tentativo a disposizione, dopodiché dovrai contattare l\'operatore per sbloccare il dispositivo."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Operazione con PIN della SIM non riuscita."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Operazione con PUK della SIM non riuscita."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Codice accettato."</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Pulsante traccia precedente"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Pulsante traccia successiva"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pulsante Pausa"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Pulsante Riproduci"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Pulsante di arresto"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Nessun servizio."</string>
</resources>
diff --git a/packages/Keyguard/res/values-iw/strings.xml b/packages/Keyguard/res/values-iw/strings.xml
index 2d8f1bf..3f66c83 100644
--- a/packages/Keyguard/res/values-iw/strings.xml
+++ b/packages/Keyguard/res/values-iw/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"הקלד סיסמה לביטול הנעילה"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"הקלד קוד PIN לביטול הנעילה"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"קוד PIN שגוי"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"כדי לבטל את הנעילה, לחץ על \'תפריט\' ולאחר מכן על 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"חרגת ממספר הניסיונות המרבי של זיהוי פנים"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"טעון"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"טוען"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"חבר את המטען."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"כרטיס ה-SIM נעול."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"כרטיס SIM נעול באמצעות PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"מבטל נעילה של כרטיס SIM…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d מתוך %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"הוסף Widget."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ריק"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"אזור ביטול הנעילה הורחב."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"אזור ביטול הנעילה כווץ."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"בוחר משתמשים"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"מצלמה"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"פקדי מדיה"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"סידור מחדש של Widgets התחיל."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"סידור מחדש של Widgets הסתיים."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> נמחק."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"הרחב את אזור ביטול הנעילה."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"ביטול נעילה באמצעות הסטה."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ביטול נעילה באמצעות ציור קו."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ביטול נעילה באמצעות זיהוי פנים."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ביטול נעילה באמצעות מספר PIN."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"אזור עבור קוד PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"אזור עבור קוד PIN של SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"אזור עבור קוד PUK של SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"לחצן \'הרצועה הקודמת\'"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"לחצן \'הרצועה הבאה\'"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"לחצן \'השהה\'"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"לחצן \'הפעל\'"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"לחצן \'הפסק\'"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"אהבתי"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"לא אהבתי"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"לב"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"בטל נעילה כדי להמשיך"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ההפעלה בוטלה"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"שחרר את <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> למחיקה."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> לא יימחק."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"ההתראה הבאה נקבעה לשעה <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"אבג"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"ביטול"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"מחק"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"סיום"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"שינוי מצב"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"בטל נעילה"</string>
- <string name="description_target_camera" msgid="969071997552486814">"מצלמה"</string>
- <string name="description_target_silent" msgid="893551287746522182">"שקט"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"הקול פועל"</string>
- <string name="description_target_search" msgid="3091587249776033139">"חיפוש"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"הסט למעלה כדי להציג <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"הסט למטה כדי להציג <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"הסט שמאלה כדי להציג <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"הסט ימינה כדי להציג <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"המשתמש הנוכחי <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"שיחת חירום"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"שכחת את הקו"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"קו ביטול נעילה שגוי"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"הזן מחדש את קוד PUK הנכון. ניסיונות חוזרים ישביתו לצמיתות את כרטיס ה-SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"קודי ה-PIN אינם תואמים"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ניסיונות רבים מדי לשרטוט קו ביטול נעילה."</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"כדי לבטל את הנעילה, היכנס באמצעות חשבון Google שלך."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"שם משתמש (אימייל)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"סיסמה"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"היכנס"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"שם משתמש או סיסמה לא חוקיים."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"שכחת את שם המשתמש או הסיסמה?\nבקר בכתובת "<b>"google.com/accounts/recovery"</b></string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"בודק חשבון…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"הקלדת מספר PIN שגוי <xliff:g id="NUMBER_0">%d</xliff:g> פעמים. \n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"הקלדת סיסמה שגויה <xliff:g id="NUMBER_0">%d</xliff:g> פעמים.\n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"שרטטת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%d</xliff:g> פעמים. \n\nנסה שוב בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"ניסית לבטל את נעילת הטלפון <xliff:g id="NUMBER">%d</xliff:g> פעמים באופן שגוי. פרופיל העבודה יוסר וכתוצאה מכך כל נתוני הפרופיל יימחקו."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"שרטטת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטאבלט באמצעות חשבון אימייל.\n\nנסה שוב בעוד <xliff:g id="NUMBER_2">%d</xliff:g> שניות."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"שרטטת את קו ביטול הנעילה באופן שגוי <xliff:g id="NUMBER_0">%d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות כושלים נוספים, תתבקש לבטל את נעילת הטלפון באמצעות חשבון אימייל.\n\nנסה שוב בעוד <xliff:g id="NUMBER_2">%d</xliff:g> שניות."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"הסר"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"מספר PIN שגוי של כרטיס ה-SIM. עליך ליצור כעת קשר עם הספק על מנת לבטל את נעילת המכשיר."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"מספר PIN שגוי של כרטיס ה-SIM. נותר לך ניסיון <xliff:g id="NUMBER">%d</xliff:g> נוסף לפני שיהיה עליך ליצור קשר עם הספק על מנת לבטל את נעילת המכשיר."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"פעולת מספר ה-PIN של כרטיס ה-SIM נכשלה!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"פעולת קוד ה-PUK של כרטיס ה-SIM נכשלה!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"הקוד התקבל!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"לחצן \'הרצועה הקודמת\'"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"לחצן \'הרצועה הבאה\'"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"לחצן \'השהה\'"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"לחצן \'הפעל\'"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"לחצן \'הפסק\'"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"אין קליטה."</string>
</resources>
diff --git a/packages/Keyguard/res/values-ja/strings.xml b/packages/Keyguard/res/values-ja/strings.xml
index 39dc52e..1628099 100644
--- a/packages/Keyguard/res/values-ja/strings.xml
+++ b/packages/Keyguard/res/values-ja/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"ロックを解除するにはパスワードを入力"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"ロックを解除するにはPINを入力"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"PINコードが正しくありません。"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"MENU、0キーでロック解除"</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"フェイスアンロックの最大試行回数を超えました"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"充電完了"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"充電中"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"充電してください。"</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIMカードはロックされています。"</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIMカードはPUKでロックされています。"</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIMカードをロック解除しています…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。ウィジェット%2$d/%3$d。"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ウィジェットを追加します。"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"なし"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"ロック解除エリアを拡大しました。"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"ロック解除エリアを縮小しました。"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>ウィジェットです。"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"ユーザー切り替え"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"カメラ"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"メディアコントロール"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"ウィジェットの並べ替えを開始しました。"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"ウィジェットの並べ替えを終了しました。"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>ウィジェットを削除しました。"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ロック解除エリアを拡大します。"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"スライドロックを解除します。"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"パターンロックを解除します。"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"フェイスアンロックを行います。"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PINロックを解除します。"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PINエリア"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PINエリア"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUKエリア"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"前のトラックボタン"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"次のトラックボタン"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"一時停止ボタン"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"再生ボタン"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"停止ボタン"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"グッド"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"イマイチ"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"ハート"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"続行するにはロックを解除してください"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"起動をキャンセルしました"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"削除するには<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>をドロップしてください。"</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>は削除されません。"</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"次のアラームは<xliff:g id="ALARM">%1$s</xliff:g>に設定されました"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"キャンセル"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"削除"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"完了"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"モードを変更"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"ロックを解除"</string>
- <string name="description_target_camera" msgid="969071997552486814">"カメラ"</string>
- <string name="description_target_silent" msgid="893551287746522182">"マナーモード"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"サウンドON"</string>
- <string name="description_target_search" msgid="3091587249776033139">"検索します"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"上にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string>
- <string name="description_direction_down" msgid="5087739728639014595">"下にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string>
- <string name="description_direction_left" msgid="7207478719805562165">"左にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string>
- <string name="description_direction_right" msgid="8034433242579600980">"右にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string>
- <string name="user_switched" msgid="3768006783166984410">"現在のユーザーは<xliff:g id="NAME">%1$s</xliff:g>です。"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"緊急通報"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"パターンを忘れた場合"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"パターンが正しくありません"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"正しいPUKコードを再入力してください。誤入力を繰り返すと、SIMが永久に無効になるおそれがあります。"</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PINコードが一致しません"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"パターンの入力を所定の回数以上間違えました。"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"ロックを解除するにはGoogleアカウントでログインしてください。"</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"ユーザー名(メール)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"パスワード"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"ログイン"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"ユーザー名またはパスワードが無効です。"</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ユーザー名またはパスワードを忘れた場合は\n "<b>"google.com/accounts/recovery"</b>" にアクセスしてください。"</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"アカウントをチェックしています…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PINの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。\n\n<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度お試しください。"</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"パスワードの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。\n\n<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度お試しください。"</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。\n\n<xliff:g id="NUMBER_1">%d</xliff:g>秒後にもう一度お試しください。"</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"携帯電話のロック解除に<xliff:g id="NUMBER">%d</xliff:g>回失敗しました。ワークプロフィールが削除され、プロフィールのデータがすべて削除されます。"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、タブレットのロック解除にメールアカウントが必要になります。\n\n<xliff:g id="NUMBER_2">%d</xliff:g>秒後にもう一度お試しください。"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、携帯端末のロック解除にメールアカウントが必要になります。\n\n<xliff:g id="NUMBER_2">%d</xliff:g>秒後にもう一度お試しください。"</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"削除"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM PINコードが無効です。お使いの端末をロック解除するには携帯通信会社にお問い合わせいただく必要があります。"</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"SIM PINコードが無効です。入力できるのはあと<xliff:g id="NUMBER">%d</xliff:g>回です。この回数を超えると、お使いの端末をロック解除するのに携帯通信会社にお問い合わせいただく必要があります。"</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN操作に失敗しました。"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK操作に失敗しました。"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"コードが承認されました。"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"前のトラックボタン"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"次のトラックボタン"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"一時停止ボタン"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"再生ボタン"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"停止ボタン"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"通信サービスはありません。"</string>
</resources>
diff --git a/packages/Keyguard/res/values-ka-rGE/strings.xml b/packages/Keyguard/res/values-ka-rGE/strings.xml
index ccd6bea..6060ba7 100644
--- a/packages/Keyguard/res/values-ka-rGE/strings.xml
+++ b/packages/Keyguard/res/values-ka-rGE/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"განსაბლოკად აკრიფეთ პაროლი"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"განსაბლოკად აკრიფეთ PIN კოდი"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"არასწორი PIN კოდი."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"განბლოკვისათვის დააჭირეთ მენიუს და შემდეგ 0-ს."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"სახის ამოცნობით განბლოკვის მცდელობამ დაშვებულ რაოდენობას გადააჭარბა"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"დამუხტულია"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"მიმდინარეობს დატენვა"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"შეაერთეთ დამტენი."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM ბარათი დაბლოკილია."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM ბარათი დაბლოკილია PUK კოდით."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"მიმდინარეობს SIM ბარათის განბლოკვა…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ვიჯეტი %2$d of %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ვიჯეტის დამატება"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ცარიელი"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"განბლოკვის სივრცე გაშლილია."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"განბლოკვის სივრცე ჩაკეცილია."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ვიჯეტი."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"მომხმარებლის ამომრჩეველი"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"კამერა"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"მედიის მართვის ელემენტები"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"დაიწყო ვიჯეტის ხელახლა განლაგება."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"ვიჯეტების გადახარისხება დასრულებულია."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"ვიჯეტი <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> წაიშალა."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"განბლოკვის სივრცის გაშლა."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"გასრიალებით განბლოკვა"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"განბლოკვა ნიმუშით."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"განბლოკვა სახით"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"განბლოკვა Pin-ით."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-ის არე"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM-ის PIN-ის არე"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM-ის PUK-ის არე"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"წინა ჩანაწერის ღილაკი"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"შემდეგი ჩანაწერის ღილაკი"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"პაუზის ღილაკი"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"დაკვრის ღილაკი"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stop ღილაკი"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"ზევით აწეული ცერი"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ქვევით დახრილი ცერი"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"გული"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"განბლოკეთ გასაგრძელებლად"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"გამოძახება გაუქმდა"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ჩააგდეთ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> წასაშლელად."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> არ წაიშლება."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"შემდეგი მაღვიძარა დაყენებულია <xliff:g id="ALARM">%1$s</xliff:g>-ზე"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"გაუქმება"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"წაშლა"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"დასრულდა"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"რეჟიმის შეცვლა"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift-"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"შეყვანა"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"განბლოკვა"</string>
- <string name="description_target_camera" msgid="969071997552486814">"კამერა"</string>
- <string name="description_target_silent" msgid="893551287746522182">"უხმო"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"ხმის ჩართვა"</string>
- <string name="description_target_search" msgid="3091587249776033139">"ძიება"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"გაასრიალეთ ზემოთ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"გაასრიალეთ ქვემოთ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"გაასრიალეთ მარცხნივ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"გაასრიალეთ მარჯვნივ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string>
- <string name="user_switched" msgid="3768006783166984410">"ამჟამინდელი მომხმარებელი <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"გადაუდებელი დახმარების ზარი"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"დაგავიწყდათ ნიმუში"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"არასწორი ნიმუში"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"ხელახლა შეიყვანეთ სწორი PUK კოდი. რამდენიმე წარუმატებელი მცდელობა გამოიწვევს SIM ბარათის დაბლოკვას."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN კოდები არ ემთხვევა"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ნახატი ნიმუშის ძალიან ბევრი მცდელობა"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"განბლოკვისთვის გაიარეთ ავტორიზაცია თქვენი Google ანგარიშით."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"მომხმარებლის სახელი (ელფოსტა)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"პაროლი"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"შესვლა"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"არასწორი სახელი, ან პაროლი."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"დაგავიწყდათ მომხმარებლის სახელი და პაროლი?\nეწვიეთ "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"მიმდინარეობს ანგარიშის შემოწმება…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"თქვენ <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ არასწორად შეიყვანეთ PIN კოდი. \n\nსცადეთ ხელახლა <xliff:g id="NUMBER_1">%d</xliff:g> წამში."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"თქვენ <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ არასწორად დაბეჭდეთ თქვენი პაროლი. \n\nხელახლა სცადეთ <xliff:g id="NUMBER_1">%d</xliff:g> წამში."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"თქვენ <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ დახატეთ განბლოკვის ნიმუში. \n\nსცადეთ ხელახლა <xliff:g id="NUMBER_1">%d</xliff:g> წამში."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"თქვენ არასწორად სცადეთ ტელეფონის განბლოკვა <xliff:g id="NUMBER">%d</xliff:g> ჯერ. სამუშაო პროფილი ამოიშლება, რაც წაშლის პროფილის მთლიან მონაცემს."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"თქვენ არასწორად დახატეთ თქვენი განბლოკვის ნიმუში <xliff:g id="NUMBER_0">%d</xliff:g> ჯერ. კიდევ <xliff:g id="NUMBER_1">%d</xliff:g> წარუმატებელი ცდის შემდეგ მოგთხოვთ ტაბლეტის განბლოკვას ელფოსტის ანგარიშის გამოყენებით.\n\n ხელახლა სცადეთ <xliff:g id="NUMBER_2">%d</xliff:g> წამში."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"თქვენ არასწორად დახატეთ თქვენი განბლოკვის ნიმუში <xliff:g id="NUMBER_0">%d</xliff:g>-ჯერ. კიდევ <xliff:g id="NUMBER_1">%d</xliff:g> წარუმატებელი ცდის შემდეგ, დაგჭირდებათ თქვენი ტელეფონის განბლოკვა ელფოსტის ანგარიშის გამოყენებით.\n\n ხელახლა სცადეთ <xliff:g id="NUMBER_2">%d</xliff:g> წამში."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ამოშლა"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM-ის არასწორი PIN კოდი. თქვენ ახლა მოგიწევთ მოწყობილობის განსაბლოკად მიმართოთ ოპერატორს."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"SIM-ის არასწორი PIN კოდი. თქვენ დაგრჩათ <xliff:g id="NUMBER">%d</xliff:g> მცდელობა, სანამ მოგიწევთ თქვენი მოწყობილობის განსაბლოკად ოპერატორთან დაკავშირება."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN ოპერაცია ჩაიშალა!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK ოპერაცია ჩაიშალა!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"კოდი მიღებულია!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"წინა ჩანაწერზე გადასვლის ღილაკი"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"შემდეგი ჩანაწერის ღილაკი"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"პაუზის ღილაკი"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"დაკვრის ღილაკი"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"შეჩერების ღილაკი"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"არ არის სერვისი."</string>
</resources>
diff --git a/packages/Keyguard/res/values-kk-rKZ/strings.xml b/packages/Keyguard/res/values-kk-rKZ/strings.xml
index 1663ca0..460b923 100644
--- a/packages/Keyguard/res/values-kk-rKZ/strings.xml
+++ b/packages/Keyguard/res/values-kk-rKZ/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Бекітпесін ашу үшін құпия сөзді теріңіз"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Бекітпесін ашу үшін PIN кодын теріңіз"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Қате PIN код"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Бекітпесін ашу үшін Мәзір, одан кейін 0 пернесін түртіңіз."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Бет-әлпет арқылы ашу әрекеттері анықталған шегінен асып кетті"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Зарядталған"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Зарядтауда"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Зарядтау құрылғысын жалғаңыз."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM картасы бекітулі."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM картасының PUK коды бекітілген."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM картасының бекітпесін ашуда…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %2$d виджет, барлығы %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Виджет қосу."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Бос"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Ашу аймағы кеңейтілді."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Ашу аймағы қирады."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> виджеті."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Пайдаланушы таңдаушы"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Камера"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Meдиа басқарулары"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Виджетті қайта реттеу басталды."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Виджетті қайта реттеу аяқталды."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> виджеті жойылды."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Ашу аймағын кеңейту."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Сырғыту арқылы ашу."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Кескін арқылы ашу."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Бет-әлпет арқылы ашу."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin арқылы ашу."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN аумағы"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN аумағы"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK аумағы"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Алдыңғы жол түймесі"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Келесі жол түймесі"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Кідірту түймесі"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Ойнату түймесі"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Тоқтату түймесі"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Ұнайды"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Ұнамайды"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Жүрек"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Жалғастыру үшін ашу"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Қосу тоқтатылды"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> жою үшін тастаңыз"</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> жойылмайды."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Келесі дабыл <xliff:g id="ALARM">%1$s</xliff:g> уақытына орнатылған"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Өшіру"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Жою"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Орындалды"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Режим өзгерту"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Енгізу"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Бекітпесін ашу"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Камера"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Үнсіз"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Дыбыс қосулы"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Іздеу"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін жоғары сырғыту."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін төмен сырғыту."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін солға сырғыту."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін оңға жылжыту."</string>
- <string name="user_switched" msgid="3768006783166984410">"Ағымдағы пайдаланушы <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Төтенше қоңырау"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Кескінді ұмытып қалу"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Қате кескін"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Дұрыс PUK кодын қайта енгізіңіз. Әрекеттерді қайталау SIM картасының істен шығуына себеп болады."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN коды сәйкес емес."</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Тым көп кескін әрекеттері"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Ашу үшін Google есептік жазбасы арқылы кіріңіз."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Пайдаланушы атауы (эл. пошта)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Кілтсөз"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Кіру"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Пайдаланушы атауы немесе кілтсөз жарамсыз."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Пайдаланушы атауын немесе кілтсөзді ұмытып қалдыңыз ба?\n"<b>"google.com/accounts/recovery"</b>" веб-сайтына кіріңіз."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Есептік жазбаны тексеруде…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PIN кодты <xliff:g id="NUMBER_0">%d</xliff:g> рет қате тердіңіз. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> секундтан кейін қайта әркеттеніңіз."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Кілсөзді <xliff:g id="NUMBER_0">%d</xliff:g> рет қате тердіңіз. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> секундтан кейін қайта әрекеттеніңіз."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Бекітпесін ашу кескінін <xliff:g id="NUMBER_0">%d</xliff:g> қате сыздыңыз. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> секундтан кейін қайта әркеттеніңіз."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Телефон бекітпесін ашуға <xliff:g id="NUMBER">%d</xliff:g> рет дұрыс емес әрекет жасадыңыз. Жұмыс профилі жойылып, бүкіл профиль деректері жойылады."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Бекітпені ашу кескінін <xliff:g id="NUMBER_0">%d</xliff:g> рет қате сыздыңыз. After <xliff:g id="NUMBER_1">%d</xliff:g> сәтсіз әрекеттен кейін планшетіңізді есептік жазба арқылы ашу өтінішін аласыз.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> секундтан кейін қайта әрекеттеніңіз."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Бекітпені ашу кескінін <xliff:g id="NUMBER_0">%d</xliff:g> рет қате сыздыңыз. <xliff:g id="NUMBER_1">%d</xliff:g> сәтсіз әрекеттен кейін телефоныңызды есептік жазба арқылы ашу өтінішін аласыз. \n\n <xliff:g id="NUMBER_2">%d</xliff:g> секундтан кейін қайта әрекеттеніңіз."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Алып тастау"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM PIN коды дұрыс емес, құрылғыны ашу үшін қызмет жабдықтаушыға хабарласаңыз."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"SIM PIN коды дұрыс емес, құрылғыны жабу өтінішімен жабдықтаушыға хабарласуға дейін <xliff:g id="NUMBER">%d</xliff:g> рет әрекеттену мүмкіндігіңіз бар."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN жұмысы орындалмады!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK жұмысы орындалмады!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Код қабылданды!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Алдыңғы жол түймесі"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Келесі жол түймесі"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Кідірту түймесі"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Ойнату түймесі"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Тоқтату түймесі"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Қызмет көрсетілмейді."</string>
</resources>
diff --git a/packages/Keyguard/res/values-km-rKH/strings.xml b/packages/Keyguard/res/values-km-rKH/strings.xml
index f4a73a8..049a215 100644
--- a/packages/Keyguard/res/values-km-rKH/strings.xml
+++ b/packages/Keyguard/res/values-km-rKH/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"បញ្ចូលពាក្យសម្ងាត់ ដើម្បីដោះសោ"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"បញ្ចូលកូដ PIN ដើម្បីដោះសោ"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"កូដ PIN មិនត្រឹមត្រូវ។"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"ដើម្បីដោះសោ ចុចម៉ឺនុយ បន្ទាប់មក 0 ។"</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"បានលើសការព្យាយាមដោះសោតាមទម្រង់មុខ"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"បានបញ្ចូលពេញ"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"កំពុងបញ្ចូលថ្ម"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"ភ្ជាប់ឧបករណ៍បញ្ចូលថ្ម។"</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"ស៊ីមកាតជាប់សោ។"</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ស៊ីមកាតជាប់កូដ PUK ។"</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"កំពុងដោះសោស៊ីមកាត..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ធាតុក្រាហ្វិក %2$d នៃ %3$d ។"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"បន្ថែមធាតុក្រាហ្វិក។"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ទទេ"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"បានពង្រីកផ្ទៃដោះសោ។"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"បានបង្រួមផ្ទៃដោះសោ។"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ធាតុក្រាហ្វិក។"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"ឧបករណ៍ជ្រើសអ្នកប្រើ"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"ម៉ាស៊ីនថត"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"ពិនិត្យមេឌៀ"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"បានចាប់ផ្ដើមតម្រៀបធាតុក្រាហ្វិកឡើងវិញ។"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"បានបញ្ចប់ការបង្ហាញធាតុក្រាហ្វិក។"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"បានលុបធាតុក្រាហ្វិក <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ។"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ពង្រីកតំបន់ដោះសោ។"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"រុញដោះសោ។"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"លំនាំដោះសោ។"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ដោះសោតាមទម្រង់មុខ។"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"កូដ PIN ដោះសោ។"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"ប្រអប់លេខសម្ងាត់"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"ប្រអប់លេខសម្ងាត់ស៊ីម"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"ប្រអប់ PUK ស៊ីម"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"ប៊ូតុងបទមុន"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"ប៊ូតុងបទបន្ទាប់"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ប៊ូតុងផ្អាក"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ប៊ូតុងចាក់"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ប៊ូតុងបញ្ឈប់"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"មេដៃឡើង"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"មេដៃចុះ"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"បេះដូង"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ដោះសោ ដើម្បីបន្ត"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"បានបោះបង់ការចាប់ផ្ដើម"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ទម្លាក់ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ដើម្បីលុប។"</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> នឹងមិនត្រូវបានលុប។"</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"ការជូនដំណឹងបន្ទាប់កំណត់សម្រាប់ <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"បោះបង់"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"លុប"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"រួចរាល់"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ប្ដូររបៀប"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"ដោះសោ"</string>
- <string name="description_target_camera" msgid="969071997552486814">"ម៉ាស៊ីនថត"</string>
- <string name="description_target_silent" msgid="893551287746522182">"ស្ងាត់"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"បើកសំឡេង"</string>
- <string name="description_target_search" msgid="3091587249776033139">"ស្វែងរក"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"រុញឡើងលើដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
- <string name="description_direction_down" msgid="5087739728639014595">"រុញចុះក្រោមសម្រាប់ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
- <string name="description_direction_left" msgid="7207478719805562165">"រុញទៅឆ្វេងដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
- <string name="description_direction_right" msgid="8034433242579600980">"រុញទៅស្ដាំដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
- <string name="user_switched" msgid="3768006783166984410">"អ្នកប្រើបច្ចុប្បន្ន <xliff:g id="NAME">%1$s</xliff:g> ។"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"ការហៅពេលអាសន្ន"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ភ្លេចលំនាំ"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"លំនាំមិនត្រឹមត្រូវ"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"បញ្ចូលកូដ PUK ម្ដងទៀត។ ការព្យាយាមដដែលច្រើនដឹងនឹងបិទស៊ីមកាតជាអចិន្ត្រៃយ៍។"</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"កូដ PIN មិនដូចគ្នា"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ព្យាយាមលំនាំច្រើនពេក"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"ដើម្បីដោះសោ ចូលក្នុងគណនី Google ។"</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"ឈ្មោះអ្នកប្រើ (អ៊ីមែល)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"ពាក្យសម្ងាត់"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"ចូល"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"ឈ្មោះអ្នកប្រើ ឬពាក្យសម្ងាត់មិនត្រឹមត្រូវ។"</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ភ្លេចឈ្មោះអ្នកប្រើ ឬពាក្យសម្ងាត់របស់អ្នក?\nមើល "<b>"google.com/accounts/recovery"</b>" ។"</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"កំពុងពិនិត្យមើលគណនី..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"អ្នកបានបញ្ចូលកូដ PIN របស់អ្នកមិនត្រឹមត្រូវចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។\n\n ព្យាយាមម្ដងទៀតក្នុងរយៈពេល <xliff:g id="NUMBER_1">%d</xliff:g> វិនាទី។"</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"អ្នកបានបញ្ចូលពាក្យសម្ងាត់មិនត្រឹមត្រូវ <xliff:g id="NUMBER_0">%d</xliff:g> ដង។\n\nព្យាយាមម្ដងទៀតក្នុងរយៈពេល <xliff:g id="NUMBER_1">%d</xliff:g> វិនាទី។"</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"អ្នកបានគូរលំនាំដោះសោរបស់អ្នកមិនត្រឹមត្រូវចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។\n\nព្យាយាមម្ដងទៀតក្នុងរយៈពេល <xliff:g id="NUMBER_1">%d</xliff:g> វិនាទី។"</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"អ្នកបានព្យាយាមដោះសោមិនត្រឹមត្រូវលើទូរស័ព្ទរបស់អ្នក <xliff:g id="NUMBER">%d</xliff:g> ដង។ ប្រវត្តិរូបការងាររបស់អ្នកនឹងត្រូវបានដកចេញ ដែលវានឹងលុបទិន្នន័យប្រវត្តិរូបទាំងអស់របស់អ្នក។"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"អ្នកបានគូរលំនាំដោះសោមិនត្រឹមត្រូវ <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ បន្ទាប់ពីការព្យាយាម <xliff:g id="NUMBER_1">%d</xliff:g> ដងមិនជោគជ័យ អ្នកនឹងត្រូវបានស្នើឲ្យដោះសោកុំព្យូទ័របន្ទះរបស់អ្នក ដោយប្រើគណនីអ៊ីមែល។\n\n ព្យាយាមម្ដងទៀតក្នុងរយៈពេល <xliff:g id="NUMBER_2">%d</xliff:g> វិនាទី។"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"អ្នកបានគូរលំនាំដោះសោរបស់អ្នកមិនត្រឹមត្រូវចំនួន <xliff:g id="NUMBER_0">%d</xliff:g> ដង។ បន្ទាប់ពីការព្យាយាមមិនជោគជ័យច្រើនជាង <xliff:g id="NUMBER_1">%d</xliff:g> ដង អ្នកនឹងត្រូវបានស្នើឲ្យដោះសោទូរស័ព្ទរបស់អ្នកដោយប្រើគណនីអ៊ីមែល។\n\n ព្យាយាមម្ដងទៀតក្នុងរយៈពេល <xliff:g id="NUMBER_2">%d</xliff:g> វិនាទី។"</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"លុបចេញ"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"លេខកូដ PIN ស៊ីមមិនត្រឹមត្រូវ អ្នកត្រូវទាក់ទងក្រុមហ៊ុនបញ្ជូនរបស់អ្នកឥឡូវនេះ ដើម្បីដោះសោឧបករណ៍របស់អ្នក។"</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"លេខកូដ PIN ស៊ីមមិនត្រឹមត្រូវ, អ្នកមាន <xliff:g id="NUMBER">%d</xliff:g> ការព្យាយាមដែលនៅសល់មុនពេលអ្នកត្រូវទាក់ទងក្រុមហ៊ុនបញ្ជូនរបស់អ្នក ដើម្បីដោះសោឧបករណ៍របស់អ្នក។"</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"បានបរាជ័យក្នុងការប្រតិបត្តិលេខកូដ PIN ស៊ីម!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"បានបរាជ័យក្នុងការប្រតិបត្តិលេខកូដ PUK ស៊ីម!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"បានទទួលយកលេខកូដ!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"ប៊ូតុងបទមុន"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"ប៊ូតុងបទបន្ទាប់"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"ប៊ូតុងផ្អាក"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"ប៊ូតុងចាក់"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"ប៊ូតុងបញ្ឈប់"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"គ្មានសេវា"</string>
</resources>
diff --git a/packages/Keyguard/res/values-kn-rIN/strings.xml b/packages/Keyguard/res/values-kn-rIN/strings.xml
index 6e2b4d0..02075f5 100644
--- a/packages/Keyguard/res/values-kn-rIN/strings.xml
+++ b/packages/Keyguard/res/values-kn-rIN/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಪಾಸ್ವರ್ಡ್ ಟೈಪ್ ಮಾಡಿ"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಪಿನ್ ಟೈಪ್ ಮಾಡಿ"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ತಪ್ಪಾದ ಪಿನ್ ಕೋಡ್."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"ಅನ್ಲಾಕ್ ಮಾಡಲು, ಮೆನು ನಂತರ 0 ಒತ್ತಿರಿ."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"ಗರಿಷ್ಠ ಫೇಸ್ ಅನ್ಲಾಕ್ ಪ್ರಯತ್ನಗಳು ಮೀರಿವೆ"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"ಚಾರ್ಜ್ ಆಗಿದೆ"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"ನಿಮ್ಮ ಚಾರ್ಜರ್ ಸಂಪರ್ಕಗೊಳಿಸಿ."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"ಸಿಮ್ ಕಾರ್ಡ್ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ಸಿಮ್ ಕಾರ್ಡ್ ಅನ್ನು PUK-ಲಾಕ್ ಮಾಡಲಾಗಿದೆ."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"ಸಿಮ್ ಕಾರ್ಡ್ ಅನ್ಲಾಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s.%3$d ರಲ್ಲಿ %2$d ವಿಜೆಟ್."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ವಿಜೆಟ್ ಸೇರಿಸು."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ಖಾಲಿ"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"ಅನ್ಲಾಕ್ ಪ್ರದೇಶವನ್ನು ವಿಸ್ತರಿಸಲಾಗಿದೆ."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"ಅನ್ಲಾಕ್ ಪ್ರದೇಶವನ್ನು ಸಂಕುಚಿಸಲಾಗಿದೆ."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ವಿಜೆಟ್."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"ಬಳಕೆದಾರ ಆಯ್ಕೆಗಾರ"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"ಕ್ಯಾಮರಾ"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"ಮೀಡಿಯಾ ನಿಯಂತ್ರಣಗಳು"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"ವಿಜೆಟ್ ಮರುಕ್ರಮ ಪ್ರಾರಂಭಗೊಂಡಿದೆ."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"ವಿಜೆಟ್ ಮರುಕ್ರಮ ಕೊನೆಗೊಂಡಿದೆ."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ವಿಜೆಟ್ ಅಳಿಸಲಾಗಿದೆ."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ಅನ್ಲಾಕ್ ಪ್ರದೇಶವನ್ನು ವಿಸ್ತರಿಸು."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"ಸ್ಲೈಡ್ ಅನ್ಲಾಕ್."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ನಮೂನೆ ಅನ್ಲಾಕ್."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ಮುಖದ ಅನ್ಲಾಕ್."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ಪಿನ್ ಅನ್ಲಾಕ್."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"ಪಿನ್ ಪ್ರದೇಶ"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"ಸಿಮ್ ಪಿನ್ ಪ್ರದೇಶ"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"ಸಿಮ್ PUK ಪ್ರದೇಶ"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"ಹಿಂದಿನ ಹಾಡಿನ ಬಟನ್"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"ಮುಂದಿನ ಹಾಡಿನ ಬಟನ್"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ವಿರಾಮ ಬಟನ್"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ಪ್ಲೇ ಬಟನ್"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ನಿಲ್ಲಿಸು ಬಟನ್"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"ಥಂಬ್ಸ್ ಅಪ್"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ಥಂಬ್ಸ್ ಡೌನ್"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"ಹೃದಯ"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ಮುಂದುವರಿಸಲು ಅನ್ಲಾಕ್ ಮಾಡಿ"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ಪ್ರಾರಂಭವನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ಅಳಿಸಲು <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ಡ್ರಾಪ್ ಮಾಡಿ."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ಅನ್ನು ಅಳಿಸಲಾಗುವುದಿಲ್ಲ."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"<xliff:g id="ALARM">%1$s</xliff:g> ಗೆ ಮುಂದಿನ ಅಲಾರಾಂ ಹೊಂದಿಸಲಾಗಿದೆ"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"ರದ್ದುಮಾಡು"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ಅಳಿಸು"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"ಮುಗಿದಿದೆ"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ಮೋಡ್ ಬದಲಾವಣೆ"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"ನಮೂದಿಸು"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"ಅನ್ಲಾಕ್"</string>
- <string name="description_target_camera" msgid="969071997552486814">"ಕ್ಯಾಮರಾ"</string>
- <string name="description_target_silent" msgid="893551287746522182">"ಶಾಂತ"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"ಧ್ವನಿ ಆನ್"</string>
- <string name="description_target_search" msgid="3091587249776033139">"ಹುಡುಕಿ"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಮೇಲಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಕೆಳಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಎಡಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಬಲಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string>
- <string name="user_switched" msgid="3768006783166984410">"ಪ್ರಸ್ತುತ ಬಳಕೆದಾರರು <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"ತುರ್ತು ಕರೆ"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ಮರೆತಿರುವಿರಿ"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ತಪ್ಪು ಪ್ಯಾಟರ್ನ್"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"ಸರಿಯಾದ PUK ಕೋಡ್ ಅನ್ನು ಮರು-ನಮೂದಿಸಿ. ಸತತ ಪ್ರಯತ್ನಗಳು ಸಿಮ್ ಅನ್ನು ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"ಪಿನ್ ಕೋಡ್ಗಳು ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತಿಲ್ಲ"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ಹಲವಾರು ಪ್ಯಾಟರ್ನ್ ಪ್ರಯತ್ನಗಳು"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"ಅನ್ಲಾಕ್ ಮಾಡಲು, ನಿಮ್ಮ Google ಖಾತೆ ಬಳಸಿಕೊಂಡು ಸೈನ್ ಇನ್ ಮಾಡಿ."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"ಬಳಕೆದಾರಹೆಸರು (ಇಮೇಲ್)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"ಪಾಸ್ವರ್ಡ್"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"ಸೈನ್ ಇನ್ ಮಾಡಿ"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"ಅಮಾನ್ಯ ಬಳಕೆದಾರಹೆಸರು ಅಥವಾ ಪಾಸ್ವರ್ಡ್."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ನಿಮ್ಮ ಬಳಕೆದಾರಹೆಸರು ಅಥವಾ ಪಾಸ್ವರ್ಡ್ ಮರೆತಿರುವಿರಾ?\n"<b>"google.com/accounts/recovery"</b>" ಗೆ ಭೇಟಿ ನೀಡಿ."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"ಖಾತೆಯನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"ನಿಮ್ಮ ಪಿನ್ ಅನ್ನು ನೀವು <xliff:g id="NUMBER_0">%d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಟೈಪ್ ಮಾಡಿರುವಿರಿ. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನೀವು <xliff:g id="NUMBER_0">%d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಟೈಪ್ ಮಾಡಿರುವಿರಿ. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"ನಿಮ್ಮ ಅನ್ಲಾಕ್ ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ನೀವು <xliff:g id="NUMBER_0">%d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಚಿತ್ರಿಸಿರುವಿರಿ. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"ಫೋನ್ ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು ನೀವು <xliff:g id="NUMBER">%d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಪ್ರಯತ್ನಿಸಿರುವಿರಿ. ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ, ಇದು ಎಲ್ಲ ಪ್ರೊಫೈಲ್ ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ನಿಮ್ಮ ಅನ್ಲಾಕ್ ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ನೀವು <xliff:g id="NUMBER_0">%d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಡ್ರಾ ಮಾಡಿರುವಿರಿ. <xliff:g id="NUMBER_1">%d</xliff:g> ಹೆಚ್ಚಿನ ವಿಫಲ ಪ್ರಯತ್ನಗಳ ಬಳಿಕ, ನಿಮ್ಮ ಇಮೇಲ್ ಖಾತೆಯನ್ನು ಬಳಸಿಕೊಂಡು ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ಲಾಕ್ ಮಾಡುವಂತೆ ನಿಮ್ಮಲ್ಲಿ ಕೇಳಿಕೊಳ್ಳಲಾಗುತ್ತದೆ.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ನಿಮ್ಮ ಅನ್ಲಾಕ್ ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ನೀವು <xliff:g id="NUMBER_0">%d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಡ್ರಾ ಮಾಡಿರುವಿರಿ. <xliff:g id="NUMBER_1">%d</xliff:g> ಹೆಚ್ಚಿನ ವಿಫಲ ಪ್ರಯತ್ನಗಳ ಬಳಿಕ, ನಿಮ್ಮ ಇಮೇಲ್ ಖಾತೆಯನ್ನು ಬಳಸಿಕೊಂಡು ನಿಮ್ಮ ಫೋನ್ ಅನ್ಲಾಕ್ ಮಾಡುವಂತೆ ನಿಮ್ಮಲ್ಲಿ ಕೇಳಿಕೊಳ್ಳಲಾಗುತ್ತದೆ.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ತೆಗೆದುಹಾಕು"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"ಸಿಮ್ ಪಿನ್ ಕೋಡ್ ತಪ್ಪಾಗಿದೆ, ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು ನೀವು ಈ ಕೂಡಲೇ ನಿಮ್ಮ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಬೇಕು."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"ತಪ್ಪಾಗಿರುವ ಸಿಮ್ ಪಿನ್ ಕೋಡ್, ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡುವ ಸಲುವಾಗಿ ನಿಮ್ಮ ವಾಹಕವನ್ನು ನೀವು ಸಂಪರ್ಕಿಸುವುದಕ್ಕೂ ಮೊದಲು ನಿಮ್ಮಲ್ಲಿ <xliff:g id="NUMBER">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"ಸಿಮ್ ಪಿನ್ ಕಾರ್ಯಾಚರಣೆ ವಿಫಲಗೊಂಡಿದೆ!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"ಸಿಮ್ PUK ಕಾರ್ಯಾಚರಣೆ ವಿಫಲಗೊಂಡಿದೆ!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"ಕೋಡ್ ಅಂಗೀಕೃತವಾಗಿದೆ!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"ಹಿಂದಿನ ಹಾಡಿನ ಬಟನ್"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"ಮುಂದಿನ ಹಾಡು ಬಟನ್"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"ವಿರಾಮ ಬಟನ್"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"ಪ್ಲೇ ಬಟನ್"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"ನಿಲ್ಲಿಸು ಬಟನ್"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"ಯಾವುದೇ ಸೇವೆಯಿಲ್ಲ."</string>
</resources>
diff --git a/packages/Keyguard/res/values-ko/strings.xml b/packages/Keyguard/res/values-ko/strings.xml
index b60b159..5cac9b8 100644
--- a/packages/Keyguard/res/values-ko/strings.xml
+++ b/packages/Keyguard/res/values-ko/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"잠금 해제하려면 비밀번호 입력"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"잠금을 해제하려면 PIN 입력"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"PIN 코드가 잘못되었습니다."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"잠금해제하려면 메뉴를 누른 다음 0을 누릅니다."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"얼굴 인식 잠금해제 최대 시도 횟수를 초과했습니다."</string>
<string name="keyguard_charged" msgid="3272223906073492454">"충전됨"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"충전 중"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"충전기를 연결하세요."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM 카드가 잠겨 있습니다."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM 카드가 PUK 잠김 상태입니다."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM 카드 잠금해제 중..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d의 위젯 %2$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"위젯 추가"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"비어 있음"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"잠금 해제 영역 확장됨"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"잠금 해제 영역 축소됨"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> 위젯"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"사용자 선택기"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"카메라"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"미디어 조정"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"위젯 재정렬 시작됨"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"위젯 재정렬 완료됨"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> 위젯이 삭제됨"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"잠금 해제 영역 확장"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"슬라이드하여 잠금해제합니다."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"패턴을 사용하여 잠금해제합니다."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"얼굴 인식을 사용하여 잠금해제합니다."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"핀을 사용하여 잠금해제합니다."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN 영역"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN 영역"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK 영역"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"이전 트랙 버튼"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"다음 트랙 버튼"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"일시중지 버튼"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"재생 버튼"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"중지 버튼"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"좋아요"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"싫어요"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"하트"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"계속하려면 잠금해제합니다."</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"실행 취소됨"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"삭제하려면 <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>을(를) 드롭합니다."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>은(는) 삭제되지 않습니다."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"다음 알람이 <xliff:g id="ALARM">%1$s</xliff:g>(으)로 설정되었습니다."</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt 키"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"취소"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete 키"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"완료"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"모드 변경"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift 키"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter 키"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"잠금 해제"</string>
- <string name="description_target_camera" msgid="969071997552486814">"카메라"</string>
- <string name="description_target_silent" msgid="893551287746522182">"무음"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"사운드 켜기"</string>
- <string name="description_target_search" msgid="3091587249776033139">"검색"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 위로 슬라이드"</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 아래로 슬라이드"</string>
- <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 왼쪽으로 슬라이드"</string>
- <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 오른쪽으로 슬라이드"</string>
- <string name="user_switched" msgid="3768006783166984410">"현재 사용자는 <xliff:g id="NAME">%1$s</xliff:g>님입니다."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"긴급 통화"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"패턴을 잊음"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"잘못된 패턴"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"올바른 PUK 코드를 다시 입력하세요. 입력을 반복해서 시도하면 SIM을 영구적으로 사용할 수 없게 됩니다."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN 코드가 일치하지 않음"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"패턴 시도 횟수가 너무 많음"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"잠금해제하려면 Google 계정으로 로그인하세요."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"사용자 이름(이메일)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"비밀번호"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"로그인"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"사용자 이름 또는 비밀번호가 잘못되었습니다."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"사용자 이름이나 비밀번호를 잊어버렸습니까?\n"<b>"google.com/accounts/recovery"</b>" 페이지를 방문하세요."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"계정 확인 중…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PIN을 <xliff:g id="NUMBER_0">%d</xliff:g>회 잘못 입력했습니다. \n\n<xliff:g id="NUMBER_1">%d</xliff:g>초 후에 다시 시도해 주세요."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"비밀번호를 <xliff:g id="NUMBER_0">%d</xliff:g>회 잘못 입력했습니다. \n\n<xliff:g id="NUMBER_1">%d</xliff:g>초 후에 다시 시도해 주세요."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"잠금해제 패턴을 <xliff:g id="NUMBER_0">%d</xliff:g>회 잘못 그렸습니다. \n\n<xliff:g id="NUMBER_1">%d</xliff:g>초 후에 다시 시도해 주세요."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"휴대전화 잠금 해제에 <xliff:g id="NUMBER">%d</xliff:g>번 실패했습니다. 직장 프로필이 삭제되며 모든 프로필 데이터가 삭제됩니다."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"잠금해제 패턴을 <xliff:g id="NUMBER_0">%d</xliff:g>회 잘못 그렸습니다. <xliff:g id="NUMBER_1">%d</xliff:g>회 더 실패하면 이메일 계정을 사용하여 태블릿을 잠금해제해야 합니다.\n\n <xliff:g id="NUMBER_2">%d</xliff:g>초 후에 다시 시도해 주세요."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"잠금해제 패턴을 <xliff:g id="NUMBER_0">%d</xliff:g>회 잘못 그렸습니다. <xliff:g id="NUMBER_1">%d</xliff:g>회 더 실패하면 이메일 계정을 사용하여 휴대전화를 잠금해제해야 합니다.\n\n <xliff:g id="NUMBER_2">%d</xliff:g>초 후에 다시 시도해 주세요."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"삭제"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM PIN 코드가 잘못되었습니다. 이동통신사에 문의하여 기기를 잠금 해제해야 합니다."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"SIM PIN 코드가 잘못되었습니다. <xliff:g id="NUMBER">%d</xliff:g>회 이상 실패할 경우 이동통신사에 문의하여 기기를 잠금 해제해야 합니다."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN 작업이 실패했습니다."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK 작업이 실패했습니다."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"코드 승인 완료"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"이전 트랙 버튼"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"다음 트랙 버튼"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"일시중지 버튼"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"재생 버튼"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"중지 버튼"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"서비스 불가"</string>
</resources>
diff --git a/packages/Keyguard/res/values-ky-rKG/strings.xml b/packages/Keyguard/res/values-ky-rKG/strings.xml
index f90acb4..d04547c 100644
--- a/packages/Keyguard/res/values-ky-rKG/strings.xml
+++ b/packages/Keyguard/res/values-ky-rKG/strings.xml
@@ -29,9 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Кулпуну ачуу үчүн сырсөздү териңиз"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Кулпуну ачуу үчүн PIN кодду териңиз"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"PIN-код туура эмес."</string>
- <!-- no translation found for keyguard_label_text (861796461028298424) -->
- <skip />
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Жүзүнөн таанып ачуу аракеттеринин чегинен аштыңыз"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Дүрмөттөлдү"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Кубатталууда"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Дүрмөттөөчү түзмөктү туташтырыңыз."</string>
@@ -47,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-карта бөгөттөлгөн."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-карта PUK-бөгөттө."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM-карта бөгөттөн чыгарылууда…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d ичинен %2$d виджет."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Виджет кошуу."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Бош"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Бөгөттөн чыгаруу аймагы жазылды."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Бөгөттөн чыгаруу аймагы жыйрылды."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> виджети."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Колдонуучуну тандагыч"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Камера"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Медиа башкаруу"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Виджет иреттөө башталды."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Виджет иреттөө аяктады."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> виждети жок кылынды."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Бөгөттөн чыгаруу аймагын кеңейтүү."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Жылмыштырып ачуу."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Үлгү менен ачуу."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Жүзүнөн таануу"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Пин код менен ачуу."</string>
@@ -70,42 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN аймагы"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN аймагы"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK аймагы"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Мурунку трек баскычы"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Кийинки трек баскычы"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Тыныгуу баскычы"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Ойнотуу баскычы"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Токтотуу баскычы"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Жакты"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Жаккан жок"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Жүрөк"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Улантыш үчүн бөгөттөн чыгарыңыз"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Жүргүзүү токтотулду"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> жок кылыш үчүн, түшүрүңүз."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> жок кылынбайт."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Кийинки ойготкуч саат <xliff:g id="ALARM">%1$s</xliff:g> коюлган"</string>
- <!-- no translation found for password_keyboard_label_symbol_key (992280756256536042) -->
- <skip />
- <!-- no translation found for password_keyboard_label_alpha_key (8001096175167485649) -->
- <skip />
- <!-- no translation found for password_keyboard_label_alt_key (1284820942620288678) -->
- <skip />
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Айнуу"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Жок кылуу"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Даяр"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Тартип алмаштыруу"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Кирүү"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Бөгөттөн чыгаруу"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Камера"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Үнсүз"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Үн жандырылды"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Издөө"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн жогору жылмыштырыңыз."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн төмөн жылмыштырыңыз."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн солго жылмыштырыңыз."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн оңго жылмыштырыңыз."</string>
- <string name="user_switched" msgid="3768006783166984410">"Учурдагы колдонуучу <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Куткаруучуларга чалуу"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Үлгү унутулду"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Үлгү туура эмес"</string>
@@ -127,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Туура PUK-кодду кайрадан териңиз. Кайталанган аракеттер SIM-картаны биротоло жараксыз кылат."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN-коддор туура келбеди"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Өтө көп үлгү киргизүү аракети болду"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Бөгөттөн чыгарыш үчүн, Google эсебиңиз менен кириңиз."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Колдонуучунун аты (эмейл)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Сырсөз"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Кирүү"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Колдонуучу атыңыз же сырсөзүңүз туура эмес."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Колдонуучу атыңызды же сырсөзүңүздү унутуп калдыңызбы?\n"<b>"google.com/accounts/recovery"</b>" дарегине кайрылыңыз."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Эсеп текшерилүүдө…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Сиз PIN-кодуңузду <xliff:g id="NUMBER_0">%d</xliff:g> жолу туура эмес тердиңиз. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> секундадан кийин кайталаңыз."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Сиз сырсөзүңүздү <xliff:g id="NUMBER_0">%d</xliff:g> жолу туура эмес тердиңиз. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> секундадан кийин кайталаңыз."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Сиз бөгөттөн чыгаруу үлгүсүн <xliff:g id="NUMBER_0">%d</xliff:g> жолу туура эмес көрсөттүңүз. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> секундадан кийин кайталаңыз."</string>
@@ -151,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Телефондун кулпусун ачууда <xliff:g id="NUMBER">%d</xliff:g> жолу туура эмес аракет кылдыңыз. Жумуш профили чыгарылып салынып, андагы бардык дайындар жок болот."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Сиз бөгөттөн чыгаруу үлгүсүн <xliff:g id="NUMBER_0">%d</xliff:g> жолу туура эмес көрсөттүңүз. Дагы <xliff:g id="NUMBER_1">%d</xliff:g> ийгиликсиз аракеттен кийин, планшетиңизди эмейл эсебиңиз аркылуу бөгөттөн чыгаруу талап кылынат.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> секундадан кийин кайра аракеттениңиз."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Сиз бөгөттөн чыгаруу үлгүсүн <xliff:g id="NUMBER_0">%d</xliff:g> жолу туура эмес көрсөттүңүз. Дагы <xliff:g id="NUMBER_1">%d</xliff:g> ийгиликсиз аракеттен кийин, телефонуңузду эмейл эсебиңиз аркылуу бөгөттөн чыгаруу талап кылынат.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> секундадан кийин кайра аракеттениңиз."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Алып салуу"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM-карта PIN-коду туура эмес. Эми түзмөктү бөгөттөн чыгарыш үчүн операторуңузга кайрылышыңыз керек."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"SIM PIN-коду туура эмес, сиз түзмөктү бөгөттөн чыгарыш үчүн операторуңузга кайрылганга <xliff:g id="NUMBER">%d</xliff:g> аракет калды."</item>
@@ -165,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM-картанын PIN-кодун ачуу кыйрады!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM-картанын PUK-кодун ачуу кыйрады!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Код кабыл алынды!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Мурунку трек баскычы"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Кийинки трек баскычы"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Тыныгуу баскычы"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Ойнотуу баскычы"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Токтотуу баскычы"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Байланыш жок."</string>
</resources>
diff --git a/packages/Keyguard/res/values-land/bools.xml b/packages/Keyguard/res/values-land/bools.xml
index a1dd2e4..bedf504 100644
--- a/packages/Keyguard/res/values-land/bools.xml
+++ b/packages/Keyguard/res/values-land/bools.xml
@@ -15,8 +15,5 @@
-->
<resources>
- <bool name="kg_enable_camera_default_widget">false</bool>
- <bool name="kg_top_align_page_shrink_on_bouncer_visible">true</bool>
- <bool name="kg_share_status_area">false</bool>
<bool name="kg_sim_puk_account_full_screen">false</bool>
</resources>
diff --git a/packages/Keyguard/res/values-land/dimens.xml b/packages/Keyguard/res/values-land/dimens.xml
deleted file mode 100644
index bf30332..0000000
--- a/packages/Keyguard/res/values-land/dimens.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-**
-** Copyright 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>
- <!-- Shift emergency button from the left edge by this amount. Used by landscape layout on
- phones -->
- <dimen name="kg_emergency_button_shift">30dp</dimen>
-
- <!-- Space reserved at the bottom of secure views (pin/pattern/password/SIM pin/SIM puk) -->
- <dimen name="kg_secure_padding_height">0dp</dimen>
-
- <!-- Top padding for the widget pager -->
- <dimen name="kg_widget_pager_top_padding">0dp</dimen>
-
- <!-- Bottom padding for the widget pager -->
- <dimen name="kg_widget_pager_bottom_padding">0dp</dimen>
-
- <!-- If the height if keyguard drops below this threshold (most likely
- due to the appearance of the IME), then drop the multiuser selector.
- Landscape's layout allows this to be smaller than for portrait. -->
- <dimen name="kg_squashed_layout_threshold">400dp</dimen>
-
-</resources>
diff --git a/packages/Keyguard/res/values-land/integers.xml b/packages/Keyguard/res/values-land/integers.xml
index 020fd23..0739c3a 100644
--- a/packages/Keyguard/res/values-land/integers.xml
+++ b/packages/Keyguard/res/values-land/integers.xml
@@ -20,7 +20,4 @@
<!-- Gravity to make KeyguardSelectorView work in multiple orientations
0x13 == "left|center_vertical" -->
<integer name="kg_selector_gravity">0x13</integer>
- <integer name="kg_widget_region_weight">45</integer>
- <integer name="kg_security_flipper_weight">55</integer>
- <integer name="kg_glowpad_rotation_offset">-90</integer>
</resources>
diff --git a/packages/Keyguard/res/values-large/dimens.xml b/packages/Keyguard/res/values-large/dimens.xml
deleted file mode 100644
index 0b5d4ad..0000000
--- a/packages/Keyguard/res/values-large/dimens.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 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.
-*/
--->
-<resources>
- <!-- Minimum width of the search view text entry area. -->
- <dimen name="search_view_text_min_width">192dip</dimen>
-
- <item type="dimen" name="dialog_min_width_major">55%</item>
- <item type="dimen" name="dialog_min_width_minor">80%</item>
-
- <!-- Preference UI dimensions for larger screens. -->
- <dimen name="preference_widget_width">56dp</dimen>
-</resources>
diff --git a/packages/Keyguard/res/values-lo-rLA/strings.xml b/packages/Keyguard/res/values-lo-rLA/strings.xml
index 40f1893..af566d2 100644
--- a/packages/Keyguard/res/values-lo-rLA/strings.xml
+++ b/packages/Keyguard/res/values-lo-rLA/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"ພິມລະຫັດເພື່ອປົດລັອກ"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"ພິມລະຫັດ PIN ເພື່ອປົດລັອກ"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ລະຫັດ PIN ບໍ່ຖືກຕ້ອງ."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"ເພື່ອປົດລັອກ, ໃຫ້ກົດເມນູ ແລ້ວກົດ 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"ຄວາມພະຍາຍາມປົດລັອກດ້ວຍໜ້ານັ້ນ ເກີນຈຳນວນທີ່ກຳນົດແລ້ວ"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"ສາກເຕັມແລ້ວ"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"ກຳລັງສາກໄຟ"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"ເຊື່ອມຕໍ່ອຸປະກອນສາກຂອງທ່ານ."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"ຊິມກາດຖືກລັອກ."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ຊິມກາດຖືກລັອກດ້ວຍລະຫັດ PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"ກຳລັງປົດລັອກຊິມກາດ..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. ວິດເຈັດ %2$d ຈາກທັງໝົດ %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ເພີ່ມວິດເຈັດ"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ຫວ່າງເປົ່າ"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"ຂະຫຍາຍພື້ນທີ່ປົດລັອກແລ້ວ."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"ຫຍໍ້ພື້ນທີ່ປົດລັອກແລ້ວ."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ວິດເຈັດ."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"ໂຕເລືອກຂອງຜູ່ໃຊ້"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"ກ້ອງ"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"ການຄວບຄຸມສື່"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"ການຈັດຮຽງວິເຈັດໃໝ່ເລີ່ມຕົ້ນແລ້ວ."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"ການຈັດຮຽງວິດເຈັດຄືນໃໝ່ສຳເລັດແລ້ວ."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"ລຶບວິດເຈັດ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ແລ້ວ."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ຂະຫຍາຍຂອບເຂດປົດລັອກ."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"ການປົດລັອກດ້ວຍການເລື່ອນ."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ປົດລັອກດ້ວຍຮູບແບບ."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ປົດລັອກດ້ວຍໜ້າ."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ປົດລັອກດ້ວຍ PIN."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"ພື້ນທີ່ PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"ພື້ນທີ່ PIN ຂອງ SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"ພື້ນທີ່ PUK ຂອງ SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"ປຸ່ມເພງກ່ອນໜ້າ"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"ປຸ່ມເພງຕໍ່ໄປ"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ປຸ່ມຢຸດຊົ່ວຄາວ"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ປຸ່ມຫຼິ້ນ"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ປຸ່ມຢຸດ"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"ເລື່ອນນິ້ວໂປ້ຂຶ້ນ"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ເລື່ອນນິ້ວໂປ້ລົງ"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"ຫົວໃຈ"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ປົດລັອກເພື່ອດຳເນີນການຕໍ່"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ການເປີດໃຊ້ຖືກຍົກເລີກ"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ວາງ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ເພື່ອລຶບ."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ຈະບໍ່ຖືກລຶບອອກ"</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"ໂມງປຸກຕໍ່ໄປຖືກຕັ້ງໄວ້ເວລາ <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"ຍົກເລີກ"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ລຶບ"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"ແລ້ວໆ"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ປ່ຽນຮູບແບບ"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"ປົດລັອກ"</string>
- <string name="description_target_camera" msgid="969071997552486814">"ກ້ອງ"</string>
- <string name="description_target_silent" msgid="893551287746522182">"ປິດສຽງ"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"ເປີດສຽງ"</string>
- <string name="description_target_search" msgid="3091587249776033139">"ຊອກຫາ"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"ເລື່ອນຂຶ້ນເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"ເລື່ອນລົງເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"ເລື່ອນໄປທາງຊ້າຍເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"ເລື່ອນໄປທາງຂວາເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"ຜູ່ໃຊ້ປັດຈຸບັນ <xliff:g id="NAME">%1$s</xliff:g> ."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"ການໂທສຸກເສີນ"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ລືມຮູບແບບປົດລັອກ?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ຮູບແບບຜິດ"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"ປ້ອນລະຫັດ PUK ທີ່ຖືກຕ້ອງຄືນໃໝ່. ການພະຍາຍາມໃສ່ຫຼາຍເທື່ອຈະເຮັດໃຫ້ຊິມກາດໃຊ້ບໍ່ໄດ້ຖາວອນ."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"ລະຫັດ PIN ບໍ່ກົງກັນ"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ແຕ້ມຮູບແບບປົດລັອກຫຼາຍເກີນໄປ"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"ເພື່ອປົດລັອກ, ເຂົ້າສູ່ລະບົບດ້ວຍບັນຊີ Google ຂອງທ່ານ."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"ຊື່ຜູ່ໃຊ້ (ອີເມວ)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"ລະຫັດຜ່ານ"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"ເຂົ້າສູ່ລະບົບ"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"ຊື່ຜູ່ໃຊ້ ຫຼືລະຫັດຜ່ານບໍ່ຖືກຕ້ອງ."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ລືມຊື່ຜູ່ໃຊ້ ຫຼືລະຫັດຜ່ານຂອງທ່ານບໍ່?\nໄປທີ່ "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"ກຳລັງກວດສອບບັນຊີ..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"ທ່ານພິມລະຫັດ PIN ຂອງທ່ານຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອແລ້ວ. \n\nກະລຸນາລອງໃໝ່ໃນອີກ <xliff:g id="NUMBER_1">%d</xliff:g> ວິນາທີ."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"ທ່ານພິມລະຫັດຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອແລ້ວ. \n\nລອງໃໝ່ໃນອີກ <xliff:g id="NUMBER_1">%d</xliff:g> ວິນາທີ."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"ທ່ານແຕ້ມຮູບແບບປົດລັອກຂອງທ່ານຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອແລ້ວ. \n\nກະລຸນາລອງໃໝ່ໃນອີກ <xliff:g id="NUMBER_1">%d</xliff:g> ວິນາທີ."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"ທ່ານພະຍາຍາມປົດລັອກໂທລະສັບບໍ່ຖືກຕ້ອງ <xliff:g id="NUMBER">%d</xliff:g> ຄັ້ງ. ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຈະຖືກເອົາອອກໄປ, ເຊິ່ງຈະລຶບທຸກຂໍ້ມູນໂປຣໄຟລ໌."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ທ່ານແຕ້ມຮູບແບບປົດລັອກຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອແລ້ວ. ຫຼັງຈາກແຕ້ມຜິດອີກ <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ, ທ່ານຈະຖືກຖາມໃຫ້ປົດລັອກແທັບເລັດຂອງທ່ານ ດ້ວຍການເຂົ້າສູ່ລະບົບໂດຍໃຊ້ອີເມວຂອງທ່ານ.\n\n ກະລຸນາລອງໃໝ່ອີກຄັ້ງໃນອີກ <xliff:g id="NUMBER_2">%d</xliff:g> ວິນາທີ."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ທ່ານແຕ້ມຮູບແບບປົດລັອກຂອງທ່ານຜິດ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອແລ້ວ. ຫຼັງຈາກຄວາມພະຍາຍາມອີກ <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ ທ່ານຈະຖືກຖາມໃຫ້ປົດລັອກໂທລະສັບຂອງທ່ານດ້ວຍບັນຊີອີເມວ.\n\n ລອງໃໝ່ອີກຄັ້ງໃນ <xliff:g id="NUMBER_2">%d</xliff:g> ວິນາທີ."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ລຶບອອກ"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"ລະຫັດ PIN ຂອງ SIM ບໍ່ຖືກຕ້ອງທ່ານຕ້ອງຕິດຕໍ່ຫາຜູ່ໃຫ້ບໍລິການ ເພື່ອປົດລັອກອຸປະກອນຂອງທ່ານ."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"ລະຫັດ PIN ຂອງ SIM ບໍ່ຖືກຕ້ອງ, ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="NUMBER">%d</xliff:g> ເທື່ອກ່ອນທີ່ທ່ານຈະຕ້ອງຕິດຕໍ່ຫາຜູ່ໃຫ້ບໍລິການຂອງທ່ານ ເພື່ອປົດລັອກອຸປະກອນຂອງທ່ານ."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"PIN ຂອງ SIM ເຮັດວຽກລົ້ມເຫຼວ!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"PUK ຂອງ SIM ເຮັດວຽກລົ້ມເຫຼວ!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"ລະຫັດຖືກຕອບຮັບແລ້ວ!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"ປຸ່ມເພງກ່ອນໜ້າ"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"ປຸ່ມເພງຕໍ່ໄປ"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"ປຸ່ມຢຸດຊົ່ວຄາວ"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"ປຸ່ມຫຼິ້ນ"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"ປຸ່ມຢຸດ"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"ບໍ່ມີບໍລິການ"</string>
</resources>
diff --git a/packages/Keyguard/res/values-lt/strings.xml b/packages/Keyguard/res/values-lt/strings.xml
index eb9c910..31c38cc 100644
--- a/packages/Keyguard/res/values-lt/strings.xml
+++ b/packages/Keyguard/res/values-lt/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Jei norite atrakinti, įveskite slaptažodį"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Jei norite atrakinti, įveskite PIN kodą"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Neteisingas PIN kodas."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Jei norite atrakinti, paspauskite „Meniu“ ir 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Viršijote maksimalų atrakinimo pagal veidą bandymų skaičių"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Įkrauta"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Kraunama"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Prijunkite įkroviklį."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM kortelė užrakinta."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM kortelė užrakinta PUK kodu."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Atrakinama SIM kortelė…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %2$d valdiklis iš %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Pridėti valdiklį."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tuščia"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Atrakinimo sritis išplėsta."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Atrakinimo sritis sutraukta."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Valdiklis <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Naudotojo pasirinkimo valdiklis"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Fotoaparatas"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Medijos valdikliai"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Valdiklių pertvarkymas pradėtas."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Valdiklių pertvarkymas baigtas."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Valdiklis <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ištrintas."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Išplėsti atrakinimo sritį."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Atrakinimas slystant."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Atrakinimas pagal piešinį."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Atrakinimas pagal veidą."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Atrakinimas įvedus PIN kodą."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN kodo sritis"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM kortelės PIN kodo sritis"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM kortelės PUK kodo sritis"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Ankstesnio takelio mygtukas"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Kito takelio mygtukas"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pristabdymo mygtukas"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Paleidimo mygtukas"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Sustabdymo mygtukas"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Patinka"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Nepatinka"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Širdis"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Jei norite tęsti, atrakinkite"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Paleidimas atšauktas"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Paleiskite „<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>“, kad jį ištrintumėte."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"„<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>“ nebus ištrintas."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Kitas nustatytas signalas: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Atšaukti"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Ištrinti"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Atlikta"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Režimo keitimas"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Įvesti"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Atrakinti"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Vaizdo kamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Begarsis"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Garsas įjungtas"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Paieška"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Slyskite aukštyn link <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Slyskite žemyn link <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Slyskite į kairę link <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Slyskite į dešinę link <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Dabartinis naudotojas: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Skambutis pagalbos numeriu"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Pamiršau atrakinimo piešinį"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Netinkamas atrakinimo piešinys"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Pakartotinai įveskite tinkamą PUK kodą. Pakartotinai bandant SIM bus neleidžiama visam laikui."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN kodai neatitinka"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Per daug atrakinimo piešinių bandymų"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Jei norite atrakinti, prisijunkite naudodami „Google“ paskyrą."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Naudotojo vardas (el. paštas)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Slaptažodis"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Prisijungti"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Netinkamas naudotojo vardas ar slaptažodis."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Pamiršote naudotojo vardą ar slaptažodį?\nApsilankykite šiuo adresu: "<b>"google.com/accounts/recovery"</b></string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Tikrinama paskyra…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PIN kodą netinkamai įvedėte <xliff:g id="NUMBER_0">%d</xliff:g> k. \n\nBandykite dar kartą po <xliff:g id="NUMBER_1">%d</xliff:g> sek."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Neteisingai įvedėte slaptažodį <xliff:g id="NUMBER_0">%d</xliff:g> k. \n\nBandykite dar kartą po <xliff:g id="NUMBER_1">%d</xliff:g> sek."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Netinkamai nupiešėte atrakinimo piešinį <xliff:g id="NUMBER_0">%d</xliff:g> k. \n\nBandykite dar kartą po <xliff:g id="NUMBER_1">%d</xliff:g> sek."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"<xliff:g id="NUMBER">%d</xliff:g> kart. nesėkmingai bandėte atrakinti telefoną. Darbo profilis bus pašalintas ir visi profilio duomenys bus ištrinti."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Netinkamai nupiešėte atrakinimo piešinį <xliff:g id="NUMBER_0">%d</xliff:g> k. Po dar <xliff:g id="NUMBER_1">%d</xliff:g> nesėkm. band. būsite paprašyti atrakinti planšetinį kompiuterį naudodami „Google“ prisijungimo duomenis.\n\n Bandykite dar kartą po <xliff:g id="NUMBER_2">%d</xliff:g> sek."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Netinkamai nupiešėte atrakinimo piešinį <xliff:g id="NUMBER_0">%d</xliff:g> k. Po dar <xliff:g id="NUMBER_1">%d</xliff:g> nesėkm. band. būsite paprašyti atrakinti telefoną naudodami „Google“ prisijungimo duomenis.\n\n Bandykite dar kartą po <xliff:g id="NUMBER_2">%d</xliff:g> sek."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Pašalinti"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Netinkamas SIM kortelės PIN kodas. Reikės susisiekti su operatoriumi, kad atrakintų įrenginį."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Netinkamas SIM kortelės PIN kodas. Jums liko <xliff:g id="NUMBER">%d</xliff:g> band. Paskui reikės susisiekti su operatoriumi, kad jis atrakintų įrenginį."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Nepavyko atlikti SIM kortelės PIN kodo operacijos."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Nepavyko atlikti SIM kortelės PUK kodo operacijos."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Kodas priimtas."</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Ankstesnio takelio mygtukas"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Kito takelio mygtukas"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pristabdymo mygtukas"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Paleidimo mygtukas"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Sustabdymo mygtukas"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Nėra paslaugos."</string>
</resources>
diff --git a/packages/Keyguard/res/values-lv/strings.xml b/packages/Keyguard/res/values-lv/strings.xml
index 920a141..c13aef1 100644
--- a/packages/Keyguard/res/values-lv/strings.xml
+++ b/packages/Keyguard/res/values-lv/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Ievadiet paroli, lai atbloķētu."</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Lai atbloķētu, ievadiet PIN."</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"PIN kods nav pareizs."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Lai atbloķētu, nospiediet Izvēlne, pēc tam 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Ir pārsniegts maksimālais Autorizācijas pēc sejas mēģinājumu skaits."</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Uzlādēts"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Notiek uzlāde"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Pievienojiet uzlādes ierīci."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM karte ir bloķēta."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM karte ir bloķēta ar PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Notiek SIM kartes atbloķēšana..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %2$d. logrīks no %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Pievienot logrīku."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tukšs"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Atbloķēšanas apgabals ir izvērsts."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Atbloķēšanas apgabals ir sakļauts."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Logrīks <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Lietotāju atlasītājs"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Multivides vadīklas"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Logrīku pārkārtošana ir sākta."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Logrīku pārkārtošana ir pabeigta."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Logrīks <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ir izdzēsts."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Izvērst atbloķēšanas apgabalu."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Autorizācija, velkot ar pirkstu."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Autorizācija ar kombināciju."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Autorizācija pēc sejas."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Autorizācija ar PIN kodu."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN apgabals"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN apgabals"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK apgabals"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Iepriekšējā ieraksta poga"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Nākamā ieraksta poga"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pārtraukšanas poga"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Atskaņošanas poga"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Apturēšanas poga"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Patīk"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Nepatīk"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Sirds"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Atbloķējiet, lai turpinātu."</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Palaišana atcelta"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Velciet logrīku <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, lai to izdzēstu."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Logrīks <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> netiks izdzēsts."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Signāls iestatīts uz: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alternēšanas taustiņš"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Atcelt"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Dzēšanas taustiņš"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Gatavs"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Režīma maiņa"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Pārslēgšanas taustiņš"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Ievadīšanas taustiņš"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Atbloķēt"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Klusums"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Skaņa ieslēgta"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Meklēt"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Velciet uz augšu, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Velciet uz leju, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Velciet pa kreisi, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Velciet pa labi, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Pašreizējais lietotājs: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Ārkārtas izsaukums"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Aizmirsu kombināciju"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Nepareiza kombinācija"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Atkārtoti ievadiet pareizo PUK kodu. Ja vairākas reizes ievadīsiet to nepareizi, SIM karte tiks neatgriezeniski atspējota."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN kodi neatbilst."</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Pārāk daudz kombinācijas mēģinājumu"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Lai atbloķētu, pierakstieties, izmantojot savu Google kontu."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Lietotājvārds (e-pasts)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Parole"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Pierakstīties"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Nederīgs lietotājvārds vai parole."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Vai aizmirsāt lietotājvārdu vai paroli?\nApmeklējiet vietni "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Notiek konta pārbaude…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Jūs nepareizi ievadījāt PIN <xliff:g id="NUMBER_0">%d</xliff:g> reizes.\n\nMēģiniet vēlreiz pēc <xliff:g id="NUMBER_1">%d</xliff:g> sekundēm."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Jūs nepareizi ievadījāt paroli <xliff:g id="NUMBER_0">%d</xliff:g> reizes.\n\nMēģiniet vēlreiz pēc <xliff:g id="NUMBER_1">%d</xliff:g> sekundēm."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Jūs nepareizi norādījāt atbloķēšanas kombināciju <xliff:g id="NUMBER_0">%d</xliff:g> reizes.\n\nMēģiniet vēlreiz pēc <xliff:g id="NUMBER_1">%d</xliff:g> sekundēm."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Jūs <xliff:g id="NUMBER">%d</xliff:g> reizes nesekmīgi mēģinājāt atbloķēt tālruni. Darba profils tiks noņemts, kā arī visi profila dati tiks dzēsti."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Jūs nepareizi norādījāt atbloķēšanas kombināciju <xliff:g id="NUMBER_0">%d</xliff:g> reizes. Pēc vēl <xliff:g id="NUMBER_1">%d</xliff:g> neveiksmīgiem mēģinājumiem planšetdators būs jāatbloķē, izmantojot e-pasta kontu.\n\nMēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%d</xliff:g> sekundēm."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Jūs nepareizi norādījāt atbloķēšanas kombināciju <xliff:g id="NUMBER_0">%d</xliff:g> reizes. Pēc vēl <xliff:g id="NUMBER_1">%d</xliff:g> neveiksmīgiem mēģinājumiem tālrunis būs jāatbloķē, izmantojot e-pasta kontu.\n\nMēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%d</xliff:g> sekundēm."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Noņemt"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Nepareizs SIM kartes PIN kods. Lai atbloķētu ierīci, sazinieties ar mobilo sakaru operatoru."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Nepareizs SIM kartes PIN kods. Varat mēģināt vēl <xliff:g id="NUMBER">%d</xliff:g> reizi. Kļūdas gadījumā būs jāsazinās ar mobilo sakaru operatoru, lai tas atbloķētu jūsu ierīci."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM kartes PIN koda ievadīšana neizdevās."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM kartes PUK koda ievadīšana neizdevās."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Kods ir pieņemts!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Iepriekšējā ieraksta poga"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Nākamā ieraksta poga"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pārtraukšanas poga"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Atskaņošanas poga"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Apturēšanas poga"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Nav pakalpojuma."</string>
</resources>
diff --git a/packages/Keyguard/res/values-mk-rMK/strings.xml b/packages/Keyguard/res/values-mk-rMK/strings.xml
index a94503b..525cc29 100644
--- a/packages/Keyguard/res/values-mk-rMK/strings.xml
+++ b/packages/Keyguard/res/values-mk-rMK/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Впишете ја лозинката за да се отклучи"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Впишете ПИН за да се отклучи"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Погрешен ПИН код."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"За да го отклучите, притиснете „Мени“ и потоа „0“."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Максималниот број обиди на отклучување со лице е надминат"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Наполнета"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Се полни"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Поврзи го полначот."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"СИМ картичката е заклучена."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"СИМ картичката е заклучена со ПУК."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"СИМ картичката се отклучува..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Виџет %2$d од %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Додај виџет."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Празно"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Областа за отклучување е проширена."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Областа за отклучување е собрана."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Виџет <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Избирач на корисник"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Фотоапарат"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Контроли на медиуми"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Прередувањето виџети започна."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Прередувањето виџети заврши."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Виџетот <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> е избришан."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Прошири отклучена област."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Отклучување со лизгање."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Отклучување со шема."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Отклучување со лик."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Отклучување со пин."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Поле за ПИН"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Поле за ПИН на СИМ"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Поле за ПУК на СИМ"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Копче „Претходна песна“"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Копче „Следна песна“"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Копче „Пауза“"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Копче „Репродукција“"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Копче „Запри“"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Палци нагоре"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Палци надолу"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Срце"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Отклучи за да продолжиш"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Стартувањето е откажано"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Пушти го <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> да се избрише."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> нема да се избрише."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Следниот аларм е поставен за <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"АБВ"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Копче „Alt“"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Копче „Откажи“"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Копче „Избриши“"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Копче „Готово“"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Копче „Промени режим“"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Копче „Shift“"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Копче „Внеси“"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Отклучи"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Фотоапарат"</string>
- <string name="description_target_silent" msgid="893551287746522182">"На тивко"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Вклучи звук"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Пребарај"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Лизгај нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Лизгај надолу за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Лизгај налево за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Лизгај надесно за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Тековен корисник <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Итен повик"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Заборавив шема"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Погрешна шема"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Повторно внесете го точниот ПУК код. Повторните обиди трајно ќе ја оневозможат СИМ картичката."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"ПИН кодовите не се совпаѓаат"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Премногу обиди со шема"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"За да го отклучите, пријавете се со вашата сметка на Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Корисничко име (е-пошта)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Лозинка"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Пријави се"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Неважечко корисничко име или лозинка."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Го заборави своето корисничко име или лозинката?\nПосети"<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Сметката се проверува..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Погрешно сте го впишале вашиот ПИН <xliff:g id="NUMBER_0">%d</xliff:g> пати. \n\nОбидете се повторно за <xliff:g id="NUMBER_1">%d</xliff:g> секунди."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Погрешно сте ја впишале вашата лозинка <xliff:g id="NUMBER_0">%d</xliff:g> пати. \n\nОбидете се повторно за <xliff:g id="NUMBER_1">%d</xliff:g> секунди."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Погрешно сте ја употребиле вашата шема за отклучување <xliff:g id="NUMBER_0">%d</xliff:g> пати. \n\nОбидете се повторно за <xliff:g id="NUMBER_1">%d</xliff:g> секунди."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Неправилно се обидовте да го отклучите телефонот <xliff:g id="NUMBER">%d</xliff:g> пати. Работниот профил ќе се отстрани, со што ќе се избришат сите податоци на профилот."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Погрешно сте ја употребиле вашата шема на отклучување <xliff:g id="NUMBER_0">%d</xliff:g> пати. По <xliff:g id="NUMBER_1">%d</xliff:g> неуспешни обиди, ќе побараат од вас да го отклучите таблетот со користење сметка на е-пошта.\n\n Обидете се повторно за <xliff:g id="NUMBER_2">%d</xliff:g> секунди."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Погрешно сте ја употребиле вашата шема на отклучување <xliff:g id="NUMBER_0">%d</xliff:g> пати. По <xliff:g id="NUMBER_1">%d</xliff:g> неуспешни обиди, ќе побараат од вас да го отклучите телефонот со користење сметка на е-пошта.\n\n Обидете се повторно за <xliff:g id="NUMBER_2">%d</xliff:g> секунди."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Отстрани"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"ПИН кодот за СИМ картичката е неточен. Контактирате со вашиот оператор да го отклучи уредот."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"ПИН кодот за СИМ картичката е неточен. Ви преостанува уште <xliff:g id="NUMBER">%d</xliff:g> обид, а потоа ќе треба да контактирате со вашиот оператор да го отклучи уредот."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"СИМ картичката не се отклучи со ПИН кодот!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"СИМ картичката не се отклучи со ПУК кодот!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Кодот е прифатен!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Копче „Претходна песна“"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Копче „Следна песна“"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Копче „Пауза“"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Копче „Репродукција“"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Копче „Запри“"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Нема услуга."</string>
</resources>
diff --git a/packages/Keyguard/res/values-ml-rIN/strings.xml b/packages/Keyguard/res/values-ml-rIN/strings.xml
index 20c73a3..a91fe78 100644
--- a/packages/Keyguard/res/values-ml-rIN/strings.xml
+++ b/packages/Keyguard/res/values-ml-rIN/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"അൺലോക്കുചെയ്യുന്നതിന് പാസ്വേഡ് ടൈപ്പുചെയ്യുക"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"അൺലോക്കുചെയ്യുന്നതിന് പിൻ ടൈപ്പുചെയ്യുക"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"പിൻ കോഡ് തെറ്റാണ്."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"അൺലോക്ക് ചെയ്യുന്നതിന് മെനു, 0 എന്നിവ അമർത്തുക."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ശ്രമങ്ങളുടെ പരമാവധി കഴിഞ്ഞു"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"ചാർജ്ജുചെയ്തു"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"ചാർജ്ജുചെയ്യുന്നു"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"നിങ്ങളുടെ ചാർജ്ജർ കണക്റ്റുചെയ്യുക."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"സിം കാർഡ് ലോക്കുചെയ്തു."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"സിം കാർഡ് PUK-ലോക്ക് ചെയ്തതാണ്."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"സിം കാർഡ് അൺലോക്കുചെയ്യുന്നു…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. വിജറ്റ് %2$d / %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"വിജറ്റ് ചേർക്കുക."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ശൂന്യം"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"അൺലോക്ക് ഏരിയ വിപുലീകരിച്ചു."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"അൺലോക്ക് ഏരിയ ചുരുക്കി."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> വിജറ്റ്."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"ഉപയോക്തൃ സെലക്ടർ"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"ക്യാമറ"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"മീഡിയ നിയന്ത്രണങ്ങൾ"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"വിജറ്റ് പുനഃക്രമീകരണം ആരംഭിച്ചു."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"വിജറ്റ് പുനഃക്രമീകരണം അവസാനിച്ചു."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"വിജറ്റ് <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ഇല്ലാതാക്കി."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"അൺലോക്ക് ഏരിയ വിപുലീകരിക്കുക."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"സ്ലൈഡ് അൺലോക്ക്."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"പാറ്റേൺ അൺലോക്ക്."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക്."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"പിൻ അൺലോക്ക്."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN ഏരിയ"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN ഏരിയ"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK ഏരിയ"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"മുമ്പത്തെ ട്രാക്ക് ബട്ടൺ"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"പുതിയ ട്രാക്ക് ബട്ടൺ"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"താൽക്കാലികമായി നിർത്തുക ബട്ടൺ"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"പ്ലേ ബട്ടൺ"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"നിർത്തുക ബട്ടൺ"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"തംബ്സ് അപ്പ്"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"തംബ്സ് ഡൗൺ"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"ഹൃദയം"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"തുടരാൻ അൺലോക്കുചെയ്യുക"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"സമാരംഭിക്കൽ റദ്ദാക്കി."</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ഇല്ലാതാക്കാൻ ഡ്രോപ്പുചെയ്യുക."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ഇല്ലാതാക്കില്ല."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"<xliff:g id="ALARM">%1$s</xliff:g>-ന് അടുത്ത അലാറം സജ്ജീകരിച്ചു"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"റദ്ദാക്കുക"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ഇല്ലാതാക്കുക"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"പൂർത്തിയായി"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"മോഡ് മാറ്റം"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"അണ്ലോക്ക് ചെയ്യുക"</string>
- <string name="description_target_camera" msgid="969071997552486814">"ക്യാമറ"</string>
- <string name="description_target_silent" msgid="893551287746522182">"നിശബ്ദം"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"ശബ്ദം ഓണ് ചെയ്യുക"</string>
- <string name="description_target_search" msgid="3091587249776033139">"തിരയൽ"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി മുകളിലേയ്ക്ക് സ്ലൈഡുചെയ്യുക."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായ് താഴേക്ക് സ്ലൈഡുചെയ്യുക."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി ഇടത്തേയ്ക്ക് സ്ലൈഡുചെയ്യുക."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി വലത്തേയ്ക്ക് സ്ലൈഡുചെയ്യുക."</string>
- <string name="user_switched" msgid="3768006783166984410">"നിലവിലെ ഉപയോക്താവ് <xliff:g id="NAME">%1$s</xliff:g> ആണ്."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"അടിയന്തര കോൾ"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"പാറ്റേൺ മറന്നു"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"പാറ്റേൺ തെറ്റാണ്"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"ശരിയായ PUK കോഡ് വീണ്ടും നൽകുക. ആവർത്തിച്ചുള്ള ശ്രമങ്ങൾ സിം ശാശ്വതമായി പ്രവർത്തനരഹിതമാക്കും."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"പിൻ കോഡുകൾ പൊരുത്തപ്പെടുന്നില്ല"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"വളരെയധികം പാറ്റേൺ ശ്രമങ്ങൾ"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"അൺലോക്കുചെയ്യുന്നതിന്, നിങ്ങളുടെ Google അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"ഉപയോക്തൃനാമം (ഇമെയിൽ)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"പാസ്വേഡ്"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"സൈൻ ഇൻ ചെയ്യുക"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"ഉപയോക്തൃനാമമോ പാസ്വേഡോ അസാധുവാണ്."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"നിങ്ങളുടെ ഉപയോക്തൃനാമമോ പാസ്വേഡോ മറന്നുപോയോ?\n"<b>"google.com/accounts/recovery"</b>" സന്ദർശിക്കുക."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"അക്കൗണ്ട് പരിശോധിക്കുന്നു…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"നിങ്ങളുടെ പിൻ <xliff:g id="NUMBER_0">%d</xliff:g> തവണ തെറ്റായി ടൈപ്പുചെയ്തു. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"നിങ്ങളുടെ പാസ്വേഡ് <xliff:g id="NUMBER_0">%d</xliff:g> തവണ തെറ്റായി ടൈപ്പുചെയ്തു. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"നിങ്ങളുടെ പാറ്റേൺ <xliff:g id="NUMBER_0">%d</xliff:g> തവണ തെറ്റായി വരച്ചു. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"നിങ്ങളുടെ ഫോൺ <xliff:g id="NUMBER">%d</xliff:g> തവണ തെറ്റായി അൺലോക്കുചെയ്യാൻ ശ്രമിച്ചു. ഔദ്യോഗിക പ്രൊഫൈൽ നീക്കംചെയ്യുന്നതിനാൽ എല്ലാ പ്രൊഫൈൽ വിവരങ്ങളും ഇല്ലാതാക്കും."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"നിങ്ങളുടെ അൺലോക്ക് പാറ്റേൺ <xliff:g id="NUMBER_0">%d</xliff:g> തവണ തെറ്റായി വരച്ചു. <xliff:g id="NUMBER_1">%d</xliff:g> ശ്രമങ്ങൾ കൂടി വിജയിച്ചില്ലെങ്കിൽ, ഒരു ഇമെയിൽ അക്കൗണ്ട് ഉപയോഗിച്ച് ടാബ്ലെറ്റ് അൺലോക്ക് ചെയ്യാൻ നിങ്ങളോട് ആവശ്യപ്പെടും.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> സെക്കൻഡിനുള്ള വീണ്ടും ശ്രമിക്കുക."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"നിങ്ങളുടെ അൺലോക്ക് പാറ്റേൺ <xliff:g id="NUMBER_0">%d</xliff:g> തവണ തെറ്റായി വരച്ചു. <xliff:g id="NUMBER_1">%d</xliff:g> ശ്രമങ്ങൾ കൂടി വിജയിച്ചില്ലെങ്കിൽ, ഒരു ഇമെയിൽ അക്കൗണ്ട് ഉപയോഗിച്ച് ഫോൺ അൺലോക്ക് ചെയ്യാൻ നിങ്ങളോട് ആവശ്യപ്പെടും.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> സെക്കൻഡിനുള്ള വീണ്ടും ശ്രമിക്കുക."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"നീക്കംചെയ്യുക"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"സിം പിൻ കോഡ് തെറ്റാണ്, നിങ്ങളുടെ ഉപകരണം അൺലോക്കുചെയ്യാൻ ഇപ്പോൾ നിങ്ങളുടെ കാരിയറുമായി ബന്ധപ്പെടണം."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"തെറ്റായ സിം പിൻ കോഡ്, നിങ്ങളുടെ ഉപകരണം അൺലോക്കുചെയ്യാൻ സേവനദാതാവുമായി ബന്ധപ്പെടുന്നതിന് മുമ്പായി നിങ്ങൾക്ക് <xliff:g id="NUMBER">%d</xliff:g> ശ്രമം കൂടി ബാക്കിയുണ്ട്."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"സിം പിൻ പ്രവർത്തനം പരാജയപ്പെട്ടു!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"സിം PUK പ്രവർത്തനം പരാജയപ്പെട്ടു!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"കോഡ് അംഗികരിച്ചു!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"മുമ്പത്തെ ട്രാക്ക് ബട്ടൺ"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"പുതിയ ട്രാക്ക് ബട്ടൺ"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"താൽക്കാലികമായി നിർത്തുക ബട്ടൺ"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"പ്ലേ ബട്ടൺ"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"നിർത്തുക ബട്ടൺ"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"സേവനമൊന്നുമില്ല."</string>
</resources>
diff --git a/packages/Keyguard/res/values-mn-rMN/strings.xml b/packages/Keyguard/res/values-mn-rMN/strings.xml
index f2d6f8c..0182a6c 100644
--- a/packages/Keyguard/res/values-mn-rMN/strings.xml
+++ b/packages/Keyguard/res/values-mn-rMN/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Тайлах нууц үгийг бичнэ үү"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Тайлах PIN-г оруулна уу"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Буруу PIN код."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Тайлах бол Цэсийг дараад 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Нүүрээр түгжээ тайлах оролдлогын тоо дээд хэмжээнээс хэтэрсэн"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Цэнэглэгдэв"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Цэнэглэж байна"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Цэнэглэгчээ холбоно уу."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM карт түгжигдсэн."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM картны PUK-түгжигдсэн."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM картны түгжээг гаргаж байна…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d. -н %2$d виджет"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Виджет нэмэх."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Хоосон"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Тайлах хэсэг нээгдсэн."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Тайлах хэсэг хаагдсан."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> виджет."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Хэрэглэгч сонгоч"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Камер"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Медиа контрол"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Виджет дахин эрэмбэлж эхлэв."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Виджетийг дахин эрэмбэлж дуусав."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> виджет устсан."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Түгжээгүй хэсгийг өргөсгөх."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Тайлах гулсуулалт."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Тайлах хээ."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Нүүрээр тайлах"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Тайлах пин."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN талбар"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN талбар"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK талбар"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Өмнөх бичлэг товч"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Дараагийн бичлэг товч"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Түр зогсоох товч"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Тоглуулах товч"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Зогсоох товч"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Сайн"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Онцгүй"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Зүрх"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Үргэлжлүүлэхийн тулд түгжээг тайлна уу"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Эхлүүлэхийг цуцалсан"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Устгахын тулд <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>-г тавина уу."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> устахгүй."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Дараагийн сэрүүлгийг <xliff:g id="ALARM">%1$s</xliff:g>-д тохируулсан"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"АБВ"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Цуцлах"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Устгах"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Дуусгах"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Горим өөрчлөх"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Шифт"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Оруулах"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Тайлах"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Камер"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Чимээгүй"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Дуунууд идэвхтэй"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Хайх"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-г гулсуулах."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх бол доош гулсуулах."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх зүүнлүү гулсуулах."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх бол баруунлуу гулсуулах."</string>
- <string name="user_switched" msgid="3768006783166984410">"Одоогийн хэрэглэгч <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Яаралтай дуудлага"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Хээг мартсан"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Буруу хээ"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Зөв PUK кодыг дахин оруулна уу. Давтан оролдвол SIM нь бүрмөсөн идэвхгүй болгоно."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN кодууд таарахгүй байна"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Хээ оруулах оролдлого хэт олон"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Түгжээг тайлах бол Google акаунтаараа нэвтэрнэ үү."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Хэрэглэгчийн нэр (имэйл)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Нууц үг"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Нэвтрэх"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Хэрэглэгчийн нэр эсвэл нууц үг буруу."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Хэрэглэгчийн нэр нууц үгээ мартсан уу?\n"<b>"google.com/accounts/recovery"</b>"-д зочилно уу."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Акаунт шалгаж байна…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Та PIN кодоо <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу бичив. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Та PIN кодоо <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу бичив. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Та тайлах хээг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Та утасны түгжээг тайлах оролдлогыг <xliff:g id="NUMBER">%d</xliff:g> удаа буруу оруулсан байна. Ажлын профайл устгагдаж, улмаар профайлын бүх мэдээлэл устах болно."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Та тайлах хээг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оруулбал, та таблетаа тайлахын тулд имэйл акаунт шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Та тайлах хээг <xliff:g id="NUMBER_0">%d</xliff:g> удаа буруу зурлаа. <xliff:g id="NUMBER_1">%d</xliff:g> удаа дахин буруу оруулбал, та утсаа тайлахын тулд имэйл акаунтаа ашиглах шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> секундын дараа дахин оролдоно уу."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Устгах"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"СИМ ПИН код буруу, та төхөөрөмжийн түгжээг тайлахын тулд оператор компанитай холбоо барих шаардлагатай."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"СИМ ПИН код буруу байна, танд мобайл оператор компанитай холбогдохгүйгээр төхөөрөмжийн түгжээг тайлахад <xliff:g id="NUMBER">%d</xliff:g> оролдлого хийх боломж үлдсэн байна."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"СИМ ПИН ажиллуулах амжилтгүй боллоо!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"СИМ ПҮК ажиллуулах амжилтгүй боллоо!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Код зөвшөөрөгдлөө!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Өмнөх дуу товч"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Дараагийн дуу товч"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Түр зогсох товч"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Тоглуулах товч"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Зогсоох товч"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Үйлчилгээ байхгүй."</string>
</resources>
diff --git a/packages/Keyguard/res/values-mr-rIN/strings.xml b/packages/Keyguard/res/values-mr-rIN/strings.xml
index 47b6ebb..fc30fc8 100644
--- a/packages/Keyguard/res/values-mr-rIN/strings.xml
+++ b/packages/Keyguard/res/values-mr-rIN/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"अनलॉक करण्यासाठी संकेतशब्द टाइप करा"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"अनलॉक करण्यासाठी पिन टाइप करा"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"अयोग्य पिन कोड."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"अनलॉक करण्यासाठी, मेनू दाबा नंतर 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"कमाल चेहरा अनलॉक प्रयत्न ओलांडले"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"चार्ज झाली"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"चार्ज होत आहे"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"आपले चार्जर कनेक्ट करा."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"सिम कार्ड लॉक झाले आहे."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"सिम कार्ड PUK-लॉक केलेले आहे."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"सिम कार्ड अनलॉक करत आहे…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d पैकी %2$d विजेट."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"विजेट जोडा."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"रिक्त"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"अनलॉक क्षेत्र विस्तृत केले."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"अनलॉक क्षेत्र संकुचित केले."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> विजेट."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"वापरकर्ता निवडकर्ता"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"कॅमेरा"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"मीडिया नियंत्रणे"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"विजेट पुनर्क्रमित करणे प्रारंभ झाले."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"विजेट पुनर्क्रमित करणे समाप्त झाले."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"विजेट <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> हटविले."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"अनलॉक क्षेत्र विस्तृत करा."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"स्लाइड अनलॉक."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"नमुना अनलॉक."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"चेहरा अनलॉक."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"पिन अनलॉक."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"पिन क्षेत्र"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"सिम पिन क्षेत्र"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"सिम PUK क्षेत्र"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"मागील ट्रॅक बटण"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"पुढील ट्रॅक बटण"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"विराम बटण"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"प्ले बटण"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"थांबवा बटण"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"उत्तम"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"वाईट"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"हृदय"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"सुरु ठेवण्यासाठी अनलॉक करा"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"लाँच रद्द केले"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"हटविण्यासाठी <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ड्रॉप करा."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> हटविली जाणार नाही."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"पुढील अलार्म <xliff:g id="ALARM">%1$s</xliff:g> साठी सेट केला"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"रद्द करा"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"हटवा"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"पूर्ण झाले"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"मोड बदल"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"प्रविष्ट करा"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"अनलॉक करा"</string>
- <string name="description_target_camera" msgid="969071997552486814">"कॅमेरा"</string>
- <string name="description_target_silent" msgid="893551287746522182">"मूक"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"ध्वनी सुरु"</string>
- <string name="description_target_search" msgid="3091587249776033139">"शोध"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी वर स्लाइड करा."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी खाली स्लाइड करा."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी डावीकडे स्लाइड करा."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी उजवीकडे स्लाइड करा."</string>
- <string name="user_switched" msgid="3768006783166984410">"वर्तमान वापरकर्ता <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"आणीबाणीचा कॉल"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"नमुना विसरलात"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"चुकीचा नमुना"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"योग्य PUK कोड पुन्हा-प्रविष्ट करा. परत प्रयत्न करणे सिम कायमचे अक्षम करेल."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"पिन कोड जुळत नाहीत"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"बरेच नमुना प्रयत्न"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"अनलॉक करण्यासाठी, आपल्या Google खात्यासह साइन इन करा."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"वापरकर्तानाव (ईमेल)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"संकेतशब्द"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"साइन इन करा"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"अवैध वापरकर्तानाव किंवा संकेतशब्द."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"आपले वापरकर्तानाव किंवा संकेतशब्द विसरलात?\n "<b>"google.com/accounts/recovery"</b>" ला भेट द्या."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"खाते तपासत आहे…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"आपण आपला पिन <xliff:g id="NUMBER_0">%d</xliff:g> वेळा अयोग्यरितीने टाइप केला आहे. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"आपण आपला संकेतशब्द <xliff:g id="NUMBER_0">%d</xliff:g> वेळा अयोग्यरितीने टाइप केला आहे. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"आपण आपला अनलॉक नमुना <xliff:g id="NUMBER_0">%d</xliff:g> वेळा अयोग्यरितीने काढला आहे. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"आपण फोन अनलॉक करण्याचा <xliff:g id="NUMBER">%d</xliff:g> वेळा चुकीच्या पद्धतीने प्रयत्न केला आहे. कार्य प्रोफाईल काढले जाईल, जे सर्व प्रोफाईल डेटा हटवेल."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"आपण आपला अनलॉक नमुना <xliff:g id="NUMBER_0">%d</xliff:g> वेळा अयोग्यपणे काढला आहे. आणखी <xliff:g id="NUMBER_1">%d</xliff:g> अयशस्वी प्रयत्नांनंतर, आपल्याला ईमेल खाते वापरून आपला टॅब्लेट अनलॉक करण्यास सांगितले जाईल.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"आपण आपला अनलॉक नमुना <xliff:g id="NUMBER_0">%d</xliff:g> वेळा अयोग्यपणे काढला आहे. आणखी <xliff:g id="NUMBER_1">%d</xliff:g> अयशस्वी प्रयत्नांनंतर, आपल्याला ईमेल खाते वापरून आपला फोन अनलॉक करण्यास सांगितले जाईल.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"काढा"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"सिम पिन कोड चुकीचा आहे आपण आता आपले डिव्हाइस अनलॉक करण्यासाठी आपल्या वाहकाशी संपर्क साधावा."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"सिम पिन कोड चुकीचा आहे, आपण आपले डिव्हाइस अनलॉक करण्यासाठी आपल्या वाहकाशी संपर्क साधण्यापूर्वी आपल्याकडे <xliff:g id="NUMBER">%d</xliff:g> प्रयत्न उर्वरित आहेत."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"सिम पिन कार्य अयशस्वी झाले!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"सिम PUK कार्य अयशस्वी झाले!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"कोड स्वीकारला!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"मागील ट्रॅक बटण"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"पुढील ट्रॅक बटण"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"विराम बटण"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"प्ले बटण"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"थांबवा बटण"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"सेवा नाही."</string>
</resources>
diff --git a/packages/Keyguard/res/values-ms-rMY/strings.xml b/packages/Keyguard/res/values-ms-rMY/strings.xml
index 8f46081..e1907da 100644
--- a/packages/Keyguard/res/values-ms-rMY/strings.xml
+++ b/packages/Keyguard/res/values-ms-rMY/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Taip kata laluan untuk membuka kunci"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Taip PIN untuk membuka kunci"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Kod PIN salah."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Untuk membuka kunci, tekan Menu, kemudian 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Telah melepasi had cubaan Buka Kunci Wajah"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Sudah dicas"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Mengecas"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Sambungkan pengecas anda."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Kad SIM dikunci."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Kad SIM dikunci dengan PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Membuka kunci kad SIM..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d dari %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Tambah widget."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Kosong"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Bahagian buka kunci dikembangkan."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Bahagian buka kunci diruntuhkan."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Pemilih pengguna"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Kawalan media"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Penyusunan semula widget dimulakan."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Penyusunan semula widget tamat."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> dipadamkan."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Kembangkan bahagian buka kunci."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Buka kunci luncur."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Buka kunci corak."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Wajah Buka Kunci"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Buka kunci pin."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Kawasan PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Kawasan PIN SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Kawasan PUK SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Butang lagu sebelumnya"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Butang lagu seterusnya"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Butang jeda"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Butang main"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Butang berhenti"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Menyukai"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Tidak diterima"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Jantung"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Buka kunci untuk meneruskan"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Pelancaran dibatalkan"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Jatuhkan <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> untuk memadam."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> tidak akan dipadamkan."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Penggera seterusnya ditetapkan pada <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Batal"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Padam"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Selesai"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Perubahan mod"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Masuk"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Buka kunci"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Senyap"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Bunyi dihidupkan"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Carian"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Luncurkan ke atas untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Luncurkan ke bawah untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Luncurkan ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Luncurkan ke kanan untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Pengguna semasa <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Panggilan kecemasan"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Lupa Corak"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Corak Salah"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Masukkan semula kod PIN yang betul. Percubaan berulang akan melumpuhkan SIM secara kekal."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Kod PIN tidak sepadan"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Terlalu banyak percubaan melukis corak"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Untuk membuka kunci, log masuk dengan akaun Google anda."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Nama Pengguna (E-mel)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Kata laluan"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Log masuk"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Nama pengguna atau kata laluan tidak sah."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Lupa nama pengguna atau kata laluan anda?\nLawati"<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Menyemak akaun…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Anda telah menaip PIN anda secara salah sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. \n\nCuba lagi dalam <xliff:g id="NUMBER_1">%d</xliff:g> saat."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Anda telah menaip kata laluan anda secara salah sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. \n\nCuba lagi dalam <xliff:g id="NUMBER_1">%d</xliff:g> saat."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Anda telah tersilap melukis corak buka kunci anda sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. \n\nCuba lagi dalam <xliff:g id="NUMBER_1">%d</xliff:g> saat."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Anda telah salah membuka kunci telefon sebanyak <xliff:g id="NUMBER">%d</xliff:g> kali. Profil kerja ini akan dialih keluar sekali gus memadam semua data profil."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Anda telah tersilap melukis corak buka kunci sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%d</xliff:g> lagi percubaan yang tidak berjaya, anda akan diminta membuka kunci tablet anda menggunakan log masuk Google anda.\n\n Cuba lagi dalam <xliff:g id="NUMBER_2">%d</xliff:g> saat."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Anda telah tersilap lukis corak buka kunci sebanyak <xliff:g id="NUMBER_0">%d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%d</xliff:g> lagi percubaan yang tidak berjaya, anda akan diminta membuka kunci telefon anda menggunakan log masuk Google anda.\n\n Cuba lagi dalam <xliff:g id="NUMBER_2">%d</xliff:g> saat."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Alih keluar"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Kod PIN SIM tidak betul, jadi anda harus menghubungi pembawa anda untuk membuka kunci peranti."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Kod PIN SIM tidak betul. Anda mempunyai <xliff:g id="NUMBER">%d</xliff:g> percubaan lagi sebelum anda harus menghubungi pembawa anda untuk membuka kunci peranti."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Operasi PIN SIM gagal!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Operasi PUK SIM gagal!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Kod Diterima!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Butang lagu sebelumnya"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Butang lagu seterusnya"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Butang jeda"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Butang main"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Butang berhenti"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Tiada perkhidmatan."</string>
</resources>
diff --git a/packages/Keyguard/res/values-my-rMM/strings.xml b/packages/Keyguard/res/values-my-rMM/strings.xml
index a7ba0e5..5c0b6e8 100644
--- a/packages/Keyguard/res/values-my-rMM/strings.xml
+++ b/packages/Keyguard/res/values-my-rMM/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"သော့ဖွင့်ရန် စကားဝှက်ကို ရိုက်ထည့်ပါ"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"သော့ဖွင့်ရန် PIN ကို ရိုက်ထည့်ပါ"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ပင်နံပါတ်မှားနေပါသည်"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"သော့ဖွင့်ရန် Menu ထိုနောက်0ကိုနှိပ်ပါ"</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"မျက်မှာမှတ် သော့ဖွင့်ခြင်း ခွင့်ပြုသော အကြိမ်ရေထက် ကျော်လွန်သွားပါပြီ"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"အားသွင်းနေပါသည်"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"အားသွင်းနေ"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"အားသွင်းကြိုးဖြင့် ဆက်သွယ်ပါ"</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"ဆင်းမ်ကဒ် သော့ကျနေပါသည်"</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ဆင်းမ်ကဒ် ရဲ့ ပင်နံပါတ် ပြန်ဖွင့်သည့် ကုဒ် သော့ကျနေပါသည်"</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"ဆင်းမ်ကဒ် ကို သော့ဖွင့်နေပါသည်"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$d ရဲ့ဝဒ်ဂျက် %2$d"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ဝဒ်ဂျက်ထည့်ရန်"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"အလွတ်"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"သောဖွင့်ထားသော နေရာကို ချဲ့လိုက်ခြင်း"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"သောဖွင့်ထားသော နေရာကို ချုံ့လိုက်ခြင်း"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ဝဒ်ဂျက်"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"အသုံးပြုသူ ရွေးချယ်ရာ"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"ကင်မရာ"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"မီဒီယာ ထိန်းချုပ်မှုများ"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"ဝဒ်ဂျက်များ နေရာစီခြင်း စတင်ပါပြီ"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"ဝဒ်ဂျက်များကို နေရာ ပြန်စီပြီးပါပြီ"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ဝဒ်ဂျက်ကို ဖျက်လိုက်ပြီးပါပြီ"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"သော့မချထားသာ နယ်ပယ်ကို ချဲ့ပါ"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"ဘေးတိုက်ပွတ်ဆွဲ၍ သော့ဖွင့်ခြင်း"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ပုံစံဖြင့် သော့ဖွင့်ခြင်း"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"မျက်နှာမှတ် သော့ဖွင့်ခြင်း"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ပင်နံပါတ်ဖြင့် သော့ဖွင့်ခြင်း"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN နေရာ"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN နေရာ"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK နေရာ"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"ပြီးခဲ့သော အပုဒ်အတွက် ခလုတ်"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"နောက်တစ်ပုဒ် ခလုတ်"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ခဏရပ်ရန် ခလုတ်"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ဖွင့်ရန် ခလုတ်"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ရပ်ရန် ခလုတ်"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"လက်မထောင်"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"လက်မချ"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"နှလုံးသား"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ရှေ့ဆက်လုပ်ရန် သော့ဖွင့်ပါ"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ဖွင့်တာကို ပယ်ဖျက်ပါ"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ကို ဖျက်ပစ်ရန် ချ လိုက်ပါ"</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ကို ဖျက်ပစ်မည် မဟုတ်ပါ"</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"<xliff:g id="ALARM">%1$s</xliff:g> အတွက် နောက် သတိပေးရန် သတ်မှတ်ချက်"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Altခလုတ်"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"ပယ်ဖျက်ရန်ခလုတ်"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ဖျက်ရန်ခလုတ်"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"ပြီးဆုံးသည့်ခလုတ်"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"စနစ်ပြောင်းခြင်းခလုတ်"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shiftခလုတ်"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enterခလုတ်"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"ဖွင့်ရန်"</string>
- <string name="description_target_camera" msgid="969071997552486814">"ကင်မရာ"</string>
- <string name="description_target_silent" msgid="893551287746522182">"အသံတိတ်ရန်"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"အသံဖွင့်သည်"</string>
- <string name="description_target_search" msgid="3091587249776033139">"ရှာဖွေရန်"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် အပေါ်ကို ပွတ်ဆွဲပါ"</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် အောက်ကို ပွတ်ဆွဲပါ"</string>
- <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် ဖယ်ဘက်ကို ပွတ်ဆွဲပါ"</string>
- <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် ညာဖက်ကို ပွတ်ဆွဲပါ"</string>
- <string name="user_switched" msgid="3768006783166984410">"လက်ရှိအသုံးပြုနေသူ <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"အရေးပေါ် ခေါ်ဆိုမှု"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ပုံဖော်မှုအား မေ့လျော့ခြင်း"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ပုံဆွဲအမှား"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"ပင်နံပါတ် ပြန်ဖွင့်သည့် ကုဒ်ကို ပြန်လည် ရိုက်ထည့်ပါ.။ ထပ်ခါ ထပ်ခါ ကြိုးစားခြင်းသည် ဆင်းမ်ကဒ်ကို အသုံးပြုမရအောင် ဖြစ်နေနိုင်ပါသည်။"</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"ပင် နံပါတ် မတူညီပါ"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"မြောက်မြားစွာ ပုံစံဆွဲ သော့ဖွင့်မှု"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"သော့ဖွင့်ရန် သင့်ရဲ့ ဂူဂယ်လ် အကောင့်ဖြင့် ဝင်ပါ"</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"သုံးစွဲသူအမည် (အီးမေးလ်)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"စကားဝှက်"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"ဝင်ပါ"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"အသုံးပြုသူ အမည် သို့ စကားဝှက်မမှန်ကန်ပါ"</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"သင် သုံးစွဲသူ အမည် သို့ စကားဝှက်အားမေ့နေပါသလား။\n"<b>"google.com/accounts/recovery"</b>" သို့ သွားရောက်ပါ"</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"အကောင့်ကို စစ်ဆေးနေစဉ်..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"သင် ပင် နံပါတ်ကို အမှားကို <xliff:g id="NUMBER_0">%d</xliff:g> ကြိမ် ရိုက်ထည့်ပြီးပါပြီ။ \n\n<xliff:g id="NUMBER_1">%d</xliff:g> စက္ကန့် အကြာတွင် ပြန်လည်ကြိုးစားပါ"</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"သင်သည် စကားဝှက်ကို <xliff:g id="NUMBER_0">%d</xliff:g> ကြိမ် မှားရိုက်ပြီးပါပြီ။ \n\n <xliff:g id="NUMBER_1">%d</xliff:g> စက္ကန့်အကြာ ပြန်လည်ကြိုးစားပါ"</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"သင် ပုံစံဆွဲ သော့ဖွင့်ခြင်းကို <xliff:g id="NUMBER_0">%d</xliff:g> ကြိမ်မြောက် မအောင်မြင်ပါ။ \n\n<xliff:g id="NUMBER_1">%d</xliff:g> စက္ကန့်အကြာတွင် ပြန်လည် ကြိုးစားပါ"</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"ဖုန်းအား သော့ဖွင့်ရန် သင် <xliff:g id="NUMBER">%d</xliff:g> ကြိမ် ကြိုးစားရာ မမှန်ကန်ခဲ့ပါ။ အလုပ်ပရိုဖိုင် ဖယ်ထုတ်ခံရမည်ဖြစ်ပြီး၊ ပရိုဖိုင်ဒေတာအားလုံး ပျက်သွားမည်ဖြစ်သည်။"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"သင် ပုံဖော်၍သော့ဖွင့်ခြင်းကို <xliff:g id="NUMBER_0">%d</xliff:g> အကြိမ် မှန်ကန်စွာ မပြုလုပ်နိုင်ပါ။ နောက်ထပ် <xliff:g id="NUMBER_1">%d</xliff:g> အကြိမ် မမှန်ကန်ပါက သင့်တက်ဘလက်အား အီးမေးလ်အသုံးပြု၍ သော့ဖွင့်ရန် တောင်းဆိုပါလိမ့်မည်။ \n\n <xliff:g id="NUMBER_2">%d</xliff:g> စက္ကန့်အကြာတွင် ပြန်လည် ကြိုးစားပါ"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"သင် ပုံဖော်၍သော့ဖွင့်ခြင်းကို <xliff:g id="NUMBER_0">%d</xliff:g> အကြိမ် မှန်ကန်စွာ မပြုလုပ်နိုင်ပါ။ နောက်ထပ် <xliff:g id="NUMBER_1">%d</xliff:g> အကြိမ် မမှန်ကန်ပါက သင့်ဖုန်းအား အီးမေးလ်အသုံးပြု၍ သော့ဖွင့်ရန် တောင်းဆိုပါလိမ့်မည်။ \n\n <xliff:g id="NUMBER_2">%d</xliff:g> စက္ကန့်အကြာတွင် ပြန်လည် ကြိုးစားပါ"</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ဖယ်ရှားရန်"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"ဆင်းကဒ် လျှို့ဝှက် အမှတ် မှားယွင်းပါသည်, ဖုန်းလိုင်းဌာနကို ဆက်သွယ်ရမည် ဖြစ်ပါတယ်"</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"ဆင်းမ်ကဒ်၏ လျှို့ဝှက်နံပါတ် မှားနေပါသည်၊ သင်၏ စက်ပစ္စည်းကို သော့ဖွင့်ရန် ဖုန်းလိုင်းဌာနသို့ မဆက်သွယ်မီ သင့်တွင် <xliff:g id="NUMBER">%d</xliff:g> ခါ ကြိုးစားခွင့် ကျန်ပါသေးသည်။"</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"ဆင်းမ်ကဒ် ပင် လုပ်ဆောင်မှု မအောင်မြင်ပါ"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"ပင်နံပါတ် ပြန်ဖွင့်သည့် ကုဒ် လုပ်ဆောင်မှု မအောင်မြင်ပါ"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"ကုဒ်နံပါတ်ကို လက်ခံလိုက်ပါသည်"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"ပြီးခဲ့သော အပုဒ်အတွက် ခလုတ်"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"နောက် သီချင်းပုဒ် ခလုတ်"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"ခဏရပ်ရန် ခလုတ်"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"ဖွင့်ရန် ခလုတ်"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"ရပ်ရန် ခလုတ်"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"ဆားဗစ် မရှိပါ"</string>
</resources>
diff --git a/packages/Keyguard/res/values-nb/strings.xml b/packages/Keyguard/res/values-nb/strings.xml
index 0f7fa66..c84f74e 100644
--- a/packages/Keyguard/res/values-nb/strings.xml
+++ b/packages/Keyguard/res/values-nb/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Skriv inn passord for å låse opp"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Skriv inn PIN-kode for å låse opp"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Feil personlig kode."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"For å låse opp, trykk på menyknappen og deretter 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Du har overskredet grensen for opplåsingsforsøk med Ansiktslås"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Oppladet"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Lader"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Koble til laderen."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-kortet er låst."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kortet er PUK-låst."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Låser opp SIM-kortet ..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Modul %2$d av %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Legg til modul."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tom"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Opplåsingsfeltet vises."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Opplåsingsfeltet skjules."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>-modul."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Brukervelgeren"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Mediekontroll"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Endring av modulplasseringen har startet."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Endringen av modulplasseringen er ferdig."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Modulen <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ble slettet."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Vis opplåsingsfeltet."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Opplåsning ved å dra med fingeren."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Mønsteropplåsning."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Ansiktsopplåsning."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-opplåsning."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-området"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"PIN-området for SIM-kortet"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"PUK-området for SIM-kortet"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Forrige spor-knapp"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Neste spor-knapp"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pause-knapp"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Avspillingsknapp"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stopp-knapp"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Likt av meg"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Sanger du ikke liker"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hjerte"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Lås opp for å fortsette"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Starten ble kansellert"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Slipp <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> for å slette den."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> blir ikke slettet."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Neste alarm er innstilt for <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Avbryt"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Slett"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Ferdig"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Modusendring"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Lås opp"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Stille"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Lyd på"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Søk"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Dra opp for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Dra ned for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Dra til venstre for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Dra til høyre for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Gjeldende bruker: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Nødnummer"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Har du glemt mønsteret?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Feil mønster"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Skriv inn den korrekte PUK-koden på nytt. Gjentatte forsøk kommer til å deaktivere SIM-kortet."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN-kodene stemmer ikke overens"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"For mange forsøk på tegning av mønster"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Logg på med Google-kontoen din for å låse opp."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Brukernavn (e-postadresse)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Passord"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Logg på"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Ugyldig brukernavn eller passord."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Har du glemt brukernavnet eller passordet?\nGå til "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Sjekker kontoen ..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Du har oppgitt feil PIN-kode <xliff:g id="NUMBER_0">%d</xliff:g> ganger. \n\nPrøv på nytt om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Du har tastet inn passordet ditt feil <xliff:g id="NUMBER_0">%d</xliff:g> ganger. \n\nPrøv på nytt om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Du har tegnet opplåsningsmønsteret ditt feil <xliff:g id="NUMBER_0">%d</xliff:g> ganger. \n\nPrøv på nytt om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Du har gjort feil i forsøket på å låse opp telefonen <xliff:g id="NUMBER">%d</xliff:g> ganger. Arbeidsprofilen blir fjernet, og alle profildata blir slettet."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Du har tegnet opplåsningsmønsteret feil <xliff:g id="NUMBER_0">%d</xliff:g> ganger. Etter ytterligere <xliff:g id="NUMBER_1">%d</xliff:g> gale forsøk, blir du bedt om å låse opp nettbrettet via en e-postkonto.\n\n Prøv på nytt om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Du har tegnet opplåsningsmønsteret feil <xliff:g id="NUMBER_0">%d</xliff:g> ganger. Etter ytterligere <xliff:g id="NUMBER_1">%d</xliff:g> gale forsøk, blir du bedt om å låse opp telefonen via en e-postkonto.\n\n Prøv på nytt om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Fjern"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Feil PIN-kode for SIM-kortet. Du må nå kontakte operatøren din for å låse opp enheten."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Feil PIN-kode for SIM-kortet. Du har <xliff:g id="NUMBER">%d</xliff:g> forsøk igjen før du må kontakte operatøren din for å låse opp enheten."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"PIN-koden for SIM-kortet ble avvist."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"PUK-koden for SIM-kortet ble avvist."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Koden er godkjent."</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Forrige spor-knapp"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Neste spor-knapp"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pause-knapp"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Avspillingsknapp"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Stopp-knappen"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Ingen tjeneste."</string>
</resources>
diff --git a/packages/Keyguard/res/values-ne-rNP/strings.xml b/packages/Keyguard/res/values-ne-rNP/strings.xml
index 00b9ece..d9d0e2e 100644
--- a/packages/Keyguard/res/values-ne-rNP/strings.xml
+++ b/packages/Keyguard/res/values-ne-rNP/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"अनलक गर्न पासवर्ड टाइप गर्नुहोस्।"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"अनलक गर्न PIN कोड टाइप गर्नुहोस्"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"गलत PIN कोड।"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"अनलक गर्न मेनु थिच्नुहोस् र त्यसपछि ० थिच्नुहोस्।"</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"अत्याधिक मोहडा खोल्ने प्रयासहरू बढी भए।"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"चार्ज भयो"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"चार्ज हुँदै"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"तपाईँको चार्जर जोड्नुहोस्।"</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM कार्ड लक गरियो।"</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM कार्ड PUK-लक छ।"</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM कार्ड अनलक हुँदै…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. विजेट %2$d of %3$d।"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"विजेट थप गर्नुहोस्।"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"खाली"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"अनलक क्षेत्र विस्तार भयो।"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"अनलक क्षेत्र भत्कियो।"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> विजेट।"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"प्रयोगकर्ता छनौटकर्ता"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"क्यामेरा"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"मिडिया नियन्त्रणहरू"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"विजेट पुनःक्रम गर्ने सुरु भयो।"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"विजेट पुनःक्रम समाप्त भएको छ।"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"विजेट <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> मेटाइयो।"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"अनलक क्षेत्र बढाउनुहोस्।"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"स्लाइड अनलक।"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ढाँचा अनलक।"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"फेस अनलक"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin अनलक"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"पीन क्षेत्र"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM पिन क्षेत्र"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM पुक क्षेत्र"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"अघिल्लो पथ बटन"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"अर्को पथ बटन"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"रोक्ने बटन"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"बजाउने बटन"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"बटन रोक्नुहोस्"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"मन परेको"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"मन परेन"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"मुटु"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"जारी राख्न अनलक गर्नुहोस्"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"सुरुवात रद्द गरियो"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"मेट्नको लागि <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ड्रप गर्नुहोस्"</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> मेटिने छैन।"</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"<xliff:g id="ALARM">%1$s</xliff:g> को लागि अर्को चेतावनी सेट"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?१२३"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"रद्द गर्नुहोस्"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"मेट्नुहोस्"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"भयो"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"मोड परिवर्तन गर्नुहोस्"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"प्रविष्टि गर्नुहोस्"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"अनलक गर्नुहोस्"</string>
- <string name="description_target_camera" msgid="969071997552486814">"क्यामेरा"</string>
- <string name="description_target_silent" msgid="893551287746522182">"मौन"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"आवाज चालू"</string>
- <string name="description_target_search" msgid="3091587249776033139">"खोज्नुहोस्"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि माथि धिसार्नुहोस्"</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> को लागि तल स्लाइड गर्नुहोस्।"</string>
- <string name="description_direction_left" msgid="7207478719805562165">"स्लाइड <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि बायाँ।"</string>
- <string name="description_direction_right" msgid="8034433242579600980">"स्लाइड <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि दायाँ।"</string>
- <string name="user_switched" msgid="3768006783166984410">"अहिलेको प्रयोगकर्ता <xliff:g id="NAME">%1$s</xliff:g>।"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"आपतकालीन कल"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ढाँचा बिर्सनु भयो"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत ढाँचा"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"PUK कोड पुन:प्रदान गर्नुहोस्। धेरै पुन:प्रयासहरूले SIMलाई स्थायी रूपमा निष्क्रिय गरिदिने छ।"</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN कोडहरू मेल खाएन"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"निकै धेरै ढाँचा कोसिसहरू"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"अनलक गर्नको लागि, तपाईँको Google खाताको साथ साइन इन गर्नुहोस्।"</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"प्रयोगकर्ता नाम (इमेल)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"पासवर्ड"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"साइन इन गर्नुहोस्"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"अमान्य प्रयोगकर्तानाम वा पासवर्ड।"</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"के तपाईँले उपयोगकर्ता नाम वा पासवर्ड बिर्सनुभयो?\n"<b>"google.com/accounts/recovery"</b>" मा जानुहोस्।"</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"खाता जाँच हुँदै…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"तपाईँले गलत तरिकाले तपाईँको PIN <xliff:g id="NUMBER_0">%d</xliff:g> पटक टाइप गर्नु भएको छ। \n\n<xliff:g id="NUMBER_1">%d</xliff:g> सेकेन्डमा फेरि प्रयास गर्नुहोस्।"</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"तपाईँले तपाईँक पासवर्ड <xliff:g id="NUMBER_0">%d</xliff:g> पटक गलत टाइप गर्नुभएको छ। \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकेन्डमा फेरि प्रयास गर्नुहोस्।"</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"तपाईँले तपाईँको अनलक ढाँचा गलत तरिकाले <xliff:g id="NUMBER_0">%d</xliff:g> पटक खिच्नु भएको छ। \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकेन्डमा फेरि कोसिस गर्नुहोस्।"</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"तपाईंले गलत तरिकाले फोन अनलक गर्ने प्रयास गर्नु भएको छ <xliff:g id="NUMBER">%d</xliff:g> पटक। काम प्रोफाइल हटाइनेछ जसले सम्पूर्ण प्रोफाइल डेटा मेट्नेछ।"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"तपाईंले गलत तरिकाले आफ्नो अनलक ढाँचा <xliff:g id="NUMBER_0">%d</xliff:g> पटक कोर्नुभयो। <xliff:g id="NUMBER_1">%d</xliff:g> विफल प्रयत्नहरू पछि, तपाईंलाई आफ्नो ट्याब्लेट इमेल खाता प्रयोग गरेर अनलक गर्न सोधिने छ।\n\n फेरि प्रयास गर्नुहोस् <xliff:g id="NUMBER_2">%d</xliff:g> सेकेन्डहरूमा।"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"तपाईँले आफ्नो अनलक ढाँचा गलत रूपमा <xliff:g id="NUMBER_0">%d</xliff:g> पटक तान्नु भएको छ। <xliff:g id="NUMBER_1">%d</xliff:g> धेरै असफल प्रयासहरूपछि, तपाईँलाई एउटा इमेल खाताको प्रयोग गरेर तपाईँको फोन अनलक गर्न सोधिने छ।\n\n फेरि <xliff:g id="NUMBER_2">%d</xliff:g> सेकेन्डमा प्रयास गर्नुहोस्।"</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"हटाउनुहोस्"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM PIN कोड गलत छ। अब तपाईंले अाफ्नो उपकरण खोल्नलाई तपाईंको वाहकसँग सम्पर्क गर्नै पर्दर।"</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"SIM PIN कोड गलत छ, तपाईंले अाफ्नो उपकरण खोल्नलाई तपाईंको वाहकसँग सम्पर्क गर्नै पर्दछ यस अघि तपाईंसँग <xliff:g id="NUMBER">%d</xliff:g> बाँकी प्रयास छ।"</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN राख्ने कार्य बिफल भयो!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK राख्ने कार्य बिफल भयो!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"कोड स्वीकृत!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"अघिल्लो ट्रयाक बटन"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"अर्को ट्रयाक बटन"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"रोक्ने बटन"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"बटन बजाउनुहोस्"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"बटन रोक्नुहोस्"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"कुनै सेवा छैन।"</string>
</resources>
diff --git a/packages/Keyguard/res/values-nl/strings.xml b/packages/Keyguard/res/values-nl/strings.xml
index 518a1e1..2011b7c 100644
--- a/packages/Keyguard/res/values-nl/strings.xml
+++ b/packages/Keyguard/res/values-nl/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Typ het wachtwoord om te ontgrendelen"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Typ pincode om te ontgrendelen"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Onjuiste pincode."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Druk op \'Menu\' en vervolgens op 0 om te ontgrendelen."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Maximaal aantal pogingen voor Ontgrendelen via gezichtsherkenning overschreden"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Opgeladen"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Opladen"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Sluit de oplader aan."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Simkaart is vergrendeld."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Simkaart is vergrendeld met PUK-code."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Simkaart ontgrendelen…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d van %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget toevoegen."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Leeg"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Ontgrendelingsgebied uitgevouwen."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Ontgrendelingsgebied samengevouwen."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Gebruikersselectie"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Camera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Mediabediening"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Opnieuw indelen van widget gestart."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Opnieuw indelen van widget beëindigd."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> verwijderd."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Ontgrendelingsgebied uitvouwen."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Ontgrendeling via schuiven."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ontgrendeling via patroon."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Ontgrendelen via gezichtsherkenning"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Ontgrendeling via pincode."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Gebied voor pincode"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Gebied voor sim-pincode"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Gebied voor sim-pukcode"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Knop voor vorig nummer"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Knop voor volgend nummer"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Knop voor onderbreken"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Knop voor afspelen"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Knop voor stoppen"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Leuk"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Niet leuk"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hart"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Ontgrendel om door te gaan"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Start geannuleerd"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Zet <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> neer om te verwijderen."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> wordt niet verwijderd."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Volgende alarm ingesteld voor <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"Alt"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Annuleren"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Gereed"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Modus wijzigen"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Ontgrendelen"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Camera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Stil"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Geluid aan"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Zoeken"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Veeg omhoog voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Veeg omlaag voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Veeg naar links voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Veeg naar rechts voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Huidige gebruiker <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Noodoproep"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Patroon vergeten"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Onjuist patroon"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Geef de juiste PUK-code opnieuw op. Bij herhaalde pogingen wordt de simkaart permanent uitgeschakeld."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Pincodes komen niet overeen"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Te veel patroonpogingen"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Als u wilt ontgrendelen, moet u inloggen op uw Google-account."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Gebruikersnaam (e-mail)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Wachtwoord"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Inloggen"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Ongeldige gebruikersnaam of wachtwoord."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Bent u uw gebruikersnaam of wachtwoord vergeten?\nGa naar "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Account controleren…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"U heeft uw pincode <xliff:g id="NUMBER_0">%d</xliff:g> keer onjuist getypt. \n\nProbeer het over <xliff:g id="NUMBER_1">%d</xliff:g> seconden opnieuw."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"U heeft uw wachtwoord <xliff:g id="NUMBER_0">%d</xliff:g> keer onjuist getypt. \n\nProbeer het over <xliff:g id="NUMBER_1">%d</xliff:g> seconden opnieuw."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"U heeft uw ontgrendelingspatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer onjuist getekend. \n\nProbeer het over <xliff:g id="NUMBER_1">%d</xliff:g> seconden opnieuw."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"U heeft <xliff:g id="NUMBER">%d</xliff:g> mislukte pogingen ondernomen om de telefoon te ontgrendelen. Het werkprofiel wordt verwijderd, waardoor alle profielgegevens worden verwijderd."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"U heeft uw ontgrendelingspatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer onjuist getekend. Na nog eens <xliff:g id="NUMBER_1">%d</xliff:g> mislukte pogingen wordt u gevraagd uw tablet te ontgrendelen via een e-mailaccount.\n\n Probeer het over <xliff:g id="NUMBER_2">%d</xliff:g> seconden opnieuw."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"U heeft uw ontgrendelingspatroon <xliff:g id="NUMBER_0">%d</xliff:g> keer onjuist getekend. Na nog eens <xliff:g id="NUMBER_1">%d</xliff:g> mislukte pogingen wordt u gevraagd uw telefoon te ontgrendelen via een e-mailaccount.\n\n Probeer het over <xliff:g id="NUMBER_2">%d</xliff:g> seconden opnieuw."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Verwijderen"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Onjuiste pincode voor simkaart. U moet nu contact opnemen met uw provider om uw apparaat te ontgrendelen."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Onjuiste pincode voor simkaart. U heeft nog <xliff:g id="NUMBER">%d</xliff:g> poging over voordat u contact met uw provider moet opnemen om uw apparaat te ontgrendelen."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Bewerking met pincode voor simkaart mislukt."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Bewerking met pukcode voor simkaart is mislukt."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Code geaccepteerd."</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Knop voor vorig nummer"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Knop voor volgend nummer"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Knop voor onderbreken"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Knop voor afspelen"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Knop voor stoppen"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Geen service"</string>
</resources>
diff --git a/packages/Keyguard/res/values-pl/strings.xml b/packages/Keyguard/res/values-pl/strings.xml
index 623c8ca..38b4676 100644
--- a/packages/Keyguard/res/values-pl/strings.xml
+++ b/packages/Keyguard/res/values-pl/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Wpisz hasło, aby odblokować."</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Wpisz kod PIN, aby odblokować."</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Błędny kod PIN"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Aby odblokować, naciśnij Menu, a następnie 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Przekroczono maksymalną liczbę prób rozpoznania twarzy."</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Naładowana"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Ładowanie"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Podłącz ładowarkę."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Karta SIM jest zablokowana."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Karta SIM jest zablokowana za pomocą kodu PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Odblokowuję kartę SIM…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widżet %2$d z %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Dodaj widżet."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Puste"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Rozwinięto obszar odblokowania."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Zwinięto obszar odblokowania."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widżet <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Wybór użytkownika"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Aparat"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Elementy sterujące multimediów"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Rozpoczęto zmienianie kolejności widżetów."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Zakończono zmienianie kolejności widżetów."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Usunięto widżet <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Rozwiń obszar odblokowania."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Odblokowanie przesunięciem."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odblokowanie wzorem."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Rozpoznanie twarzy"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odblokowanie kodem PIN."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Miejsce na PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Miejsce na PIN do karty SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Miejsce na PUK do karty SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Przycisk poprzedniego utworu"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Przycisk następnego utworu"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Przycisk wstrzymania"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Przycisk odtwarzania"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Przycisk zatrzymania"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Podoba mi się"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Nie podoba mi się"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Serce"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Odblokuj, by kontynuować"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Uruchomienie anulowane"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Upuść <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, by usunąć."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> nie zostanie usunięty."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Następny alarm ustawiono na <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Anuluj"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Gotowe"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Zmiana trybu"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Odblokuj"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Aparat"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Wyciszenie"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Włącz dźwięk"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Szukaj"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Przesuń w górę: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Przesuń w dół: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Przesuń w lewo: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Przesuń w prawo: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Bieżący użytkownik: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Połączenie alarmowe"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Nie pamiętam wzoru"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Nieprawidłowy wzór"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Ponownie podaj poprawny kod PUK. Nieudane próby spowodują trwałe wyłączenie karty SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Kody PIN nie pasują"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Zbyt wiele prób narysowania wzoru"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Aby odblokować, zaloguj się na konto Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Nazwa użytkownika (e-mail)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Hasło"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Zaloguj się"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Nieprawidłowa nazwa użytkownika lub hasło."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Nie pamiętasz nazwy użytkownika lub hasła?\nWejdź na "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Sprawdzam konto"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Po raz <xliff:g id="NUMBER_0">%d</xliff:g> wpisałeś nieprawidłowy PIN. \n\nSpróbuj ponownie za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Po raz <xliff:g id="NUMBER_0">%d</xliff:g> wpisałeś nieprawidłowe hasło. \n\nSpróbuj ponownie za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Po raz <xliff:g id="NUMBER_0">%d</xliff:g> narysowałeś nieprawidłowy wzór odblokowania. \n\nSpróbuj ponownie za <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Próbowałeś <xliff:g id="NUMBER">%d</xliff:g> razy nieprawidłowo odblokować telefon. Profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Po raz <xliff:g id="NUMBER_0">%d</xliff:g> nieprawidłowo narysowałeś wzór odblokowania. Po kolejnych <xliff:g id="NUMBER_1">%d</xliff:g> nieudanych próbach konieczne będzie odblokowanie tabletu przy użyciu danych logowania na konto Google.\n\n Spróbuj ponownie za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Po raz <xliff:g id="NUMBER_0">%d</xliff:g> nieprawidłowo narysowałeś wzór odblokowania. Po kolejnych <xliff:g id="NUMBER_1">%d</xliff:g> nieudanych próbach konieczne będzie odblokowanie telefonu przy użyciu danych logowania na konto Google.\n\n Spróbuj ponownie za <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Usuń"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Nieprawidłowy kod PIN karty SIM. Musisz teraz skontaktować się z operatorem, by odblokował Twoje urządzenie."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Nieprawidłowy kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER">%d</xliff:g> próbę, zanim będziesz musiał skontaktować się z operatorem, by odblokował Twoje urządzenie."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Operacja z kodem PIN karty SIM nie udała się."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Operacja z kodem PUK karty SIM nie udała się."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Kod został zaakceptowany."</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Przycisk poprzedniego utworu"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Przycisk następnego utworu"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Przycisk wstrzymania"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Przycisk odtwarzania"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Przycisk zatrzymania"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Brak usługi."</string>
</resources>
diff --git a/packages/Keyguard/res/values-port/bools.xml b/packages/Keyguard/res/values-port/bools.xml
index 1e2a4f2..fdb8ebc 100644
--- a/packages/Keyguard/res/values-port/bools.xml
+++ b/packages/Keyguard/res/values-port/bools.xml
@@ -15,7 +15,5 @@
-->
<resources>
- <bool name="action_bar_embed_tabs">false</bool>
- <bool name="kg_share_status_area">true</bool>
<bool name="kg_sim_puk_account_full_screen">true</bool>
</resources>
diff --git a/packages/Keyguard/res/values-pt-rPT/strings.xml b/packages/Keyguard/res/values-pt-rPT/strings.xml
index 0556812..e9ab8de 100644
--- a/packages/Keyguard/res/values-pt-rPT/strings.xml
+++ b/packages/Keyguard/res/values-pt-rPT/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Escreva a palavra-passe para desbloquear"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Escreva o PIN para desbloquear"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Código PIN incorreto."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Para desbloquear, prima Menu e, em seguida, 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Excedido o n.º máximo de tentativas de Desbloqueio Através do Rosto"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Carregado"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"A carregar"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Ligue o carregador."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"O cartão SIM está bloqueado."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"O cartão SIM está bloqueado por PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"A desbloquear o cartão SIM..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Adicionar widget."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vazio"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Área de desbloqueio expandida."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Área de desbloqueio minimizada."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Seletor de utilizadores"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Câmara"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Controlos de multimédia"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Reordenação de widgets iniciada."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Reordenação de widgets concluída."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> eliminado."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Expandir área de desbloqueio."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Desbloqueio através de deslize."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueio através de sequência."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueio através do rosto."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueio através de PIN."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Área do PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Área do PIN do SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Área do PUK do SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Botão Faixa anterior"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Botão Faixa seguinte"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Botão Pausa"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Botão Reproduzir"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botão Parar"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Gosto"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Não gosto"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Coração"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloquear para continuar"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lançamento cancelado"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Largue <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> para eliminar."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> não será eliminado."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Próximo alarme definido para as <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Cancelar"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Concluído"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Alteração do modo"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Desbloquear"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Câmara"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Silencioso"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Som ativado"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Pesquisar"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Deslize para cima para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Deslize para baixo para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Deslize para a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Deslize para a direita para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
- <string name="user_switched" msgid="3768006783166984410">"<xliff:g id="NAME">%1$s</xliff:g> do utilizador atual."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Chamada de emergência"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Esqueceu-se da Sequência"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Sequência Incorreta"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Volte a introduzir o código PUK correto. Demasiadas tentativas consecutivas irão desativar permanentemente o SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Os códigos PIN não correspondem"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Demasiadas tentativas para desenhar sequência"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Para desbloquear, inicie sessão com a sua Conta do Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Nome de utilizador (email)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Palavra-passe"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Iniciar sessão"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Nome de utilizador ou palavra-passe inválidos."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Esqueceu-se do nome de utilizador ou da palavra-passe?\nAceda a "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"A verificar a conta…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Escreveu o PIN incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Escreveu a palavra-passe incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Desenhou a sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Tentou desbloquear incorretamente o telemóvel <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que eliminará todos os dados do perfil."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Depois de mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Depois de mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Remover"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Código PIN do cartão SIM incorreto. Tem de contactar o seu operador para desbloquear o dispositivo."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Código PIN do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER">%d</xliff:g> tentativa antes de necessitar de contactar o seu operador para desbloquear o dispositivo."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Falha ao introduzir o PIN do cartão SIM!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Falha ao introduzir o PUK do cartão SIM!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Código aceite!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Botão Faixa anterior"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Botão Faixa seguinte"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Botão Pausa"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Botão Reproduzir"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Botão Parar"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Sem serviço."</string>
</resources>
diff --git a/packages/Keyguard/res/values-pt/strings.xml b/packages/Keyguard/res/values-pt/strings.xml
index 154eaa7..0e2cba7 100644
--- a/packages/Keyguard/res/values-pt/strings.xml
+++ b/packages/Keyguard/res/values-pt/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Digite a senha para desbloquear"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Insira o PIN para desbloquear"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Código PIN incorreto."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Para desbloquear, pressione Menu e, em seguida, 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"O número máximo de tentativas de Desbloqueio por reconhecimento facial foi excedido"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Carregado"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Carregando"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Conecte seu carregador."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"O cartão SIM está bloqueado."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"O cartão SIM está bloqueado pelo PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Desbloqueando o cartão SIM…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d de %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Adicionar widget"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vazio"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Área de desbloqueio expandida."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Área de desbloqueio recolhida."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget de <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Seletor de usuários"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Câmera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Controles de mídia"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Reordenação de widgets iniciada."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Reordenação de widgets concluída."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> excluído."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Expandir a área de desbloqueio."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Desbloqueio com deslize."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueio com padrão."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueio facial."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueio com PIN."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Área do PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Área do PIN SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Área do PUK SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Botão \"Faixa anterior\""</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Botão \"Próxima faixa\""</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Botão \"Pausar\""</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Botão \"Reproduzir\""</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botão \"Parar\""</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Gostei"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Não gostei"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Coração"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloqueie para continuar"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Inicialização cancelada"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Solte <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> para excluir."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> não será excluído."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Próximo alarme definido para <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Cancelar"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Excluir"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Concluído"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Alteração do modo"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Desbloquear"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Câmera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Silencioso"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Som ativado"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Pesquisar"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para cima."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para baixo."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para a esquerda."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para a direita."</string>
- <string name="user_switched" msgid="3768006783166984410">"Usuário atual <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Chamada de emergência"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Esqueci o padrão"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Padrão incorreto"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Introduza novamente o código PUK correto. Muitas tentativas malsucedidas desativarão permanentemente o SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Os códigos PIN não coincidem"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Muitas tentativas de padrão"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Para desbloquear, faça login usando sua Conta do Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Nome de usuário (e-mail)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Senha"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Fazer login"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Nome de usuário ou senha inválidos."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Esqueceu seu nome de usuário ou senha?\nAcesse "<b>"google.com.br/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Verificando a conta..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Você digitou seu PIN incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. \n\nTente novamente em <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Você digitou sua senha incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. \n\nTente novamente em <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Você desenhou sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. \n\nTente novamente em <xliff:g id="NUMBER_1">%d</xliff:g> segundos."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que excluirá todos os dados do perfil."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Você desenhou sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas incorretas, será solicitado que você use o login do Google para desbloquear seu tablet.\n\n Tente novamente em <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Você desenhou sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas incorretas, será solicitado que você use o login do Google para desbloquear.\n\n Tente novamente em <xliff:g id="NUMBER_2">%d</xliff:g> segundos."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Remover"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Código PIN do SIM incorreto. Entre em contato com a operadora para desbloquear o dispositivo."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Código PIN do SIM incorreto. Tentativas restantes: <xliff:g id="NUMBER">%d</xliff:g>. Caso o código correto não seja digitado, será necessário entrar em contato com a operadora para desbloquear o dispositivo."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Falha na operação de PIN do SIM."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Falha na operação de PUK do SIM."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Código aceito."</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Botão \"Faixa anterior\""</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Botão \"Próxima faixa\""</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Botão \"Pausar\""</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Botão \"Reproduzir\""</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Botão \"Parar\""</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Sem serviço."</string>
</resources>
diff --git a/packages/Keyguard/res/values-ro/strings.xml b/packages/Keyguard/res/values-ro/strings.xml
index dd3fe2f..e36a37d 100644
--- a/packages/Keyguard/res/values-ro/strings.xml
+++ b/packages/Keyguard/res/values-ro/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Introduceţi parola pentru a debloca"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Introduceţi codul PIN pentru a debloca"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Cod PIN incorect."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Pentru a debloca, apăsaţi Meniu, apoi 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"S-a depăşit numărul maxim de încercări pentru Deblocare facială"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Încărcată"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Se încarcă"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Conectați încărcătorul."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Cardul SIM este blocat."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Cardul SIM este blocat cu codul PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Se deblochează cardul SIM…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d din %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Adăugaţi un widget."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Gol"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Zona de deblocare a fost extinsă."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Zona de deblocare a fost restrânsă."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Selector utilizator"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Cameră foto"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Comenzi media"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"A început reordonarea widgeturilor."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Reordonarea widgeturilor s-a încheiat."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widgetul <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> a fost eliminat."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Extindeţi zona de deblocare."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Deblocare prin glisare."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Deblocare cu model."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Deblocare facială."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Deblocare cu PIN."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Zona codului PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Zona codului PIN al cardului SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Zona codului PUK al cardului SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Butonul Melodia anterioară"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Butonul Melodia următoare"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Butonul Întrerupeți"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Butonul Redați"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Butonul Opriți"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Vot pozitiv"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Vot negativ"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Inimă"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Deblocați pentru a continua"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lansare anulată"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Eliberați <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> pentru a șterge."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Widgetul <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> nu va fi șters."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Următoarea alarmă este setată la <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Anulaţi"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Ștergeţi"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Terminat"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Schimbarea modului"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Deblocaţi"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Cameră foto"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Silenţios"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Sunet activat"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Căutaţi"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Glisaţi în sus pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Glisaţi în jos pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Glisaţi spre stânga pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Glisaţi spre dreapta pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Utilizator curent: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Apel de urgenţă"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Model uitat"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Model greşit"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Reintroduceţi codul PUK corect. Încercările repetate vor dezactiva definitiv cardul SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Codurile PIN nu coincid"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Prea multe încercări de desenare a modelului"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Pentru a debloca, conectaţi-vă cu Contul dvs. Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Nume de utilizator (e-mail)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Parolă"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Conectaţi-vă"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Nume de utilizator sau parolă nevalide."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Aţi uitat numele de utilizator sau parola?\nAccesaţi "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Se verifică contul…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Aţi introdus incorect codul PIN de <xliff:g id="NUMBER_0">%d</xliff:g> ori.\n\nÎncercaţi din nou peste <xliff:g id="NUMBER_1">%d</xliff:g> (de) secunde."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Aţi introdus incorect parola de <xliff:g id="NUMBER_0">%d</xliff:g> ori. \n\nÎncercaţi din nou peste <xliff:g id="NUMBER_1">%d</xliff:g> (de) secunde."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Aţi desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%d</xliff:g> ori. \n\nÎncercaţi din nou peste <xliff:g id="NUMBER_1">%d</xliff:g> (de) secunde."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Ați efectuat <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a telefonului. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Aţi desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%d</xliff:g> încercări nereuşite, vi se va solicita să deblocaţi tableta cu ajutorul unui cont de e-mail.\n\n Încercaţi din nou peste <xliff:g id="NUMBER_2">%d</xliff:g> (de) secunde."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Aţi desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%d</xliff:g> încercări nereuşite, vi se va solicita să deblocaţi telefonul cu ajutorul unui cont de e-mail.\n\n Încercaţi din nou peste <xliff:g id="NUMBER_2">%d</xliff:g> (de) secunde."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Eliminaţi"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Codul PIN pentru cardul SIM este incorect. Contactați operatorul pentru a vă debloca dispozitivul."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Codul PIN pentru cardul SIM este incorect. V-a mai rămas <xliff:g id="NUMBER">%d</xliff:g> încercare, după care va trebui să contactați operatorul pentru a vă debloca dispozitivul."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Deblocarea cu ajutorul codului PIN pentru cardul SIM nu a reușit!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Deblocarea cu ajutorul codului PUK pentru cardul SIM nu a reușit!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Cod acceptat!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Butonul Melodia anterioară"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Butonul Melodia următoare"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Butonul Întrerupeți"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Butonul Redați"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Butonul Opriți"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Fără serviciu."</string>
</resources>
diff --git a/packages/Keyguard/res/values-ru/strings.xml b/packages/Keyguard/res/values-ru/strings.xml
index 1edfba5..9ea14ff 100644
--- a/packages/Keyguard/res/values-ru/strings.xml
+++ b/packages/Keyguard/res/values-ru/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Введите пароль"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Введите PIN-код"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Неверный PIN-код."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Для разблокировки нажмите \"Меню\", а затем 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Все попытки войти с помощью Фейсконтроля использованы"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Батарея заряжена"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Зарядка батареи"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Подключите зарядное устройство."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-карта заблокирована"</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Для разблокировки SIM-карты требуется PUK-код."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Разблокировка SIM-карты…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Виджет %2$d из %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Добавить виджет"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Пусто"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Область разблокировки развернута"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Область разблокировки свернута"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Виджет \"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>\""</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Выбор аккаунта"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Камера"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Управление блокировкой"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Начато переопределение порядка виджетов"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Порядок виджетов определен"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Виджет <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> удален"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Развернуть области разблокировки"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Прокрутка"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Графический ключ"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Фейсконтроль"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-код"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-код"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"PIN-код SIM-карты"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"PUK-код SIM-карты"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Кнопка перехода к предыдущему треку"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Кнопка перехода к следующему треку"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Кнопка паузы"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Кнопка воспроизведения"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Кнопка выключения"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Нравится"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Не нравится"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Рейтинг"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Разблокируйте экран, чтобы продолжить."</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Запуск отменен."</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Отпустите виджет \"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>\", чтобы удалить его."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Виджет \"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>\" не будет удален."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Будильник сработает в <xliff:g id="ALARM">%1$s</xliff:g>."</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"АБВ"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Клавиша ALT"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Отмена"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Клавиша удаления"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Готово"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Клавиша смены режима"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Клавиша смены регистра"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Клавиша ввода"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Разблокировать"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Камера"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Без звука"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Включить звук"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Поиск"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Проведите вверх, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Проведите вниз, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Проведите влево, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Проведите вправо, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Выбран аккаунт пользователя <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Экстренный вызов"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Забыли графический ключ?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Неправильный графический ключ"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Введите правильный PUK-код. После нескольких неудачных попыток SIM-карта будет заблокирована."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN-коды не совпадают"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Слишком много попыток ввода графического ключа"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Чтобы разблокировать устройство, войдите в свой аккаунт Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Имя пользователя (эл. почта)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Пароль"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Войти"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Неверное имя пользователя или пароль."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Забыли имя пользователя или пароль?\nПерейдите на страницу "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Проверка данных…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Вы <xliff:g id="NUMBER_0">%d</xliff:g> раз неверно указали PIN-код. \n\nПовтор через <xliff:g id="NUMBER_1">%d</xliff:g> сек."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Вы <xliff:g id="NUMBER_0">%d</xliff:g> раз неверно указали пароль.\n\nПовтор через <xliff:g id="NUMBER_1">%d</xliff:g> сек."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Вы <xliff:g id="NUMBER_0">%d</xliff:g> раз неверно указали графический ключ.\n\nПовтор через <xliff:g id="NUMBER_1">%d</xliff:g> сек."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Достигнуто максимальное количество неудачных попыток разблокировать телефон (<xliff:g id="NUMBER">%d</xliff:g>). Рабочий профиль и все его данные будут удалены."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Вы <xliff:g id="NUMBER_0">%d</xliff:g> раз неверно указали графический ключ. После <xliff:g id="NUMBER_1">%d</xliff:g> неверных попыток для разблокировки планшетного ПК потребуется войти в аккаунт Google.\n\nПовтор через <xliff:g id="NUMBER_2">%d</xliff:g> сек."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Вы <xliff:g id="NUMBER_0">%d</xliff:g> раз неверно указали графический ключ. После <xliff:g id="NUMBER_1">%d</xliff:g> неверных попыток для разблокировки телефона потребуется войти в аккаунт Google.\n\nПовтор через <xliff:g id="NUMBER_2">%d</xliff:g> сек."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Удалить"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Неверный PIN-код. Обратитесь к оператору связи, чтобы разблокировать SIM-карту."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Неверный PIN-код. Осталось попыток: <xliff:g id="NUMBER">%d</xliff:g>. После этого SIM-карта будет заблокирована и вам придется обратиться к оператору связи."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Не удалось разблокировать SIM-карту"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Не удалось разблокировать SIM-карту"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Код принят"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Кнопка перехода к предыдущему треку"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Кнопка перехода к следующему треку"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Кнопка паузы"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Кнопка воспроизведения"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Кнопка выключения"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Нет сигнала."</string>
</resources>
diff --git a/packages/Keyguard/res/values-si-rLK/strings.xml b/packages/Keyguard/res/values-si-rLK/strings.xml
index 6527874..af10fc9 100644
--- a/packages/Keyguard/res/values-si-rLK/strings.xml
+++ b/packages/Keyguard/res/values-si-rLK/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"අගුළු ඇරීමට මුරපදය ටයිප් කරන්න"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"අගුළු හැරීමට PIN එක ටයිප් කරන්න"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"වැරදි PIN කේතයකි."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"අගුළු ඇරීමට, මෙනුව ඔබා පසුව 0 ද ඔබන්න."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"මුහුණ භාවිතයෙන් අඟුළු හැරීමේ උපරිම ප්රයන්තයන් ගණන ඉක්මවා ඇත"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"අරෝපිතයි"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"ආරෝපණය වෙමින්"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"ඔබගේ ආරෝපකයට සම්බන්ධ කරන්න."</string>
@@ -46,22 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM පත අගුළු දමා ඇත."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM පත PUK අගුළු ලා ඇත."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM පත අගුළු හරිමින්..."</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for keyguard_accessibility_widget_changed (5678624624681400191) -->
- <skip />
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"විජටය එකතු කරන්න."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"හිස්"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"අගුළු අරින ප්රදේශය විදහා ඇත."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"අගුළු අරින ප්රදේශය හැකිලී ඇත."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> විජට්."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"පරිශීලක තෝරන්නා"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"කැමරාව"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"මාධ්ය පාලක"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"විජටය නැවත අනුපිළිවෙළට සැකසිම ඇරඹුණි."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"විජට් නැවත අනුපිළිවෙලට සැකසීම අවසානය."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> විජටය මැකී ඇත."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"අගුළු නොදැමූ ප්රදේශය පුළුල් කරන්න."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"සර්පණ අගුළු ඇරීම."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"රටා අගුළු ඇරීම."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"මුහුණ භාවිතයෙන් අඟුළු හැරීම."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN අගුළු ඇරීම."</string>
@@ -71,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN කොටස"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN කොටස"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK කොටස"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"පෙර ගීත බොත්තම"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"ඉදිරි ගීත බොත්තම"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"විරාම බොත්තම"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ධාවක බොත්තම"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"නැවතීමේ බොත්තම"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"ලකුණක් ඉහළට"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ලකුණක් පහළට"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"හදවත"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"දිගටම පවත්වා ගෙන යෑම සඳහා අගුල අරින්න"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"දියත් කිරීම අවලංගු කර ඇත"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"මැකීමට <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> හෙලන්න."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> මකා දමා නැත."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"<xliff:g id="ALARM">%1$s</xliff:g> ට ඊළඟ සීනුව සකස් කර ඇත"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"අවලංගු කරන්න"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"මකන්න"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"හරි"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ආකාරය වෙනස් කරන්න"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"ඇතුල් කරන්න"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"අඟුල අරින්න"</string>
- <string name="description_target_camera" msgid="969071997552486814">"කැමරාව"</string>
- <string name="description_target_silent" msgid="893551287746522182">"නිහඬ"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"ශබ්ද සක්රීය කරන්න"</string>
- <string name="description_target_search" msgid="3091587249776033139">"සෙවීම"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා උඩට සර්පණය කරන්න."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා පහලට සර්පණය කරන්න."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා වමට සර්පණය කරන්න."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා දකුණට සර්පණය කරන්න."</string>
- <string name="user_switched" msgid="3768006783166984410">"දැනට සිටින පරිශීලකයා <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"හදිසි ඇමතුම"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"රටාව අමතකයි"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"වැරදි රටාවකි"</string>
@@ -125,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"නිවැරදි PUK කේතය නැවත ඇතුලත් කරන්න. නැවත නැවත උත්සාහ කිරීමෙන් SIM එක ස්ථිරවම අබල කරයි."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN කේත ගැලපී නැත"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"රටා උත්සාහ කිරීම් වැඩිය"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"අගුළු ඇරීමට, ඔබගේ Google ගිණුම සමග පුරනය වන්න."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"පරිශීලක නාමය (ඊ-තැපෑල)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"මුරපදය"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"පුරනය වන්න"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"වලංගු නොවන පරිශීලක නාමයක් හෝ මුරපදයක්."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ඔබගේ පරිශීලක නාමය හෝ මුරපදය අමතකද?\n "<b>"google.com/accounts/recovery"</b>" වෙත යන්න."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"ගිණුම පරීක්ෂා කරමින්…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"ඔබ PIN අංකය <xliff:g id="NUMBER_0">%d</xliff:g> වාරයක් වැරදියට ටයිප් කොට ඇත.\n\n තත්පර <xliff:g id="NUMBER_1">%d</xliff:g> ක් ඇතුළත නැවත උත්සාහ කරන්න."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"<xliff:g id="NUMBER_0">%d</xliff:g> වතාවක් ඔබගේ මුරපදය ඔබ වැරදියට ටයිප් කර ඇත. \n\nතත්පර <xliff:g id="NUMBER_1">%d</xliff:g> ට පසුව නැවත උත්සහ කරන්න."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"ඔබ <xliff:g id="NUMBER_0">%d</xliff:g> වාරයක් අගුළු ඇරීමේ රටාව වැරදියට ඇඳ ඇත. \n\nතත්පර <xliff:g id="NUMBER_1">%d</xliff:g> ක් ඇතුළත නැවත උත්සාහ කරන්න."</string>
@@ -149,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"ඔබ ඔබගේ දුරකථනය අගුළු හැරීමට <xliff:g id="NUMBER">%d</xliff:g> වරක් වැරදි වශයෙන් උත්සාහ කර ඇත. සියලුම පැතිකඩ දත්ත මකා දමමින්, කාර්යාල පැතිකඩ මකා දැමෙනු ඇත."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ඔබ අගුළු ඇරිමේ රටාව <xliff:g id="NUMBER_0">%d</xliff:g> වතාවක් වැරදියට ඇඳ ඇත. තවත් අසාර්ථක උත්සාහ <xliff:g id="NUMBER_1">%d</xliff:g> කින් පසුව, ඊ-තැපැල් ගිණුම භාවිතා කරමින් ඔබගේ ටැබ්ලටයේ අගුළු ඇරීමට ඔබට පවසනු ඇත.\n\n නැවත තත්පර <xliff:g id="NUMBER_2">%d</xliff:g> කින් උත්සාහ කරන්න."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ඔබ වැරදියට <xliff:g id="NUMBER_0">%d</xliff:g> වතාවක් ඔබගේ අගුළු හැරීමේ රටාව ඇඳ ඇත. අසාර්ථක උත්සහ කිරීම් <xliff:g id="NUMBER_1">%d</xliff:g> න් පසුව, ඔබගේ ඊ-තැපැල් ලිපිනය භාවිතයෙන් ඔබගේ දුරකථනය අගුළු හැරීමට ඔබගෙන් අසයි.\n\n තත්පර <xliff:g id="NUMBER_2">%d</xliff:g> න් පසුව නැවත උත්සහ කරන්න."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ඉවත් කරන්න"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"වැරදී SIM PIN කේතයකි, ඔබගේ දුරකතනයේ අඟුල හැරීමට ඔබගේ වාහකයා ඔබ දැන් සම්බන්ධ කරගත යුතුය."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"වැරදී SIM PIN කේතයකි, ඔබගේ දුරකතනයේ අඟුල හැරීමට ඔබගේ වාහකයා සම්බන්ධ කරගැනීමට පෙර ඔබ සතුව තවත් උත්සාහයන් <xliff:g id="NUMBER">%d</xliff:g> ඉතිරිව ඇත."</item>
@@ -163,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN ක්රියාවලිය අපොහොසත් විය!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK ක්රියාවලිය අපොහොසත් විය!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"කේතය පිළිගැණුනි!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"පෙර ගීත බොත්තම"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"ඉදිරි ගීත යතුර"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"විරාම බොත්තම"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"ධාවන බොත්තම"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"නැවතුම් බොත්තම"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"සේවාව නැත."</string>
</resources>
diff --git a/packages/Keyguard/res/values-sk/strings.xml b/packages/Keyguard/res/values-sk/strings.xml
index c8c05f2..f1b92ac 100644
--- a/packages/Keyguard/res/values-sk/strings.xml
+++ b/packages/Keyguard/res/values-sk/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Zadajte heslo na odomknutie"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Zadajte kód PIN na odomknutie"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Nesprávny kód PIN."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Ak chcete telefón odomknúť, stlačte Menu a následne 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Prekročili ste maximálny povolený počet pokusov o odomknutie tvárou"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Batéria je nabitá"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Nabíja sa"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Pripojte nabíjačku."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Karta SIM je uzamknutá."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Karta SIM je uzamknutá pomocou kódu PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Prebieha odomykanie karty SIM..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Miniaplikácia %2$d z %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Pridať miniaplikáciu."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Prázdne"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Oblasť na odomknutie bola rozšírená."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Oblasť na odomknutie bola zúžená."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Miniaplikácia <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Výber používateľa"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Fotoaparát"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Ovládacie prvky médií"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Zmena usporiadania miniaplikácií sa začala."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Zmena usporiadania miniaplikácií sa skončila."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Miniaplikácia <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> bola odstránená."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Rozšíriť oblasť na odomknutie."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Odomknutie prejdením prstom."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odomknutie vzorom."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Odomknutie tvárou."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odomknutie kódom PIN."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Oblasť kódu PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Oblasť kódu PIN SIM karty"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Oblasť kódu PUK SIM karty"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Tlačidlo Predchádzajúca stopa"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Tlačidlo Ďalšia stopa"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Tlačidlo Pozastaviť"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Tlačidlo Prehrať"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Tlačidlo Zastaviť"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Páči sa mi"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Nepáči sa mi"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Srdce"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Odomknite zariadenie a pokračujte"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Spustenie bolo zrušené"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Uvoľnením dotyku miniaplikáciu <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> odstránite."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Miniaplikácia <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> nebude odstránená."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Nasledujúci budík je nastavený na <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Zrušiť"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Odstrániť"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Hotovo"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Zmena režimu"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Odomknúť"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Fotoaparát"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Tichý"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Zapnúť zvuk"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Vyhľadávanie"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Prejdite prstom nahor: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Prejdite prstom nadol: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Prejdite prstom doľava: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Prejdite prstom doprava: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Aktuálny používateľ je <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Tiesňové volanie"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Nepamätám si vzor"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Nesprávny vzor"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Znova zadajte správny kód PUK. Opakované pokusy zakážu kartu SIM natrvalo."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Kódy PIN sa nezhodujú"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Príliš veľa pokusov o nakreslenie vzoru"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Ak chcete telefón odomknúť, prihláste sa pomocou svojho účtu Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Používateľské meno (e-mail)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Heslo"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Prihlásiť sa"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Neplatné používateľské meno alebo heslo."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Zabudli ste svoje používateľské meno alebo heslo?\n Navštívte stránky "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Prebieha kontrola účtu..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"<xliff:g id="NUMBER_0">%d</xliff:g>-krát ste zadali nesprávny kód PIN. \n\nSkúste to znova o <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"<xliff:g id="NUMBER_0">%d</xliff:g>-krát ste zadali nesprávne heslo. \n\nSkúste to znova o <xliff:g id="NUMBER_1">%d</xliff:g>."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"<xliff:g id="NUMBER_0">%d</xliff:g>-krát ste použili nesprávny bezpečnostný vzor. \n\nSkúste to znova o <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Telefón ste sa pokúsili <xliff:g id="NUMBER">%d</xliff:g>-krát nesprávne odomknúť. Pracovný profil bude odstránený spolu so všetkými údajmi."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"<xliff:g id="NUMBER_0">%d</xliff:g>-krát ste nesprávne nakreslili svoj bezpečnostný vzor. Po ďalších <xliff:g id="NUMBER_1">%d</xliff:g> neúspešných pokusoch sa zobrazí výzva na odomknutie tabletu pomocou e-mailového účtu.\n\n Skúste to znova o <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"<xliff:g id="NUMBER_0">%d</xliff:g>-krát ste nesprávne nakreslili svoj bezpečnostný vzor. Po <xliff:g id="NUMBER_1">%d</xliff:g> ďalších neúspešných pokusoch sa zobrazí výzva na odomknutie telefónu pomocou e-mailového účtu.\n\n Skúste to znova o <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Odstrániť"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Nesprávny kód PIN karty SIM. Teraz musíte kontaktovať svojho operátora, aby vám odomkol zariadenie."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Nesprávny kód PIN karty SIM. Zostáva vám <xliff:g id="NUMBER">%d</xliff:g> pokus, inak budete musieť kontaktovať svojho operátora, aby vám odomkol zariadenie."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Operácia kódu PIN karty SIM zlyhala!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Operácia kódu PUK karty SIM zlyhala!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Kód bol prijatý!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Tlačidlo Predchádzajúca stopa"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Tlačidlo Ďalšia stopa"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Tlačidlo Pozastaviť"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Tlačidlo Prehrať"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Tlačidlo Zastaviť"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Žiadny signál"</string>
</resources>
diff --git a/packages/Keyguard/res/values-sl/strings.xml b/packages/Keyguard/res/values-sl/strings.xml
index 81acafb..d67c212 100644
--- a/packages/Keyguard/res/values-sl/strings.xml
+++ b/packages/Keyguard/res/values-sl/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Vnesite geslo za odklepanje"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Vnesite PIN za odklepanje"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Napačna koda PIN."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Če želite telefon odkleniti, pritisnite meni in nato 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Presegli ste dovoljeno število poskusov odklepanja z obrazom"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Napolnjeno"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Polnjenje"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Priključite napajalnik."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Kartica SIM je zaklenjena."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Kartica SIM je zaklenjena s kodo PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Odklepanje kartice SIM …"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Pripomoček %2$d za %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Dodajanje pripomočka."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Prazno"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Območje odklepanja razširjeno."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Območje odklepanja strnjeno."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Pripomoček <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Izbirnik uporabnika"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Fotoaparat"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Kontrolniki predstavnosti"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Prerazporejanje pripomočkov začeto."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Prerazporejanje pripomočkov končano."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Pripomoček <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> izbrisan."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Razširitev območja odklepanja."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Odklepanje s podrsanjem."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odklepanje z vzorcem."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Odklepanje z obrazom."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odklepanje s kodo PIN."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Območje za kodo PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Območje za kodo PIN za SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Območje za kodo PUK za SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Gumb za prejšnjo skladbo"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Gumb za naslednjo skladbo"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Gumb za začasno ustavitev"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Gumb za predvajanje"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Gumb za ustavitev"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Všeč mi je"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Ni mi všeč"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Srce"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Za nadaljevanje odklenite"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Zagon je preklican"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Izpustite pripomoček <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, da ga izbrišete."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Pripomoček <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ne bo izbrisan."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Naslednji alarm je nastavljen za <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Tipka Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Prekliči"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Tipka Delete"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Končano"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Sprememba načina"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Tipka Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Tipka Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Odkleni"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Fotoaparat"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Tiho"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Vklopljen zvok"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Iskanje"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Povlecite navzgor za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Povlecite navzdol za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Povlecite v levo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Povlecite v desno za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Trenutni uporabnik <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Klic v sili"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Pozabljen vzorec"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Napačen vzorec"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Vnovič vnesite pravilno kodo PUK. Večkratni poskusi bodo trajno onemogočili kartico SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Kodi PIN se ne ujemata"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Preveč poskusov vzorca"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Če želite odkleniti napravo, se prijavite z Google Računom."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Uporabniško ime (e-pošta)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Geslo"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Prijava"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Neveljavno uporabniško ime ali geslo."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Ali ste pozabili uporabniško ime ali geslo?\nObiščite "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Preverjanje računa ..."</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PIN ste <xliff:g id="NUMBER_0">%d</xliff:g>-krat vnesli napačno. \n\nZnova poskusite čez <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Geslo ste <xliff:g id="NUMBER_0">%d</xliff:g>-krat vnesli napačno. \n\nZnova poskusite čez <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Vzorec za odklepanje ste nepravilno narisali <xliff:g id="NUMBER_0">%d</xliff:g>-krat. \n\nPoskusite znova čez <xliff:g id="NUMBER_1">%d</xliff:g> s."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Telefon ste neuspešno poskusili odkleniti <xliff:g id="NUMBER">%d</xliff:g>-krat. Delovni profil bo odstranjen, zaradi česar bodo izbrisani vsi podatki profila."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Vzorec za odklepanje ste <xliff:g id="NUMBER_0">%d</xliff:g>-krat napačno vnesli. Po nadaljnjih <xliff:g id="NUMBER_1">%d</xliff:g> neuspešnih poskusih boste pozvani, da tablični računalnik odklenete z e-poštnim računom.\n\nPoskusite znova čez <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Vzorec za odklepanje ste <xliff:g id="NUMBER_0">%d</xliff:g>-krat napačno vnesli. Po nadaljnjih <xliff:g id="NUMBER_1">%d</xliff:g> neuspešnih poskusih boste pozvani, da odklenete telefon z Googlovimi podatki za prijavo.\n\nPoskusite znova čez <xliff:g id="NUMBER_2">%d</xliff:g> s."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Odstrani"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Napačna koda PIN kartice SIM. Zdaj se boste morali za odklenitev naprave obrniti na operaterja."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Napačna koda PIN kartice SIM. Na voljo imate še <xliff:g id="NUMBER">%d</xliff:g> poskus. Potem se boste morali za odklenitev naprave obrniti na operaterja."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Postopek za odklepanje s kodo PIN kartice SIM ni uspel."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Postopek za odklepanje s kodo PUK kartice SIM ni uspel."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Koda je sprejeta."</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Gumb za prejšnjo skladbo"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Gumb za naslednjo skladbo"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Gumb za začasno ustavitev"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Gumb za predvajanje"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Gumb za ustavitev"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Ni storitve."</string>
</resources>
diff --git a/packages/Keyguard/res/values-sr/strings.xml b/packages/Keyguard/res/values-sr/strings.xml
index d7ae794..8438315 100644
--- a/packages/Keyguard/res/values-sr/strings.xml
+++ b/packages/Keyguard/res/values-sr/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Откуцајте лозинку да бисте откључали"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Унесите PIN за откључавање"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"PIN кôд је нетачан."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Да бисте откључали, притисните „Мени“, а затим 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Премашен је највећи дозвољени број покушаја Откључавања лицем"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Напуњено"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Пуњење"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Повежите пуњач."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM картица је закључана."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM картица је закључана PUK кодом."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Откључавање SIM картице…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Виџет %2$d од %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Додај виџет."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Празно"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Област откључавања је проширена."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Област откључавања је скупљена."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Виџет <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Избор корисника"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Камера"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Контроле за медије"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Започела је промена редоследа виџета."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Промена редоследа виџета је завршена."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Виџет <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> је избрисан."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Прошири област откључавања."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Откључавање превлачењем."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Откључавање шаблоном."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Откључавање лицем."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Откључавање PIN-ом."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Област за PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Област за PIN за SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Област за PUK за SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Дугме за претходну песму"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Дугме за следећу песму"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Дугме за паузу"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Дугме за репродукцију"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Дугме за заустављање"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Свиђа ми се"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Не свиђа ми се"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Срце"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Откључајте да бисте наставили"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Покретање је отказано"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Отпустите виџет <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> да бисте га избрисали."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Виџет <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> неће бити избрисан."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Следећи аларм је подешен за <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Откажи"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Избриши"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Готово"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Промена режима"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Откључај"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Камера"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Нечујно"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Укључи звук"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Претрага"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Превуците нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Превуците надоле за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Превуците улево за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Превуците удесно за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Актуелни корисник <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Хитан позив"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Заборављени шаблон"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Погрешан шаблон"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Поново унесите исправни PUK кôд. Поновљени покушаји ће трајно онемогућити SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN кодови се не подударају"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Превише покушаја уноса шаблона"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Да бисте откључали, пријавите се помоћу Google налога."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Корисничко име (имејл адреса)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Лозинка"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Пријави ме"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Неважеће корисничко име или лозинка."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Заборавили сте корисничко име или лозинку?\nПосетите адресу "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Провера налога…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Унели сте PIN неисправно <xliff:g id="NUMBER_0">%d</xliff:g> пута. \n\nПокушајте поново за <xliff:g id="NUMBER_1">%d</xliff:g> секунде(и)."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Унели сте лозинку неисправно <xliff:g id="NUMBER_0">%d</xliff:g> пута. \n\nПокушајте поново за <xliff:g id="NUMBER_1">%d</xliff:g> секунде(и)."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Нацртали сте шаблон за откључавање неисправно <xliff:g id="NUMBER_0">%d</xliff:g> пута. \n\nПокушајте поново за <xliff:g id="NUMBER_1">%d</xliff:g> секунде(и)."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Погрешно сте покушали да откључате телефон <xliff:g id="NUMBER">%d</xliff:g> пут(а). Пословни профил ће бити уклоњен и сви подаци са њега ће бити избрисани."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Нацртали сте шаблон за откључавање неисправно <xliff:g id="NUMBER_0">%d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%d</xliff:g> неуспешна(их) покушаја, од вас ће бити затражено да откључате таблет помоћу налога е-поште.\n\nПокушајте поново за <xliff:g id="NUMBER_2">%d</xliff:g> секунде(и)."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Нацртали сте шаблон за откључавање неисправно <xliff:g id="NUMBER_0">%d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%d</xliff:g> неуспешна(их) покушаја, од вас ће бити затражено да откључате телефон помоћу налога е-поште.\n\nПокушајте поново за <xliff:g id="NUMBER_2">%d</xliff:g> секунде(и)."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Уклони"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Нетачан SIM PIN кôд. Сада морате да контактирате мобилног оператера да бисте откључали уређај."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Нетачан SIM PIN кôд. Имате још <xliff:g id="NUMBER">%d</xliff:g> покушај, а онда морате да контактирате мобилног оператера да бисте откључали уређај."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Радња са SIM PIN кодом није успела!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Радња са SIM PUK кодом није успела!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Кôд је прихваћен!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Дугме за претходну песму"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Дугме за следећу песму"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Дугме за паузу"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Дугме за репродукцију"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Дугме за заустављање"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Офлајн сте."</string>
</resources>
diff --git a/packages/Keyguard/res/values-sv/strings.xml b/packages/Keyguard/res/values-sv/strings.xml
index a86b489..d55c72f 100644
--- a/packages/Keyguard/res/values-sv/strings.xml
+++ b/packages/Keyguard/res/values-sv/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Ange lösenord för att låsa upp"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Ange PIN-kod för att låsa upp"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Fel PIN-kod."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Tryck på Menu och sedan på 0 om du vill låsa upp."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Du har försökt låsa upp med Ansiktslås för många gånger"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Batteriet har laddats"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Laddar"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Anslut din laddare."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-kortet är låst."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kortet är PUK-låst."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Låser upp SIM-kort …"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d av %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Lägg till en widget."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tom"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Expanderad upplåsningsyta."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Komprimerad upplåsningsyta."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Widget för <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Användarväljare"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Mediereglage"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Ändring av widgetarnas ordning har påbörjats."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Ändring av widgetarnas ordning har avslutats."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Widgeten <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> har tagits bort."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Expandera upplåsningsytan."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Lås upp genom att dra."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Lås upp med grafiskt lösenord."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Lås upp med Ansiktslås."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Lås upp med PIN-kod."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Pinkodsområde"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Pinkodsområde för SIM-kort"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"PUK-kodsområde för SIM-kort"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Knapp för föregående spår"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Knapp för nästa spår"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pausknappen"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Uppspelningsknappen"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Stoppknappen"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Gillar"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Tummen ned"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Hjärta"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Lås upp om du vill fortsätta"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Lanseringen har avbrutits"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Ta bort genom att släppa <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> här."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> kommer inte att tas bort."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Nästa alarm är inställt på <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Avbryt"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Klar"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Funktionsändring"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Skift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Retur"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Lås upp"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Tyst"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Ljud på"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Sök"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Dra uppåt för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Dra nedåt för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Dra åt vänster för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Dra åt höger för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
- <string name="user_switched" msgid="3768006783166984410">"Nuvarande användare: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Nödsamtal"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Har du glömt ditt grafiska lösenord?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Fel grafiskt lösenord"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Ange rätt PUK-kod igen. Om försöken upprepas inaktiveras SIM-kortet permanent."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN-koderna stämmer inte överens"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"För många försök med grafiskt lösenord"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Logga in med ditt Google-konto om du vill låsa upp."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Användarnamn (e-post)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Lösenord"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Logga in"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Ogiltigt användarnamn eller lösenord."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Har du glömt ditt användarnamn eller lösenord?\nBesök "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Kontot kontrolleras …"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Du har angett fel lösenord <xliff:g id="NUMBER_0">%d</xliff:g> gånger. \n\nFörsök igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Du har angett fel lösenord <xliff:g id="NUMBER_0">%d</xliff:g> gånger. \n\nFörsök igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%d</xliff:g> gånger. \n\nFörsök igen om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Du har försökt låsa upp mobilen på ett felaktigt sätt <xliff:g id="NUMBER">%d</xliff:g> gånger. Jobbprofilen tas bort och all profildata raderas."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%d</xliff:g> försök ombeds du låsa upp surfplattan med ett e-postkonto.\n\n Försök igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%d</xliff:g> försök ombeds du låsa upp mobilen med hjälp av ett e-postkonto.\n\n Försök igen om <xliff:g id="NUMBER_2">%d</xliff:g> sekunder."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Ta bort"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Du angav fel pinkod för SIM-kortet och måste nu kontakta operatören för att låsa upp enheten."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Du angav fel pinkod för SIM-kortet. <xliff:g id="NUMBER">%d</xliff:g> försök återstår innan du måste kontakta operatören för att låsa upp enheten."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Det gick inte att låsa upp med pinkoden för SIM-kortet."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Det gick inte att låsa upp med PUK-koden för SIM-kortet."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Koden godkändes!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Knapp för föregående spår"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Knapp för nästa spår"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pausknappen"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Uppspelningsknappen"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Stoppknappen"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Ingen tjänst."</string>
</resources>
diff --git a/packages/Keyguard/res/values-sw/strings.xml b/packages/Keyguard/res/values-sw/strings.xml
index 2e67ff7..bc8cffb 100644
--- a/packages/Keyguard/res/values-sw/strings.xml
+++ b/packages/Keyguard/res/values-sw/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Charaza nenosiri ili kufungua"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Ingiza PIN ili kufungua"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Msimbo wa PIN usio sahihi."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Ili kufungua, bofya Menyu kisha 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Majaribio ya Juu ya Kufungua Uso yamezidishwa"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Betri imejaa"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Inachaji"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Unganisha chaja yako."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM kadi imefungwa."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM kadi imefungwa na PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Inafungua SIM kadi..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Wijeti %2$d ya %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ongeza wijeti."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Tupu"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Eneo la kufungua limepanuliwa."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Eneo la kufungua limekunjwa."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ya wiji."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Kiteuzi cha mtumiaji"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Vidhibiti vya media"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Upangaji upya wa wijeti umeanza."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Upangaji upya wa wiji umekamilika."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Wiji <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> imefutwa."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Panua eneo la kufungua."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Kufungua slaidi."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Kufungua kwa ruwaza."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Kufungua kwa uso."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Kufungua kwa PIN."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Eneo la PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Eneo la PIN ya SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Eneo la PUK ya SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Kitufe cha wimbo uliotangulia"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Kitufe cha wimbo unaofuata"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Kitufe cha kusitisha"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Kitufe cha kucheza"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Kitufe cha kusitisha"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Bomba"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Si bomba"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Moyo"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Fungua ili uendelee"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Uzinduzi umeghairiwa"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Dondosha <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ili ufute."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> haitafutwa."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Kengele inayofuata imewekwa ilie saa <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Ghairi"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Futa"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Nimemaliza"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Modi ya mabadiliko"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Songa"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Fungua"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Kimya"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Sauti imewashwa"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Tafuta"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Sogeza juu kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Sogeza chini kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Sogeza kushoto kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Sogeza kulika kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
- <string name="user_switched" msgid="3768006783166984410">"Mtumiaji wa sasa <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Simu ya dharura"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Umesahau Ruwaza"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Mchoro huo si sahihi"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Ingiza upya msimbo sahihi wa PUK. Majaribio yanayorudiwa yatalemaza SIM kabisa."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Misimbo ya PIN haifanani"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Majaribio mengi mno ya mchoro"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Ili kufungua, ingia kwa Akaunti yako ya Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Jina la mtumiaji (barua pepe)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Nenosiri"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Ingia"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Jina la mtumiaji au nenosiri batili."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Je, umesahau jina lako la mtumiaji au nenosiri?\nTembela "<b>"Bgoogle.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Inakagua akaunti…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Umeingiza nenosiri lako kwa makosa mara <xliff:g id="NUMBER_0">%d</xliff:g>. \n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_1">%d</xliff:g>."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Umeingiza nenosiri lako kwa makosa mara <xliff:g id="NUMBER_0">%d</xliff:g>. \n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_1">%d</xliff:g>."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Umechora ruwaza yako ya kufunga kwa makosa mara <xliff:g id="NUMBER_0">%d</xliff:g>. \n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_1">%d</xliff:g>."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Umekosea majaribio ya kufungua simu mara <xliff:g id="NUMBER">%d</xliff:g>. Wasifu wa kazini utaondolewa, hatua itakayofuta data yote ya wasifu."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Umekosea katika kuweka mchoro wako wa kufungua mara <xliff:g id="NUMBER_0">%d</xliff:g>. Baada ya majaribio <xliff:g id="NUMBER_1">%d</xliff:g> bila kufaulu, utaombwa kufungua kompyuta yako ndogo kwa kutumia akaunti yako ya barua pepe.\n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%d</xliff:g>."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Umekosea kuchora mchoro wako wa kufungua mara <xliff:g id="NUMBER_0">%d</xliff:g>. Baada ya majaribio <xliff:g id="NUMBER_1">%d</xliff:g> yasiyofaulu, utaombwa kufungua simu yako kwa kutumia akaunti ya barua pepe.\n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%d</xliff:g>."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Ondoa"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Msimbo wa PIN ya SIM usiosahihi sasa lazima uwasiliane na mtoa huduma wako ili ufungue kifaa chako."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Msimbo wa PIN ya SIM usio sahihi, umesalia na majaribio <xliff:g id="NUMBER">%d</xliff:g> kabla ulazimike kuwasiliana na mtoa huduma wako ili ufungue kifaa chako."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Utendakazi wa PIN ya SIM umeshindwa!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Utendakazi wa PUK ya SIM umeshindwa!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Msimbo Umekubaliwa!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Kitufe cha wimbo wa awali"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Kitufe cha wimbo unaofuata"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Kitufe cha kusitisha"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Kitufe cha kucheza"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Kitufe cha kusimamisha"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Hakuna huduma."</string>
</resources>
diff --git a/packages/Keyguard/res/values-sw360dp/dimens.xml b/packages/Keyguard/res/values-sw360dp/dimens.xml
index 6e39a42..38658ca 100644
--- a/packages/Keyguard/res/values-sw360dp/dimens.xml
+++ b/packages/Keyguard/res/values-sw360dp/dimens.xml
@@ -22,8 +22,4 @@
<!-- Height of the sliding KeyguardSecurityContainer (includes 2x
keyguard_security_view_margin) -->
<dimen name="keyguard_security_height">400dp</dimen>
-
- <!-- The bottom margin for the GlowPadView container -->
- <dimen name="glowpadcontainer_bottom_margin">-48dp</dimen>
-
</resources>
diff --git a/packages/Keyguard/res/values-sw380dp-land/dimens.xml b/packages/Keyguard/res/values-sw380dp-land/dimens.xml
deleted file mode 100644
index 20eb1be..0000000
--- a/packages/Keyguard/res/values-sw380dp-land/dimens.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* //device/apps/common/assets/res/any/dimens.xml
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<resources>
- <!-- Top margin for the clock view -->
- <dimen name="kg_clock_top_margin">48dp</dimen>
-</resources>
diff --git a/packages/Keyguard/res/values-sw600dp-land/dimens.xml b/packages/Keyguard/res/values-sw600dp-land/dimens.xml
index 89252cf..a487644 100644
--- a/packages/Keyguard/res/values-sw600dp-land/dimens.xml
+++ b/packages/Keyguard/res/values-sw600dp-land/dimens.xml
@@ -18,11 +18,6 @@
*/
-->
<resources>
- <!-- Top margin for the clock view -->
- <dimen name="kg_clock_top_margin">85dp</dimen>
-
- <!-- Size of margin on the right of keyguard's status view -->
- <dimen name="kg_status_line_font_right_margin">16dp</dimen>
<!-- Overload default clock widget parameters -->
<dimen name="widget_big_font_size">100dp</dimen>
diff --git a/packages/Keyguard/res/values-sw600dp-land/integers.xml b/packages/Keyguard/res/values-sw600dp-land/integers.xml
deleted file mode 100644
index b724c90..0000000
--- a/packages/Keyguard/res/values-sw600dp-land/integers.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<resources>
- <integer name="kg_widget_region_weight">50</integer>
- <integer name="kg_security_flipper_weight">50</integer>
- <integer name="kg_glowpad_rotation_offset">0</integer>
-</resources>
diff --git a/packages/Keyguard/res/values-sw600dp-port/integers.xml b/packages/Keyguard/res/values-sw600dp-port/integers.xml
deleted file mode 100644
index 65b854a..0000000
--- a/packages/Keyguard/res/values-sw600dp-port/integers.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<resources>
- <integer name="kg_widget_region_weight">46</integer>
- <integer name="kg_security_flipper_weight">54</integer>
-</resources>
\ No newline at end of file
diff --git a/packages/Keyguard/res/values-sw600dp/bools.xml b/packages/Keyguard/res/values-sw600dp/bools.xml
index 00f45c1..654821a 100644
--- a/packages/Keyguard/res/values-sw600dp/bools.xml
+++ b/packages/Keyguard/res/values-sw600dp/bools.xml
@@ -15,12 +15,5 @@
-->
<resources>
- <bool name="target_honeycomb_needs_options_menu">false</bool>
- <bool name="show_ongoing_ime_switcher">true</bool>
- <bool name="kg_share_status_area">false</bool>
<bool name="kg_sim_puk_account_full_screen">false</bool>
- <!-- No camera for you, tablet user -->
- <bool name="kg_enable_camera_default_widget">false</bool>
- <bool name="kg_center_small_widgets_vertically">true</bool>
- <bool name="kg_top_align_page_shrink_on_bouncer_visible">false</bool>
</resources>
diff --git a/packages/Keyguard/res/values-sw600dp/dimens.xml b/packages/Keyguard/res/values-sw600dp/dimens.xml
index 74be1ff..5de1d11 100644
--- a/packages/Keyguard/res/values-sw600dp/dimens.xml
+++ b/packages/Keyguard/res/values-sw600dp/dimens.xml
@@ -18,50 +18,13 @@
*/
-->
<resources>
- <!-- Size of lockscreen outerring on unsecure unlock LockScreen -->
- <dimen name="keyguard_lockscreen_outerring_diameter">364dp</dimen>
-
- <!-- Height of FaceUnlock view in keyguard -->
- <dimen name="face_unlock_height">430dip</dimen>
-
- <!-- target placement radius for GlowPadView. Should be 1/2 of outerring diameter. -->
- <dimen name="glowpadview_target_placement_radius">182dip</dimen>
-
- <!-- Size of status line font in LockScreen. -->
- <dimen name="keyguard_pattern_unlock_status_line_font_size">14sp</dimen>
-
- <!-- Keyguard dimensions -->
- <!-- Size of the clock font in keyguard's status view -->
- <dimen name="kg_status_clock_font_size">120dp</dimen>
<!-- Size of the generic status lines keyguard's status view -->
<dimen name="kg_status_line_font_size">16sp</dimen>
- <!-- Top margin for the clock view -->
- <dimen name="kg_clock_top_margin">0dp</dimen>
-
- <!-- Size of margin on the right of keyguard's status view -->
- <dimen name="kg_status_line_font_right_margin">50dp</dimen>
-
- <!-- Horizontal padding for the widget pager -->
- <dimen name="kg_widget_pager_horizontal_padding">24dp</dimen>
-
- <!-- Top padding for the widget pager -->
- <dimen name="kg_widget_pager_top_padding">0dp</dimen>
-
- <!-- Bottom padding for the widget pager -->
- <dimen name="kg_widget_pager_bottom_padding">0dp</dimen>
-
- <!-- Top margin for the runway lights. We add a negative margin in large
- devices to account for the widget pager padding -->
- <dimen name="kg_runway_lights_top_margin">-10dp</dimen>
-
<!-- Margin around the various security views -->
<dimen name="keyguard_security_view_margin">12dp</dimen>
- <!-- Margin around the various security views -->
- <dimen name="keyguard_muliuser_selector_margin">12dp</dimen>
-
<!-- Overload default clock widget parameters -->
<dimen name="widget_big_font_size">140dp</dimen>
<dimen name="widget_label_font_size">16sp</dimen>
diff --git a/packages/Keyguard/res/values-sw600dp/integers.xml b/packages/Keyguard/res/values-sw600dp/integers.xml
deleted file mode 100644
index de9829c..0000000
--- a/packages/Keyguard/res/values-sw600dp/integers.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<resources>
- <integer name="kg_carousel_angle">60</integer>
-</resources>
diff --git a/packages/Keyguard/res/values-sw720dp-land/dimens.xml b/packages/Keyguard/res/values-sw720dp-land/dimens.xml
deleted file mode 100644
index 731bb64..0000000
--- a/packages/Keyguard/res/values-sw720dp-land/dimens.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* //device/apps/common/assets/res/any/dimens.xml
-**
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<resources>
- <!-- Top margin for the clock view -->
- <dimen name="kg_clock_top_margin">174dp</dimen>
-
- <!-- Size of margin on the right of keyguard's status view -->
- <dimen name="kg_status_line_font_right_margin">16dp</dimen>
-
- <!-- Horizontal padding for the widget pager -->
- <dimen name="kg_widget_pager_horizontal_padding">32dp</dimen>
-
- <dimen name="widget_big_font_size">150dp</dimen>
-</resources>
diff --git a/packages/Keyguard/res/values-sw720dp-port/integers.xml b/packages/Keyguard/res/values-sw720dp-port/integers.xml
deleted file mode 100644
index 5f85f71..0000000
--- a/packages/Keyguard/res/values-sw720dp-port/integers.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<resources>
- <integer name="kg_widget_region_weight">48</integer>
- <integer name="kg_security_flipper_weight">52</integer>
-</resources>
\ No newline at end of file
diff --git a/packages/Keyguard/res/values-sw720dp/dimens.xml b/packages/Keyguard/res/values-sw720dp/dimens.xml
index 86d155e..428c18e 100644
--- a/packages/Keyguard/res/values-sw720dp/dimens.xml
+++ b/packages/Keyguard/res/values-sw720dp/dimens.xml
@@ -17,40 +17,6 @@
*/
-->
<resources>
- <!-- Keyguard dimensions -->
- <!-- Size of the clock font in keyguard's status view -->
- <dimen name="kg_status_clock_font_size">140dp</dimen>
-
- <!-- Top margin for the clock view -->
- <dimen name="kg_clock_top_margin">0dp</dimen>
-
- <!-- Size of margin on the right of keyguard's status view -->
- <dimen name="kg_status_line_font_right_margin">32dp</dimen>
-
- <!-- Horizontal padding for the widget pager -->
- <dimen name="kg_widget_pager_horizontal_padding">80dp</dimen>
-
- <!-- Top padding for the widget pager -->
- <dimen name="kg_widget_pager_top_padding">0dp</dimen>
-
- <!-- Bottom padding for the widget pager -->
- <dimen name="kg_widget_pager_bottom_padding">0dp</dimen>
-
- <!-- Top margin for the runway lights. We add a negative margin in large
- devices to account for the widget pager padding -->
- <dimen name="kg_runway_lights_top_margin">-30dp</dimen>
-
- <!-- Margin around the various security views -->
- <dimen name="keyguard_muliuser_selector_margin">24dp</dimen>
-
- <!-- Stroke width of the frame for the circular avatars. -->
- <dimen name="keyguard_avatar_frame_stroke_width">3dp</dimen>
-
- <!-- Size of the avator on the multiuser lockscreen. -->
- <dimen name="keyguard_avatar_size">88dp</dimen>
-
- <!-- Size of the text under the avator on the multiuser lockscreen. -->
- <dimen name="keyguard_avatar_name_size">12sp</dimen>
<!-- Width of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) -->
<dimen name="keyguard_security_width">420dp</dimen>
diff --git a/packages/Keyguard/res/values-ta-rIN/strings.xml b/packages/Keyguard/res/values-ta-rIN/strings.xml
index 19a02b9..761cea8 100644
--- a/packages/Keyguard/res/values-ta-rIN/strings.xml
+++ b/packages/Keyguard/res/values-ta-rIN/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"திறக்க, கடவுச்சொல்லை உள்ளிடவும்"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"திறக்க, பின்னை உள்ளிடவும்"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"தவறான பின் குறியீடு."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"தடைநீக்க, மெனுவை அழுத்தி பின்பு 0 ஐ அழுத்தவும்."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"முகம் திறப்பதற்கான அதிகபட்ச முயற்சிகள் கடந்தன"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"சார்ஜ் செய்யப்பட்டது"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"சார்ஜாகிறது"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"உங்கள் சார்ஜரை இணைக்கவும்."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"சிம் கார்டு பூட்டப்பட்டுள்ளது."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"சிம் கார்டு PUK ஆல் பூட்டப்பட்டது."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"சிம் கார்டின் தடையைநீக்குகிறது..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. விட்ஜெட் %2$d / %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"விட்ஜெட்டைச் சேர்க்கவும்."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"காலியானது"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"திறக்கும் பகுதி விரிவாக்கப்பட்டது."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"திறக்கும் பகுதி சுருக்கப்பட்டது."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> விட்ஜெட்."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"பயனர் தேர்வி"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"கேமரா"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"மீடியா கட்டுப்பாடுகள்"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"விட்ஜெட்டை மீண்டும் வரிசைப்படுத்துவது தொடங்கியது."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"விட்ஜெட்டை மீண்டும் வரிசைப்படுத்துவது முடிந்தது."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"விட்ஜெட் <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> நீக்கப்பட்டது."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"திறப்பதற்கான பகுதியை விவரிக்கவும்."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"ஸ்லைடு மூலம் திறத்தல்."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"வடிவம் மூலம் திறத்தல்."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"முகத்தால் திறத்தல்."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin மூலம் திறத்தல்."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN பகுதி"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"சிம் PIN பகுதி"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"சிம் PUK பகுதி"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"முந்தைய டிராக்கிற்கான பொத்தான்"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"அடுத்த டிராக்கிற்கான பொத்தான்"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"இடைநிறுத்த பொத்தான்"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"இயக்கு பொத்தான்"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"நிறுத்து பொத்தான்"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"நன்று"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"சரியில்லை"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"இதயம்"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"தொடர திறக்கவும்"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"துவக்குவது ரத்துசெய்யப்பட்டது"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"நீக்குவதற்கு <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ஐ இழுக்கவும்."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> நீக்கப்படாது."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"அடுத்த அலாரம் <xliff:g id="ALARM">%1$s</xliff:g>க்கு அமைக்கப்பட்டது"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"ரத்துசெய்"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"நீக்கு"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"முடிந்தது"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"முறையை மாற்று"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"ஷிஃப்டு"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"உள்ளிடு"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"தடைநீக்கு"</string>
- <string name="description_target_camera" msgid="969071997552486814">"கேமரா"</string>
- <string name="description_target_silent" msgid="893551287746522182">"நிசப்தம்"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"ஒலியை இயக்கு"</string>
- <string name="description_target_search" msgid="3091587249776033139">"தேடு"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> க்கு மேலாக இழுக்கவும்."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> க்குக் கீழாக இழுக்கவும்."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> க்கு இடதுபக்கமாக இழுக்கவும்."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> க்கு வலதுபக்கமாக இழுக்கவும்."</string>
- <string name="user_switched" msgid="3768006783166984410">"நடப்பு பயனர் <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"அவசரகால அழைப்பு"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"வடிவத்தை மறந்துவிட்டீர்களா"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"தவறான வடிவம்"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"சரியான PUK குறியீட்டை மீண்டும் உள்ளிடவும். தொடர் முயற்சிகள் சிம் ஐ நிரந்தரமாக முடக்கிவிடும்."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"பின் குறியீடுகள் பொருந்தவில்லை"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"அதிகமான வடிவ முயற்சிகள்"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"திறக்க, உங்கள் Google கணக்கு மூலம் உள்நுழையவும்."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"பயனர்பெயர் (மின்னஞ்சல்)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"கடவுச்சொல்"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"உள்நுழைக"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"தவறான பயனர்பெயர் அல்லது கடவுச்சொல்."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"உங்கள் பயனர்பெயர் அல்லது கடவுச்சொல்லை மறந்துவிட்டீர்களா?\n"<b>"google.com/accounts/recovery"</b>" ஐப் பார்வையிடவும்."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"கணக்கைச் சரிபார்க்கிறது…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"உங்கள் பின்னை <xliff:g id="NUMBER_0">%d</xliff:g> முறை தவறாக உள்ளிட்டீர்கள். \n\n<xliff:g id="NUMBER_1">%d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"உங்கள் கடவுச்சொல்லை <xliff:g id="NUMBER_0">%d</xliff:g> முறை தவறாக உள்ளிட்டீர்கள். \n\n<xliff:g id="NUMBER_1">%d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"திறப்பதற்கான வடிவத்தை <xliff:g id="NUMBER_0">%d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். \n\n<xliff:g id="NUMBER_1">%d</xliff:g> வினாடிகளில் மீண்டும் முயற்சிக்கவும்."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"மொபைலைத் திறக்க, <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயற்சித்துள்ளீர்கள். பணி சுயவிவரம் அகற்றப்படும், அத்துடன் சுயவிவரத்தின் எல்லா தரவும் நீக்கப்படும்."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"திறப்பதற்கான வடிவத்தை <xliff:g id="NUMBER_0">%d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். மேலும் <xliff:g id="NUMBER_1">%d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, மின்னஞ்சல் கணக்கைப் பயன்படுத்தி உங்கள் டேப்லெட்டைத் திறக்க கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> வினாடிகளில் மீண்டும் முயற்சிக்கவும்."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"திறப்பதற்கான வடிவத்தை <xliff:g id="NUMBER_0">%d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். மேலும் <xliff:g id="NUMBER_1">%d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, மின்னஞ்சல் கணக்கைப் பயன்படுத்தி உங்கள் மொபைலைத் திறக்கக் கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"அகற்று"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"சிம் பின் குறியீடு தவறானது, உங்கள் சாதனத்தின் தடையை நீக்க, உங்கள் மொபைல் நிறுவனத்தைத் தொடர்புகொள்ள வேண்டும்."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"சிம் பின் குறியீடு தவறானது, உங்கள் சாதனத்தைத் திறக்க, உங்கள் மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளும் முன், மேலும் <xliff:g id="NUMBER">%d</xliff:g> முறை முயர்ச்சிக்கலாம்."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"சிம் பின் செயல்பாடு தோல்வி!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"சிம் PUK செயல்பாடு தோல்வி!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"குறியீடு ஏற்கப்பட்டது!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"முந்தைய டிராக்கிற்கான பொத்தான்"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"அடுத்த டிராக்கிற்கான பொத்தான்"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"இடைநிறுத்த பொத்தான்"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"இயக்கு பொத்தான்"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"நிறுத்து பொத்தான்"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"சேவை இல்லை."</string>
</resources>
diff --git a/packages/Keyguard/res/values-te-rIN/strings.xml b/packages/Keyguard/res/values-te-rIN/strings.xml
index 30173b0..67d843c 100644
--- a/packages/Keyguard/res/values-te-rIN/strings.xml
+++ b/packages/Keyguard/res/values-te-rIN/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"అన్లాక్ చేయడానికి పాస్వర్డ్ను టైప్ చేయండి"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"అన్లాక్ చేయడానికి పిన్ను టైప్ చేయండి"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"చెల్లని పిన్ కోడ్."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"అన్లాక్ చేయడానికి, మెను ఆపై 0ని నొక్కండి."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"ముఖంతో అన్లాక్ ప్రయత్నాల గరిష్ట పరిమితి మించిపోయారు"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"ఛార్జ్ అయింది"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"ఛార్జ్ అవుతోంది"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"మీ ఛార్జర్ను కనెక్ట్ చేయండి."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"సిమ్ కార్డు లాక్ చేయబడింది."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"సిమ్ కార్డు PUK లాక్ చేయబడింది."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"సిమ్ కార్డును అన్లాక్ చేస్తోంది…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. %3$dలో విడ్జెట్ %2$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"విడ్జెట్ను జోడించండి."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ఖాళీ"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"అన్లాక్ ప్రాంతం విస్తరించబడింది."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"అన్లాక్ ప్రాంతం కుదించబడింది."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> విడ్జెట్."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"వినియోగదారు ఎంపికకర్త"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"కెమెరా"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"మీడియా నియంత్రణలు"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"విడ్జెట్ పునఃక్రమం ప్రారంభించబడింది."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"విడ్జెట్ పునఃక్రమం ముగిసింది."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"విడ్జెట్ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> తొలగించబడింది."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"అన్లాక్ ప్రాంతాన్ని విస్తరింపజేయండి."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"స్లయిడ్ అన్లాక్."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"నమూనా అన్లాక్."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ముఖంతో అన్లాక్."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"పిన్ అన్లాక్."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN ప్రాంతం"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN ప్రాంతం"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK ప్రాంతం"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"మునుపటి ట్రాక్ బటన్"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"తదుపరి ట్రాక్ బటన్"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"పాజ్ బటన్"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ప్లే బటన్"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ఆపివేత బటన్"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"బాగుంది"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"బాగాలేదు"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"హృదయ చిహ్నం"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"కొనసాగడానికి అన్లాక్ చేయండి"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ప్రారంభం రద్దయింది"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"తొలగించడానికి <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>ను వదలండి."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> తొలగించబడదు."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"తదుపరి అలారం <xliff:g id="ALARM">%1$s</xliff:g>కి సెట్ చేయబడింది"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"రద్దు చేయి"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"తొలగించు"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"పూర్తయింది"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"మోడ్ మార్పు"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"అన్లాక్ చేయండి"</string>
- <string name="description_target_camera" msgid="969071997552486814">"కెమెరా"</string>
- <string name="description_target_silent" msgid="893551287746522182">"నిశ్శబ్దం చేయండి"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"ధ్వని ఆన్లో ఉంది"</string>
- <string name="description_target_search" msgid="3091587249776033139">"శోధించండి"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం పైకి స్లైడ్ చేయండి."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం క్రిందికి స్లైడ్ చేయండి."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం ఎడమవైపుకు స్లైడ్ చేయండి."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం కుడివైపుకు స్లైడ్ చేయండి."</string>
- <string name="user_switched" msgid="3768006783166984410">"ప్రస్తుత వినియోగదారు <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"అత్యవసర కాల్"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"నమూనాను మర్చిపోయాను"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"నమూనా తప్పు"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"సరైన PUK కోడ్ను మళ్లీ నమోదు చేయండి. పునరావృత ప్రయత్నాల వలన సిమ్ శాశ్వతంగా నిలిపివేయబడుతుంది."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"పిన్ కోడ్లు సరిపోలలేదు"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"చాలా ఎక్కువ నమూనా ప్రయత్నాలు చేసారు"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"అన్లాక్ చేయడానికి, మీ Google ఖాతాతో సైన్ ఇన్ చేయండి."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"వినియోగదారు పేరు (ఇమెయిల్)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"పాస్వర్డ్"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"సైన్ ఇన్ చేయి"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"చెల్లని వినియోగదారు పేరు లేదా పాస్వర్డ్."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"మీ వినియోగదారు పేరు లేదా పాస్వర్డ్ను మర్చిపోయారా?\n"<b>"google.com/accounts/recovery"</b>"ని సందర్శించండి."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"ఖాతాను తనిఖీ చేస్తోంది…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"మీరు మీ పిన్ను <xliff:g id="NUMBER_0">%d</xliff:g> సార్లు తప్పుగా టైప్ చేసారు. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"మీరు మీ పాస్వర్డ్ను <xliff:g id="NUMBER_0">%d</xliff:g> సార్లు తప్పుగా టైప్ చేసారు. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"మీరు మీ అన్లాక్ నమూనాను <xliff:g id="NUMBER_0">%d</xliff:g> సార్లు తప్పుగా గీసారు. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"మీరు ఫోన్ను అన్లాక్ చేయడానికి <xliff:g id="NUMBER">%d</xliff:g> సార్లు చెల్లని ప్రయత్నాలు చేశారు. కార్యాలయ ప్రొఫైల్ తీసివేయబడుతుంది, ఇందువల్ల మొత్తం ప్రొఫైల్ డేటా తొలగించబడుతుంది."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"మీరు మీ అన్లాక్ నమూనాను <xliff:g id="NUMBER_0">%d</xliff:g> సార్లు తప్పుగా గీసారు. మరో <xliff:g id="NUMBER_1">%d</xliff:g> విఫల ప్రయత్నాల తర్వాత, ఇమెయిల్ ఖాతాను ఉపయోగించి మీ టాబ్లెట్ను అన్లాక్ చేయాల్సిందిగా మిమ్మల్ని అడుగుతారు.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"మీరు మీ అన్లాక్ నమూనాను <xliff:g id="NUMBER_0">%d</xliff:g> సార్లు తప్పుగా గీసారు. మరో <xliff:g id="NUMBER_1">%d</xliff:g> విఫల ప్రయత్నాల తర్వాత, ఇమెయిల్ ఖాతాను ఉపయోగించి మీ ఫోన్ను అన్లాక్ చేయాల్సిందిగా మిమ్మల్ని అడుగుతారు.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"తీసివేయి"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"సిమ్ పిన్ కోడ్ చెల్లదు, మీరు ఇప్పుడు మీ పరికరాన్ని అన్లాక్ చేయడానికి తప్పనిసరిగా మీ క్యారియర్ను సంప్రదించండి."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"సిమ్ పిన్ కోడ్ చెల్లదు, మీరు మీ పరికరాన్ని అన్లాక్ చేయడానికి తప్పనిసరిగా మీ క్యారియర్ను సంప్రదించాల్సిన పరిస్థితి ఏర్పడకుండా ఉండటానికి మీకు <xliff:g id="NUMBER">%d</xliff:g> ప్రయత్నం మిగిలి ఉంది."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"సిమ్ పిన్ చర్య విఫలమైంది!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"సిమ్ PUK చర్య విఫలమైంది!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"కోడ్ ఆమోదించబడింది!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"మునుపటి ట్రాక్ బటన్"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"తదుపరి ట్రాక్ బటన్"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"పాజ్ బటన్"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"ప్లే బటన్"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"ఆపివేత బటన్"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"సేవ లేదు."</string>
</resources>
diff --git a/packages/Keyguard/res/values-th/strings.xml b/packages/Keyguard/res/values-th/strings.xml
index 1d7bc66..ca2eab2 100644
--- a/packages/Keyguard/res/values-th/strings.xml
+++ b/packages/Keyguard/res/values-th/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"พิมพ์รหัสผ่านเพื่อปลดล็อก"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"พิมพ์ PIN เพื่อปลดล็อก"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"รหัส PIN ไม่ถูกต้อง"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"หากต้องการปลดล็อก กด เมนู ตามด้วย 0"</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"มีความพยายามที่จะใช้ Face Unlock เกินขีดจำกัด"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"ชาร์จแล้ว"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"กำลังชาร์จ"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"เสียบที่ชาร์จของคุณ"</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"ซิมการ์ดถูกล็อก"</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ซิมการ์ดถูกล็อกด้วย PUK"</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"กำลังปลดล็อกซิมการ์ด…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s วิดเจ็ต %2$d ของ %3$d"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"เพิ่มวิดเจ็ต"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"ว่าง"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"ขยายพื้นที่ปลดล็อกแล้ว"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"ยุบพื้นที่ปลดล็อกแล้ว"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"วิดเจ็ต <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"ตัวเลือกผู้ใช้"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"กล้องถ่ายรูป"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"การควบคุมสื่อ"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"เริ่มเรียงลำดับวิดเจ็ตใหม่"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"เรียงลำดับวิดเจ็ตใหม่เสร็จแล้ว"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"ลบวิดเจ็ต <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> แล้ว"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ขยายพื้นที่ปลดล็อก"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"การปลดล็อกด้วยการเลื่อน"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"การปลดล็อกด้วยรูปแบบ"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"การปลดล็อกด้วยใบหน้า"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"การปลดล็อกด้วย PIN"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"พื้นที่ PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"พื้นที่ PIN ของซิม"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"พื้นที่ PUK ของซิม"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"ปุ่มแทร็กก่อนหน้า"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"ปุ่มแทร็กถัดไป"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"ปุ่มหยุดชั่วคราว"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"ปุ่มเล่น"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"ปุ่มหยุด"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"สุดยอด"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"ไม่ชอบ"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"หัวใจ"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"ปลดล็อกเพื่อดำเนินการต่อ"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"ยกเลิกการเปิดใช้งานแล้ว"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"ลาก <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> เพื่อลบ"</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> จะไม่ถูกลบ"</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"ตั้งเวลาปลุกครั้งถัดไปไว้ที่ <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"ยกเลิก"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ลบ"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"เสร็จสิ้น"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"เปลี่ยนโหมด"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"ป้อน"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"ปลดล็อก"</string>
- <string name="description_target_camera" msgid="969071997552486814">"กล้อง"</string>
- <string name="description_target_silent" msgid="893551287746522182">"ปิดเสียง"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"เปิดเสียง"</string>
- <string name="description_target_search" msgid="3091587249776033139">"ค้นหา"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"เลื่อนขึ้นเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
- <string name="description_direction_down" msgid="5087739728639014595">"เลื่อนลงเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
- <string name="description_direction_left" msgid="7207478719805562165">"เลื่อนไปทางซ้ายเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
- <string name="description_direction_right" msgid="8034433242579600980">"เลื่อนไปทางขวาเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
- <string name="user_switched" msgid="3768006783166984410">"ผู้ใช้ปัจจุบัน <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"หมายเลขฉุกเฉิน"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ลืมรูปแบบใช่หรือไม่"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"รูปแบบไม่ถูกต้อง"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"ใส่รหัส PUK ที่ถูกต้องอีกครั้ง การพยายามซ้ำหลายครั้งจะทำให้ซิมการ์ดถูกปิดใช้งานอย่างถาวร"</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"รหัส PIN ไม่ตรง"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ลองหลายรูปแบบมากเกินไป"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"หากต้องการปลดล็อก ให้ลงชื่อเข้าใช้ด้วยบัญชี Google ของคุณ"</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"ชื่อผู้ใช้ (อีเมล)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"รหัสผ่าน"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"ลงชื่อเข้าใช้"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง"</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"หากลืมชื่อผู้ใช้หรือรหัสผ่าน\nโปรดไปที่ "<b>"google.com/accounts/recovery"</b></string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"กำลังตรวจสอบบัญชี…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"คุณพิมพ์ PIN ไม่ถูกต้องไป <xliff:g id="NUMBER_0">%d</xliff:g> ครั้งแล้ว \n\nโปรดลองอีกครั้งใน <xliff:g id="NUMBER_1">%d</xliff:g> วินาที"</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"คุณพิมพ์รหัสผ่านไม่ถูกต้องไป <xliff:g id="NUMBER_0">%d</xliff:g> ครั้งแล้ว \n\nโปรดลองอีกครั้งใน <xliff:g id="NUMBER_1">%d</xliff:g> วินาที"</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"คุณวาดรูปแบบการปลดล็อกไม่ถูกต้องไป <xliff:g id="NUMBER_0">%d</xliff:g> ครั้งแล้ว \n\nโปรดลองอีกครั้งใน <xliff:g id="NUMBER_1">%d</xliff:g> วินาที"</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"คุณปลดล็อกโทรศัพท์ไม่ถูกต้อง <xliff:g id="NUMBER">%d</xliff:g> ครั้ง ระบบจะนำโปรไฟล์งานออก ซึ่งจะเป็นการลบข้อมูลโปรไฟล์ทั้งหมด"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"คุณวาดรูปแบบการปลดล็อกไม่ถูกต้อง <xliff:g id="NUMBER_0">%d</xliff:g> ครั้งแล้ว หากทำไม่สำเร็จอีก <xliff:g id="NUMBER_1">%d</xliff:g> ครั้ง ระบบจะขอให้คุณปลดล็อกแท็บเล็ตโดยใช้บัญชีอีเมล\n\n โปรดลองอีกครั้งใน <xliff:g id="NUMBER_2">%d</xliff:g> วินาที"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"คุณวาดรูปแบบการปลดล็อกไม่ถูกต้อง <xliff:g id="NUMBER_0">%d</xliff:g> ครั้งแล้ว หากทำไม่สำเร็จอีก <xliff:g id="NUMBER_1">%d</xliff:g> ครั้ง ระบบจะขอให้คุณปลดล็อกโทรศัพท์โดยใช้ับัญชีอีเมล\n\n โปรดลองอีกครั้งในอีก <xliff:g id="NUMBER_2">%d</xliff:g> วินาที"</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ลบ"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"รหัส PIN ของซิมไม่ถูกต้อง ตอนนี้คุณต้องติดต่อผู้ให้บริการเพื่อปลดล็อกอุปกรณ์ของคุณ"</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"รหัส PIN ของซิมไม่ถูกต้อง คุณพยายามได้อีก <xliff:g id="NUMBER">%d</xliff:g> ครั้งก่อนที่จะต้องติดต่อผู้ให้บริการเพื่อปลดล็อกอุปกรณ์ของคุณ"</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"การปลดล็อกด้วย PIN ของซิมล้มเหลว!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"การปลดล็อกด้วย PUK ของซิมล้มเหลว!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"รหัสได้รับการยอมรับ!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"ปุ่มแทร็กก่อนหน้า"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"ปุ่มแทร็กถัดไป"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"ปุ่มหยุดชั่วคราว"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"ปุ่มเล่น"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"ปุ่มหยุด"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"ไม่มีบริการ"</string>
</resources>
diff --git a/packages/Keyguard/res/values-tl/strings.xml b/packages/Keyguard/res/values-tl/strings.xml
index fb03d07..7dbc067 100644
--- a/packages/Keyguard/res/values-tl/strings.xml
+++ b/packages/Keyguard/res/values-tl/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"I-type ang password upang i-unlock"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"I-type ang PIN upang i-unlock"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Maling PIN code."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Upang i-unlock, pindutin ang Menu pagkatapos ay 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Nalagpasan na ang maximum na mga pagtatangka sa Face Unlock"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Na-charge"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Nagtsa-charge"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Ikonekta ang iyong charger."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Naka-lock ang SIM card."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Naka-lock ang SIM card gamit ang PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Ina-unlock ang SIM card…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d ng %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Magdagdag ng widget."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Walang laman"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Pinalaki ang bahagi ng pag-unlock."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Pinaliit ang bahagi ng pag-unlock."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Tagapili ng user"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Camera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Mga kontrol ng media"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Nagsimula na ang pagbabago ng ayos ng widget."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Natapos na ang pagbabago ng ayos ng widget."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Tinanggal ang widget na <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Palakihin ang bahagi ng pag-unlock."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Pag-unlock ng slide."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pag-unlock ng pattern."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pag-unlock ng pin."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Lugar ng PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Lugar ng PIN ng SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Lugar ng PUK ng SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Button na Nakaraang track"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Button na Susunod na track"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Button na I-pause"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Button na I-play"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Button na Ihinto"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Thumbs up"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Thumbs down"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Heart"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"I-unlock upang magpatuloy"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Nakansela ang paglunsad"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"I-drop ang <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> upang tanggalin."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Hindi tatanggalin ang <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Nakatakda ang susunod na alarm para sa <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Kanselahin"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Tanggalin"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Tapos na"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Pagbabago ng Mode"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"I-unlock"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Camera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Tahimik"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"I-on ang tunog"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Maghanap"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Mag-slide pataas para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Mag-slide pababa para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Mag-slide pakaliwa para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Mag-slide pakanan para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Kasalukuyang user <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Emergency na tawag"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Nakalimutan ang Pattern"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Maling Pattern"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Muling ilagay ang tamang PUK code. Permanenteng hindi pagaganahin ang SIM ng mga paulit-ulit na pagtatangka."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Hindi tumutugma ang mga PIN code"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Masyadong maraming pagtatangka sa pattern"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Upang i-unlock, mag-sign in gamit ang iyong Google account."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Username (email)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Password"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Mag-sign in"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Di-wastong username o password."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Nakalimutan ang iyong username o password?\nBisitahin ang "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Tinitingnan ang account…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Na-type mo nang hindi tama ang iyong PIN nang <xliff:g id="NUMBER_0">%d</xliff:g> (na) beses. \n\nSubukang muli sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> (na) segundo."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Na-type mo nang hindi tama ang iyong password nang <xliff:g id="NUMBER_0">%d</xliff:g> (na) beses. \n\nSubukang muli sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> (na) segundo."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Naguhit mo nang hindi tama ang iyong pattern sa pag-unlock nang <xliff:g id="NUMBER_0">%d</xliff:g> (na) beses. \n\nSubukang muli sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> (na) segundo."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"<xliff:g id="NUMBER">%d</xliff:g> (na) beses mo nang sinubukang i-unlock ang telepono gamit ang maling password. Aalisin ang profile sa trabaho, na magiging dahilan upang ma-delete ang lahat ng data sa profile."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Naguhit mo nang hindi tama ang iyong pattern sa pag-unlock nang <xliff:g id="NUMBER_0">%d</xliff:g> (na) beses. Pagkatapos ng <xliff:g id="NUMBER_1">%d</xliff:g> pang hindi matagumpay na pagtatangka, hihilingin sa iyong i-unlock ang tablet mo gamit ang isang email account.\n\n Subukang muli sa loob ng <xliff:g id="NUMBER_2">%d</xliff:g> (na) segundo."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Naguhit mo nang hindi tama ang iyong pattern sa pag-unlock nang <xliff:g id="NUMBER_0">%d</xliff:g> (na) beses. Pagkatapos ng <xliff:g id="NUMBER_1">%d</xliff:g> pang hindi matagumpay na pagtatangka, hihilingin sa iyong i-unlock ang telepono mo gamit ang isang email account.\n\n Subukang muli sa loob ng <xliff:g id="NUMBER_2">%d</xliff:g> (na) segundo."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Alisin"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Maling PIN code ng SIM, dapat ka nang makipag-ugnay sa iyong carrier upang i-unlock ang iyong device."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Maling PIN code ng SIM, mayroon kang <xliff:g id="NUMBER">%d</xliff:g> (na) natitirang pagsubok bago ka dapat makipag-ugnay sa iyong carrier upang i-unlock ang iyong device."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Nabigo ang operasyon ng SIM PIN!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Nabigo ang operasyon ng SIM PUK!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Tinanggap ang Code!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Button na Nakaraang track"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Button na Susunod na track"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Button na I-pause"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Button na I-play"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Button na Ihinto"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Walang serbisyo."</string>
</resources>
diff --git a/packages/Keyguard/res/values-tr/strings.xml b/packages/Keyguard/res/values-tr/strings.xml
index 3bc4860..5a13aa9 100644
--- a/packages/Keyguard/res/values-tr/strings.xml
+++ b/packages/Keyguard/res/values-tr/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Kilidi açmak için şifreyi yazın"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Kilidi açmak için PIN kodunu yazın"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Yanlış PIN kodu."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Kilidi açmak için önce Menü\'ye, sonra 0\'a basın."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Yüz Tanıma Kilidi için maksimum deneme sayısı aşıldı"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Şarj oldu"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Şarj oluyor"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Şarj cihazınızı takın."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM kart kilitli."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM kart PUK kilidi devrede."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM kart kilidi açılıyor…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d / %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Widget ekleyin."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Boş"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Kilit açma alanı genişletildi."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Kilit açma alanı daraltıldı."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget\'ı."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Kullanıcı seçici"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Medya denetimleri"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Widget\'ları yeniden sıralama işlemi başladı."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Widget\'ları yeniden sıralama işlemi bitti."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget\'ı silindi."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Kilit açma alanını genişletin."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Kaydırarak kilit açma."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desenle kilit açma."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Yüzle kilit açma."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin koduyla kilit açma."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN alanı"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN alanı"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK alanı"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Önceki parça düğmesi"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Sonraki parça düğmesi"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Duraklat düğmesi"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Oynat düğmesi"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Durdur düğmesi"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Beğen"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Beğenme"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Kalp"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Devam etmek için kilidini açın"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Başlatma iptal edildi"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Silmek için <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> widget\'ını bırakın."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> silinmeyecek."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Sonraki alarm <xliff:g id="ALARM">%1$s</xliff:g> için ayarlandı"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"İptal"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Sil"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Bitti"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Mod değiştirme"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"ÜstKrkt"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Giriş"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Kilidi aç"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Sessiz"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Ses açık"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Ara"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için yukarı kaydırın."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için aşağı kaydırın."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için sola kaydırın."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için sağa kaydırın."</string>
- <string name="user_switched" msgid="3768006783166984410">"Geçerli kullanıcı: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Acil durum çağrısı"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Deseni Unuttunuz mu?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Yanlış Desen"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Doğru PUK kodunu tekrar girin. Çok sayıda deneme yapılırsa SIM kart kalıcı olarak devre dışı bırakılır."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN kodları eşleşmiyor"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Çok fazla sayıda desen denemesi yapıldı"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Kilidi açmak için Google hesabınızla oturum açın."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Kullanıcı adı (e-posta)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Şifre"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Oturum aç"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Geçersiz kullanıcı adı veya şifre."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Kullanıcı adınızı veya şifrenizi mi unuttunuz?\n"<b>"google.com/accounts/recovery"</b>" adresini ziyaret edin."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Hesap denetleniyor…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PIN kodunuzu <xliff:g id="NUMBER_0">%d</xliff:g> kez yanlış girdiniz. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> saniye içinde tekrar deneyin."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Şifrenizi <xliff:g id="NUMBER_0">%d</xliff:g> kez yanlış yazdınız. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> saniye içinde tekrar deneyin."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Kilit açma deseninizi <xliff:g id="NUMBER_0">%d</xliff:g> kez yanlış çizdiniz. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> saniye içinde tekrar deneyin."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Telefonun kilidini <xliff:g id="NUMBER">%d</xliff:g> kez hatalı bir şekilde açmayı denediniz. İş profili kaldırılacak ve tüm profil verileri silinecektir."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Kilit açma deseninizi <xliff:g id="NUMBER_0">%d</xliff:g> kez yanlış çizdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> başarısız denemeden sonra, tabletinizi bir e-posta hesabı kullanarak açmanız istenir.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniye içinde tekrar deneyin."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Kilit açma deseninizi <xliff:g id="NUMBER_0">%d</xliff:g> kez yanlış çizdiniz. <xliff:g id="NUMBER_1">%d</xliff:g> başarısız denemeden sonra telefonunuzu bir e-posta hesabı kullanarak açmanız istenir.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> saniye içinde tekrar deneyin."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Kaldır"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Yanlış SIM PIN kodu. Cihazınızın kilidini açmak için artık operatörünüzle bağlantı kurmanız gerekiyor."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Yanlış SIM PIN kodu. Cihazının kilidini açmak için operatörünüzle bağlantı kurmak zorunda kalmadan önce <xliff:g id="NUMBER">%d</xliff:g> deneme hakkınız kaldı."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN işlemi başarısız oldu!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK işlemi başarısız oldu!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Kod Kabul Edildi!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Önceki parça düğmesi"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Sonraki parça düğmesi"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Duraklat düğmesi"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Oynat düğmesi"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Durdur düğmesi"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Hizmet yok."</string>
</resources>
diff --git a/packages/Keyguard/res/values-uk/strings.xml b/packages/Keyguard/res/values-uk/strings.xml
index 3cb0b89..cb51ec4 100644
--- a/packages/Keyguard/res/values-uk/strings.xml
+++ b/packages/Keyguard/res/values-uk/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Введіть пароль, щоб розблокувати"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Введіть PIN-код, щоб розблокувати"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Неправильний PIN-код."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Щоб розбл., натисн. меню та 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Перевищено максимальну кількість спроб розблокування за допомогою функції \"Фейсконтроль\""</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Заряджено"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Заряджається"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Підключіть зарядний пристрій."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-карту заблоковано."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-карту заблоковано PUK-кодом."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Розблокування SIM-карти…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Віджет %2$d з %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Додати віджет."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Порожня область"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Область розблокування розгорнуто."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Область розблокування згорнуто."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"Віджет <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Вибір користувача"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Камера"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Елементи керування носієм"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Змінення порядку віджетів розпочато."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Змінення порядку віджетів закінчено."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Віджет <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> видалено."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Розгорнути область розблокування."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Розблокування повзунком."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Розблокування ключем."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Фейсконтроль"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Розблокування PIN-кодом."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-код"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"PIN-код SIM-карти"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"PUK-код SIM-карти"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Кнопка \"Попередня композиція\""</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Кнопка \"Наступна композиція\""</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Кнопка \"Призупинити\""</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Кнопка \"Відтворити\""</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Кнопка \"Зупинити\""</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Подобається"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Не подобається"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Рейтинг"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Розблокуйте, щоб продовжити"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Запуск скасовано"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Відпустіть <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, щоб видалити."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> не буде видалено."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Наступний сигнал: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Скасувати"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Готово"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Зміна режиму"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Розблокувати"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Камера"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Без звуку"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Увімкнути звук"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Пошук"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Проведіть пальцем угору, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Проведіть пальцем униз, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Проведіть пальцем ліворуч, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Проведіть пальцем праворуч, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Поточний користувач: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Екстрений виклик"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Не пам’ятаю ключ"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Неправильний ключ"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Повторно введіть правильний PUK-код. Численні спроби назавжди вимкнуть SIM-карту."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN-коди не збігаються"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Забагато спроб намалювати ключ"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Щоб розблокувати, увійдіть, використовуючи дані облікового запису Google."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Ім’я користувача (електронна адреса)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Пароль"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Увійти"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Недійсне ім’я користувача чи пароль."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Не пам’ятаєте ім’я користувача чи пароль?\nВідвідайте сторінку "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Перевірка облікового запису…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PIN-код неправильно введено стільки разів: <xliff:g id="NUMBER_0">%d</xliff:g>. \n\nПовторіть спробу через <xliff:g id="NUMBER_1">%d</xliff:g> с."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Пароль неправильно введено стільки разів: <xliff:g id="NUMBER_0">%d</xliff:g>. \n\nПовторіть спробу через <xliff:g id="NUMBER_1">%d</xliff:g> с."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Ключ розблокування неправильно намальовано стільки разів: <xliff:g id="NUMBER_0">%d</xliff:g>. \n\nПовторіть спробу через <xliff:g id="NUMBER_1">%d</xliff:g> с."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Кількість невдалих спроб розблокувати телефон: <xliff:g id="NUMBER">%d</xliff:g>. Буде видалено робочий профіль і всі його дані."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Ключ розблокування неправильно намальовано стільки разів: <xliff:g id="NUMBER_0">%d</xliff:g>. У вас є ще стільки спроб: <xliff:g id="NUMBER_1">%d</xliff:g>. У разі невдачі з’явиться запит розблокувати планшетний ПК за допомогою облікового запису електронної пошти.\n\n Повторіть спробу через <xliff:g id="NUMBER_2">%d</xliff:g> сек."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Ключ розблокування неправильно намальовано стільки разів: <xliff:g id="NUMBER_0">%d</xliff:g>. У вас є ще стільки спроб: <xliff:g id="NUMBER_1">%d</xliff:g>. У разі невдачі з’явиться запит розблокувати телефон за допомогою облікового запису електронної пошти.\n\n Повторіть спробу через <xliff:g id="NUMBER_2">%d</xliff:g> сек."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Вилучити"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Неправильний PIN-код SIM-карти. Зв’яжіться зі своїм оператором, щоб розблокувати пристрій."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Неправильний PIN-код SIM-карти. У вас залишилась <xliff:g id="NUMBER">%d</xliff:g> спроба. Після цього потрібно буде зв’язатися з оператором, щоб розблокувати пристрій."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Помилка введення PIN-коду SIM-карти."</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Помилка введення PUK-коду SIM-карти."</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Код прийнято."</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Кнопка \"Попередня композиція\""</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Кнопка \"Наступна композиція\""</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Кнопка \"Призупинити\""</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Кнопка \"Відтворити\""</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Кнопка \"Зупинити\""</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Зв’язку немає."</string>
</resources>
diff --git a/packages/Keyguard/res/values-ur-rPK/strings.xml b/packages/Keyguard/res/values-ur-rPK/strings.xml
index f4e4eeb..0daa46b 100644
--- a/packages/Keyguard/res/values-ur-rPK/strings.xml
+++ b/packages/Keyguard/res/values-ur-rPK/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"غیر مقفل کرنے کیلئے پاس ورڈ ٹائپ کریں"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"غیر مقفل کرنے کیلئے PIN ٹائپ کریں"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"غلط PIN کوڈ۔"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"غیر مقفل کرنے کیلئے، مینو پھر 0 دبائیں۔"</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"چہرہ کے ذریعے غیر مقفل کریں کی زیادہ سے زیادہ کوششوں سے تجاوز کرگیا"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"چارج ہو گیا"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"چارج ہو رہی ہے"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"اپنا چارجر مربوط کریں۔"</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM کارڈ مقفل ہے۔"</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM کارڈ PUK-مقفل ہے۔"</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM کارڈ غیر مقفل کیا جا رہا ہے…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s۔ ویجیٹ %2$d از %3$d۔"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"ویجیٹ شامل کریں"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"خالی"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"غیر مقفل کرنے کا علاقہ پھیلا دیا گیا۔"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"غیر مقفل کرنے کا علاقہ سکیڑ دیا گیا۔"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ویجیٹ۔"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"صارف کا انتخاب کار"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"کیمرا"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"میڈیا کنٹرولز"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"ویجیٹ دوبارہ ترتیب دینا شروع ہو گیا۔"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"ویجیٹ دوبارہ ترتیب دینا ختم ہو گیا۔"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"ویجیٹ <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> کو حذف کر دیا گیا۔"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"غیر مقفل کرنے والے علاقے کو پھیلائیں۔"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"سلائیڈ کے ذریعے غیر مقفل کریں۔"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"پیٹرن کے ذریعے غیر مقفل کریں۔"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"چہرے کے ذریعے غیر مقفل کریں۔"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"پن کے ذریعے غیر مقفل کریں۔"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN کا علاقہ"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN کا علاقہ"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK کا علاقہ"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"سابقہ ٹریک بٹن"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"اگلا ٹریک بٹن"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"موقوف کرنے کا بٹن"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"چلائیں بٹن"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"روکیں بٹن"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"بہت اچھا"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"بہت خراب"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"دل"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"جاری رکھنے کیلئے غیر مقفل کریں"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"شروعات کو منسوخ کر دیا گیا"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"حذف کرنے کیلئے <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> کو ڈراپ کریں۔"</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> کو حذف نہیں کیا جائے گا۔"</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"اگلا الارم <xliff:g id="ALARM">%1$s</xliff:g> کیلئے سیٹ ہے"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"منسوخ کریں"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"حذف کریں"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"ہو گیا"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"وضع میں تبدیلی"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"غیر مقفل کریں"</string>
- <string name="description_target_camera" msgid="969071997552486814">"کیمرہ"</string>
- <string name="description_target_silent" msgid="893551287746522182">"خاموش کریں"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"آواز آن ہے"</string>
- <string name="description_target_search" msgid="3091587249776033139">"تلاش کریں"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے اوپر سلائیڈ کریں۔"</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے نیچے سلائیڈ کریں۔"</string>
- <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے بائیں سلائیڈ کریں۔"</string>
- <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے دائیں سلائیڈ کریں۔"</string>
- <string name="user_switched" msgid="3768006783166984410">"موجودہ صارف <xliff:g id="NAME">%1$s</xliff:g>۔"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"ہنگامی کال"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"پیٹرن بھول گئے"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"غلط پیٹرن"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"صحیح PUK کوڈ دوبارہ درج کریں۔ بار بار کی کوششیں SIM کو مستقل طور پر غیر فعال کر دیں گی۔"</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN کوڈز مماثل نہیں ہیں"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"پیٹرن کی بہت ساری کوششیں"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"غیر مقفل کرنے کیلئے، اپنے Google اکاؤنٹ کے ساتھ سائن ان کریں۔"</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"صارف نام (ای میل)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"پاس ورڈ"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"سائن ان کریں"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"غلط صارف نام یا پاس ورڈ۔"</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"اپنا صارف نام یا پاس ورڈ بھول گئے؟\n"<b>"google.com/accounts/recovery"</b>" ملاحظہ کریں۔"</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"اکاؤنٹ چیک کیا جا رہا ہے…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"آپ نے اپنا PIN <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ٹائپ کیا ہے۔ \n\n <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"آپ نے اپنا پاس ورڈ <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ٹائپ کیا ہے۔ \n\n <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"آپ نے اپنا غیر مقفل کرنے کا پیٹرن <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ڈرا کیا ہے۔ \n\n <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"آپ نے فون کو غیر مقفل کرنے کیلئے <xliff:g id="NUMBER">%d</xliff:g> بار غلط طریقے سے کوشش کی ہے۔ دفتری پروفائل ہٹا دیا جائے گا، جس سے پروفائل کا سبھی ڈیٹا حذف ہو جائے گا۔"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"آپ نے اپنا غیر مقفل کرنے کا پیٹرن <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ڈرا کیا ہے۔ <xliff:g id="NUMBER_1">%d</xliff:g> مزید ناکام کوششوں کے بعد، آپ سے ایک ای میل اکاؤنٹ استعمال کرکے اپنا ٹیبلیٹ غیر مقفل کرنے کو کہا جائے گا۔\n\n <xliff:g id="NUMBER_2">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"آپ نے اپنا غیر مقفل کرنے کا پیٹرن <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ڈرا کیا ہے۔ <xliff:g id="NUMBER_1">%d</xliff:g> مزید ناکام کوششوں کے بعد، آپ سے ایک ای میل اکاؤنٹ استعمال کرکے اپنا فون غیر مقفل کرنے کو کہا جائے گا۔\n\n <xliff:g id="NUMBER_2">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ہٹائیں"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"غلط SIM PIN کوڈ اب آپ کو اپنا آلہ غیر مقفل کرنے کیلئے لازمی طور پر اپنے کیریئر سے رابطہ کرنا چاہئے۔"</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"غلط SIM PIN کوڈ، اس سے پہلے کہ آپ اپنا آلہ غیر مقفل کرنے کیلئے لازمی طور پر اپنے کیریئر سے رابطہ کریں آپ کے پاس <xliff:g id="NUMBER">%d</xliff:g> کوشش بچی ہے۔"</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN کارروائی ناکام ہو گئی!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK کارروائی ناکام ہو گئی!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"کوڈ قبول کر لیا گیا!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"سابقہ ٹریک بٹن"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"اگلا ٹریک بٹن"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"موقوف کرنے کا بٹن"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"چلائیں بٹن"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"روکیں بٹن"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"کوئی سروس نہیں ہے۔"</string>
</resources>
diff --git a/packages/Keyguard/res/values-uz-rUZ/strings.xml b/packages/Keyguard/res/values-uz-rUZ/strings.xml
index cc891b2..31eb593 100644
--- a/packages/Keyguard/res/values-uz-rUZ/strings.xml
+++ b/packages/Keyguard/res/values-uz-rUZ/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Qulfni ochish uchun parolni kiriting"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Qulfni ochish uchun PIN-kodni kiriting"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Noto‘g‘ri PIN kod."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Qulfni ochish uchun avval \"Menu\"ni, so‘ngra 0 raqamini bosing."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Yuzni tanitib qulfni ochishga urinish miqdoridan oshib ketdi"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Zaryad to‘ldi"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Quvvat olmoqda"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Zaryadlagichni ulang."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM karta qulflangan."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM karta PUK kod bilan qulflangan."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM karta qulfi ochilmoqda…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Vidjet %2$d / %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Vidjet qo‘shish."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Bo‘sh"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Qulfni ochish maydoni kengaytirildi."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Qulfni ochish maydoni yig‘ildi."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> vidjeti."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Foydalanuvchi tanlagichi"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Kamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Media boshqaruvlari"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Vidjetlarni saralashni boshlandi."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Vidjetlarni saralash tugatildi."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> vidjeti o‘chirildi."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Qulfni ochish maydonini kengaytirish."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Qulfni silab ochish"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Chizmali qulfni ochish."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Qulfni yuzni tanitib ochish"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin qulfini ochish."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN kod maydoni"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM karta PIN kodi maydoni"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM karta PUK kodi maydoni"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Avvalgi qo‘shiq tugmasi"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Keyingi qo‘shiq tugmasi"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Pauza tugmasi"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Ijro etish tugmasi"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"To‘xtatish tugmasi"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Yoqdi"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Yoqmadi"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Yurak"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Avval qulfni oching"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Ishga tushirish bekor qilindi"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"O‘chirish uchun <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>ni pastga tashlang."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> o‘chirilmaydi."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Keyingi uyg‘otkich <xliff:g id="ALARM">%1$s</xliff:g> uchun o‘rnatildi"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Bekor qilish"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"O‘chirish"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Tayyor"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Usulni o‘zgartirish"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Kiritish"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Qulfni ochish"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Kamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Ovozsiz"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Ovoz yoqib qo‘yilgan"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Izlash"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun yuqoriga suring."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun pastga suring."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun chapga suring."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun o‘ngga suring."</string>
- <string name="user_switched" msgid="3768006783166984410">"Joriy foydalanuvchi <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Favqulodda qo‘ng‘iroq"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Chizmali parol unutilgan"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Xato chizma paroli"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"To‘g‘ri PUK kodni qayta kiriting. Qayta-qayta urinishlar SIM kartani butunlay o‘chirib qo‘yadi."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN kodlar bir xil emas"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Chizmali parolni ochishga juda ko‘p urinildi"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Qulfni ochish uchun Google hisobingiz bilan kiring."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Foydalanuvchi nomi (e-pochta)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Parol"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Hisobga kirish"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Foydalanuvchi nomi yoki parol xato."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Foydalanuvchi nomingiz yoki parolingizni unutdingizmi?\n "<b>"google.com/accounts/recovery"</b>"ga tashrif buyuring."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Hisob tekshirilmoqda…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PIN kodingizni <xliff:g id="NUMBER_0">%d</xliff:g> marta xato kiritdingiz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qaytadan urinib ko‘ring."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Parolingizni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qaytadan urinib ko‘ring."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Chizmali parolingizni <xliff:g id="NUMBER_0">%d</xliff:g> marta xato chizdingiz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qaytadan urinib ko‘ring."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Siz telefonni qulfdan chiqarish uchun <xliff:g id="NUMBER">%d</xliff:g> marta noto‘g‘ri urinish qildingiz. Endi, ishchi profil o‘chirib tashlanadi va undagi barcha ma’lumotlar ham o‘chib ketadi."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Chizmali parolni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri chizdingiz. <xliff:g id="NUMBER_1">%d</xliff:g> marta muvaffaqiyatsiz urinishdan so‘ng, sizdan e-pochtangizdan foydalanib, planshet qulfini ochishingiz so‘raladi.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng yana urinib ko‘ring."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Chizmali parolni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri chizdingiz. <xliff:g id="NUMBER_1">%d</xliff:g> marta muvaffaqiyatsiz urinishdan so‘ng, sizdan e-pochtangizdan foydalanib, telefon qulfini ochishingiz so‘raladi.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng yana urinib ko‘ring."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"O‘chirish"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM karta PIN kodi noto‘g‘ri. Qurilma qulfini ochish uchun aloqa operatoringiz bilan bog‘laning."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"SIM karta PIN kodi noto‘g‘ri terildi, yana <xliff:g id="NUMBER">%d</xliff:g> marta uirinib ko‘rishingiz mumkin, urinishlar tugagandan keyin qurilmangizni qulfdan chiqarish uchun aloqa operatoringiz bilan bog‘lanishingiz kerak."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM karta PIN jarayoni amalga oshmadi!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM karta PUK jarayoni amalga oshmadi!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Kod qabul qilindi!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Avvalgi qo‘shiq tugmasi"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Keyingi qo‘shiq tugmasi"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Pauza tugmasi"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Ijro etish tugmasi"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"To‘xtatish tugmasi"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Aloqa yo‘q."</string>
</resources>
diff --git a/packages/Keyguard/res/values-vi/strings.xml b/packages/Keyguard/res/values-vi/strings.xml
index 0190f1c..0dcbaad 100644
--- a/packages/Keyguard/res/values-vi/strings.xml
+++ b/packages/Keyguard/res/values-vi/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Nhập mật khẩu để mở khóa"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Nhập mã PIN để mở khóa"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Mã PIN không chính xác."</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Để mở khóa, hãy nhấn vào Menu sau đó nhấn 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Đã vượt quá số lần Mở khóa bằng khuôn mặt tối đa"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Pin đầy"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Đang sạc"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Kết nối bộ sạc của bạn."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Thẻ SIM đã bị khóa."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Thẻ SIM đã bị khóa PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Đang mở khóa thẻ SIM…"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Tiện ích %2$d trong số %3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Thêm tiện ích."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Trống"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Đã mở rộng vùng khóa."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Đã thu gọn vùng khóa."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> tiện ích."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Bộ chọn người dùng"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Máy ảnh"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Điều khiển phương tiện"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Đã bắt đầu xắp xếp lại tiện ích."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Đã kết thúc sắp xếp lại tiện ích."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Đã xóa tiện ích <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Mở rộng vùng khóa."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Mở khóa bằng cách trượt."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Mở khóa bằng hình."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Mở khóa bằng khuôn mặt."</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Mở khóa bằng mã pin."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Khu vực mã PIN"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Khu vực mã PIN của SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Khu vực PUK của SIM"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Nút bản nhạc trước"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Nút bản nhạc tiếp theo"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Nút tạm dừng"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Nút phát"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Nút dừng"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Bài hát được đánh dấu thích"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Bài hát được đánh dấu không thích"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Trái tim"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Mở khóa để tiếp tục"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Quá trình chạy bị hủy"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Thả <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> để xóa."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> sẽ không bị xóa."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Báo thức tiếp theo được đặt cho <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Hủy"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Xóa"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Xong"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Thay đổi chế độ"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Mở khóa"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Máy ảnh"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Im lặng"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Bật âm thanh"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Tìm kiếm"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Trượt lên để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Trượt xuống để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Trượt sang trái để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Trượt sang phải để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Người dùng hiện tại <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Cuộc gọi khẩn cấp"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Đã quên hình"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Hình sai"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Hãy nhập lại mã PUK chính xác. Nhiều lần lặp lại sẽ vô hiệu hóa vĩnh viễn thẻ SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Mã PIN không khớp"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Quá nhiều lần nhập hình"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Để mở khóa, hãy đăng nhập bằng tài khoản Google của bạn."</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Tên người dùng (email)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Mật khẩu"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Đăng nhập"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Tên người dùng hoặc mật khẩu không hợp lệ."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Bạn quên tên người dùng hoặc mật khẩu?\nHãy truy cập "<b>"google.com/accounts/recovery"</b>"."</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Đang kiểm tra tài khoản…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Bạn đã <xliff:g id="NUMBER_0">%d</xliff:g> lần nhập sai mã PIN của mình. Hãy \n\nthử lại sau <xliff:g id="NUMBER_1">%d</xliff:g> giây."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Bạn đã <xliff:g id="NUMBER_0">%d</xliff:g> lần nhập sai mật khẩu của mình. Hãy \n\nthử lại sau <xliff:g id="NUMBER_1">%d</xliff:g> giây."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Bạn đã <xliff:g id="NUMBER_0">%d</xliff:g> lần vẽ không chính xác hình mở khóa của mình. Hãy \n\nthử lại sau <xliff:g id="NUMBER_1">%d</xliff:g> giây."</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Bạn đã mở khóa điện thoại sai <xliff:g id="NUMBER">%d</xliff:g> lần. Hồ sơ công việc sẽ bị xóa, tức là tất cả dữ liệu hồ sơ sẽ bị xóa."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Bạn đã <xliff:g id="NUMBER_0">%d</xliff:g> lần vẽ không chính xác hình mở khóa của mình. Sau <xliff:g id="NUMBER_1">%d</xliff:g> lần thử không thành công nữa, bạn sẽ được yêu cầu mở khóa máy tính bảng bằng tài khoản email.\n\n Vui lòng thử lại sau <xliff:g id="NUMBER_2">%d</xliff:g> giây."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Bạn đã <xliff:g id="NUMBER_0">%d</xliff:g> lần vẽ không chính xác hình mở khóa của mình. Sau <xliff:g id="NUMBER_1">%d</xliff:g> lần thử không thành công nữa, bạn sẽ được yêu cầu mở khóa điện thoại bằng tài khoản email.\n\n Vui lòng thử lại sau <xliff:g id="NUMBER_2">%d</xliff:g> giây."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Xóa"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Mã PIN của SIM không chính xác, bây giờ bạn phải liên hệ với nhà cung cấp dịch vụ để mở khóa thiết bị của bạn."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Mã PIN của SIM không chính xác, bạn còn <xliff:g id="NUMBER">%d</xliff:g> lần thử trước khi bạn phải liên hệ với nhà cung cấp dịch vụ để mở khóa thiết bị của bạn."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Thao tác mã PIN của SIM không thành công!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Thao tác mã PUK của SIM không thành công!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Mã được chấp nhận!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Nút bản nhạc trước"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Nút bản nhạc tiếp theo"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Nút tạm dừng"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Nút phát"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Nút dừng"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Không có dịch vụ."</string>
</resources>
diff --git a/packages/Keyguard/res/values-zh-rCN/strings.xml b/packages/Keyguard/res/values-zh-rCN/strings.xml
index 449cc1e..c5d61ac 100644
--- a/packages/Keyguard/res/values-zh-rCN/strings.xml
+++ b/packages/Keyguard/res/values-zh-rCN/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"输入密码以解锁"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"输入PIN码进行解锁"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"PIN码有误。"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"要解锁,请先按 MENU 再按 0。"</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"已超过“人脸解锁”尝试次数上限"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"充电完成"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"正在充电"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"请连接充电器。"</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM卡已被锁定。"</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM卡已被PUK码锁定。"</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"正在解锁SIM卡..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。%3$d的小部件%2$d。"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"添加小部件。"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"空白"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"已展开解锁区域。"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"已折叠解锁区域。"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>小部件。"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"用户选择器"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"相机"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"媒体控制"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"已开始将小部件重新排序。"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"已完成小部件重新排序。"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"已删除小部件<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>。"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"展开解锁区域。"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"滑动解锁。"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"图案解锁。"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"人脸解锁。"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN码解锁。"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN 码区域"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM 卡 PIN 码区域"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM 卡 PUK 码区域"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"上一曲按钮"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"下一曲按钮"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"暂停按钮"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"播放按钮"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"停止按钮"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"我喜欢"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"不喜欢"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"爱心"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"解锁即可继续"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"启动已取消"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"放下<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>即可将其删除。"</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>将不会被删除。"</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"下次闹钟时间已设置为<xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"取消"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"完成"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"模式更改"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"解锁"</string>
- <string name="description_target_camera" msgid="969071997552486814">"相机"</string>
- <string name="description_target_silent" msgid="893551287746522182">"静音"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"打开声音"</string>
- <string name="description_target_search" msgid="3091587249776033139">"搜索"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"向上滑动以<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
- <string name="description_direction_down" msgid="5087739728639014595">"向下滑动以<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
- <string name="description_direction_left" msgid="7207478719805562165">"向左滑动以<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
- <string name="description_direction_right" msgid="8034433242579600980">"向右滑动以<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
- <string name="user_switched" msgid="3768006783166984410">"当前用户是<xliff:g id="NAME">%1$s</xliff:g>。"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"紧急呼救"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"忘记了图案"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"图案错误"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"请重新输入正确的PUK码。如果尝试错误次数过多,SIM卡将永久停用。"</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN码不匹配"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"图案尝试次数过多"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"要解锁,请登录您的Google帐户。"</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"用户名(电子邮件地址)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"密码"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"登录"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"用户名或密码无效。"</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"忘记了用户名或密码?\n请访问 "<b>"google.com/accounts/recovery"</b>"。"</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"正在检查帐户…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"您已经<xliff:g id="NUMBER_0">%d</xliff:g>次输错了PIN码。\n\n请在<xliff:g id="NUMBER_1">%d</xliff:g>秒后重试。"</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次错误地输入了密码。\n\n请在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒后重试。"</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次错误地绘制了解锁图案。\n\n请在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒后重试。"</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"您已经 <xliff:g id="NUMBER">%d</xliff:g> 次错误地尝试解锁手机。系统将移除此工作资料,这会删除所有的工作资料数据。"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次错误地绘制了解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件帐户解锁平板电脑。\n\n请在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒后重试。"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次错误地绘制了解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件帐户解锁手机。\n\n请在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒后重试。"</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"删除"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM卡PIN码不正确,您现在必须联系运营商为您解锁设备。"</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"SIM卡PIN码不正确,您还有<xliff:g id="NUMBER">%d</xliff:g>次尝试机会。如果仍然失败,则必须联系运营商帮您解锁设备。"</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM卡PIN码操作失败!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM卡PUK码操作失败!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"代码正确!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"“上一曲”按钮"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"“下一曲”按钮"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"“暂停”按钮"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"“播放”按钮"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"“停止”按钮"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"无服务。"</string>
</resources>
diff --git a/packages/Keyguard/res/values-zh-rHK/strings.xml b/packages/Keyguard/res/values-zh-rHK/strings.xml
index be19441..2aa5d62 100644
--- a/packages/Keyguard/res/values-zh-rHK/strings.xml
+++ b/packages/Keyguard/res/values-zh-rHK/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"輸入密碼即可解鎖"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"輸入 PIN 碼即可解鎖"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"PIN 碼不正確。"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"如要解鎖,請按選單鍵,然後按 0。"</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"已超過臉容解鎖嘗試次數上限"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"充電完成"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"充電中"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"請連接充電器。"</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM 卡處於鎖定狀態。"</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM 卡處於 PUK 鎖定狀態。"</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"正在解開上鎖的 SIM 卡..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。第 %2$d 個小工具,共 %3$d 個。"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"新增小工具。"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"空白"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"解鎖區域已展開。"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"解鎖區域已收合。"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>小工具。"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"使用者選取工具"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"相機"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"媒體控制"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"已開始為小工具重新排列次序。"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"已完成為小工具重新排列次序。"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>小工具已刪除。"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"展開解鎖區域。"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"滑動解鎖。"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"圖案解鎖。"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"臉容解鎖。"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN 解鎖。"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN 區域"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN 區域"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK 區域"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"[上一首曲目] 按鈕"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"[下一首曲目] 按鈕"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"[暫停] 按鈕"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"[播放] 按鈕"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"[停止] 按鈕"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"喜歡"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"不喜歡"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"心形"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"請解鎖以繼續"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"已取消啟動"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"拖放「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>」即可刪除。"</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>」將不會被刪除。"</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"已設定下一個鬧鐘時間:<xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"取消"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"刪除"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"完成"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"模式更改"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift 鍵"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter 鍵"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"解鎖"</string>
- <string name="description_target_camera" msgid="969071997552486814">"相機"</string>
- <string name="description_target_silent" msgid="893551287746522182">"靜音"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"音效已開啟"</string>
- <string name="description_target_search" msgid="3091587249776033139">"搜尋"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"向上滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
- <string name="description_direction_down" msgid="5087739728639014595">"向下滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
- <string name="description_direction_left" msgid="7207478719805562165">"向左滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
- <string name="description_direction_right" msgid="8034433242579600980">"向右滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
- <string name="user_switched" msgid="3768006783166984410">"目前的使用者是<xliff:g id="NAME">%1$s</xliff:g>。"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"緊急電話"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"忘記圖案"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"圖案錯誤"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"請重新輸入正確的 PUK 碼。如果嘗試輸入的次數過多,SIM 卡將永久停用。"</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN 碼不符"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"圖案嘗試次數過多"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"如要解鎖,請以 Google 帳戶登入。"</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"使用者名稱 (電子郵件)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"密碼"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"登入"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"無效的使用者名稱或密碼。"</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"忘記使用者名稱或密碼?\n請瀏覽 "<b>"google.com/accounts/recovery"</b>"。"</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"正在檢查帳戶…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"您已輸入錯誤的 PIN 碼 <xliff:g id="NUMBER_0">%d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後再試一次。"</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"您已輸入錯誤的密碼 <xliff:g id="NUMBER_0">%d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後再試一次。"</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"您已畫錯解鎖圖案 <xliff:g id="NUMBER_0">%d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後再試一次。"</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"您已 <xliff:g id="NUMBER">%d</xliff:g> 次錯誤解鎖手機。該工作設定檔將被移除,所有設定檔資料將因此被刪除。"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"您已畫錯解鎖圖案 <xliff:g id="NUMBER_0">%d</xliff:g> 次,如果再嘗試 <xliff:g id="NUMBER_1">%d</xliff:g> 次仍未成功,系統會要求您透過電郵帳戶解開上鎖的平板電腦。\n\n請在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒後再試一次。"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"您已畫錯解鎖圖案 <xliff:g id="NUMBER_0">%d</xliff:g> 次,如果再嘗試 <xliff:g id="NUMBER_1">%d</xliff:g> 次仍未成功,系統會要求您透過電郵帳戶解開上鎖的手機。\n\n請在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒後再試一次。"</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"移除"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM PIN 碼不正確,您現在必須聯絡流動網絡供應商為您的裝置解鎖。"</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"SIM PIN 碼不正確,您剩下 <xliff:g id="NUMBER">%d</xliff:g> 次機會輸入。如果仍然輸入錯誤,您必須聯絡流動網絡供應商為您的裝置解鎖。"</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM PIN 碼操作失敗!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM PUK 碼操作失敗!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"密碼正確!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"[上一首曲目] 按鈕"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"[下一首曲目] 按鈕"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"[暫停] 按鈕"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"[播放] 按鈕"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"[停止] 按鈕"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"沒有服務。"</string>
</resources>
diff --git a/packages/Keyguard/res/values-zh-rTW/strings.xml b/packages/Keyguard/res/values-zh-rTW/strings.xml
index 82ef9d1..f9a8cdb 100644
--- a/packages/Keyguard/res/values-zh-rTW/strings.xml
+++ b/packages/Keyguard/res/values-zh-rTW/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"輸入密碼即可解鎖"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"輸入 PIN 即可解鎖"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"PIN 碼不正確。"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"如要解鎖,請按 Menu 鍵,然後按 0。"</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"已超過人臉解鎖嘗試次數上限"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"充電完成"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"充電中"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"連接充電器。"</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM 卡處於鎖定狀態。"</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM 卡處於 PUK 鎖定狀態"</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"正在解除 SIM 卡鎖定..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。第 %2$d 個小工具,共 %3$d 個。"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"新增小工具。"</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"空白"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"解鎖區域已展開。"</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"解鎖區域已收合。"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>小工具。"</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"使用者選取工具"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"相機"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"媒體控制項"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"已開始將小工具重新排序。"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"小工具重新排序已完成。"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>小工具已刪除。"</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"展開解鎖區域。"</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"滑動解鎖。"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"圖形解鎖。"</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"人臉解鎖。"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN 解鎖。"</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN 區"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM 卡 PIN 區"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM 卡 PUK 區"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"[上一首曲目] 按鈕"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"[下一首曲目] 按鈕"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"[暫停] 按鈕"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"[播放] 按鈕"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"[停止] 按鈕"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"喜歡"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"不喜歡"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"愛心"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"先解鎖才能繼續操作"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"已取消啟動"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"拖放「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>」即可將其刪除。"</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>」將不會遭到刪除。"</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"已設定下一個鬧鐘時間:<xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt 鍵"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"取消"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete 鍵"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"完成"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"模式變更"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift 鍵"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter 鍵"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"解除鎖定"</string>
- <string name="description_target_camera" msgid="969071997552486814">"相機"</string>
- <string name="description_target_silent" msgid="893551287746522182">"靜音"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"開啟音效"</string>
- <string name="description_target_search" msgid="3091587249776033139">"搜尋"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"向上滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
- <string name="description_direction_down" msgid="5087739728639014595">"向下滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
- <string name="description_direction_left" msgid="7207478719805562165">"向左滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
- <string name="description_direction_right" msgid="8034433242579600980">"向右滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
- <string name="user_switched" msgid="3768006783166984410">"目前的使用者是 <xliff:g id="NAME">%1$s</xliff:g>。"</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"緊急電話"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"忘記圖形"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"圖形錯誤"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"重新輸入正確的 PUK 碼。如果錯誤次數過多,SIM 卡將會永久停用。"</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN 碼不符"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"圖形嘗試次數過多"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"如要解除鎖定,請使用 Google 帳戶登入。"</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"使用者名稱 (電子郵件)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"密碼"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"登入"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"使用者名稱或密碼無效。"</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"忘了使用者名稱或密碼?\n請前往 "<b>"google.com/accounts/recovery"</b>"。"</string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"正在檢查帳戶…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"您的 PIN 已輸錯 <xliff:g id="NUMBER_0">%d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後再試一次。"</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"您的密碼已輸錯 <xliff:g id="NUMBER_0">%d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後再試一次。"</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"您的解鎖圖形已畫錯 <xliff:g id="NUMBER_0">%d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後再試一次。"</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"您嘗試解鎖手機已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次。您的 Work 設定檔將遭到移除,所有設定檔資料也會一併遭到刪除。"</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"您的解鎖圖形已畫錯 <xliff:g id="NUMBER_0">%d</xliff:g> 次,如果再嘗試 <xliff:g id="NUMBER_1">%d</xliff:g> 次仍未成功,系統就會要求您透過電子郵件帳戶解除平板電腦的鎖定狀態。\n\n請在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒後再試一次。"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"您的解鎖圖形已畫錯 <xliff:g id="NUMBER_0">%d</xliff:g> 次,如果再嘗試 <xliff:g id="NUMBER_1">%d</xliff:g> 次仍未成功,系統就會要求您透過電子郵件帳戶解除手機的鎖定狀態。\n\n請在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒後再試一次。"</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"移除"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM 卡的 PIN 碼輸入錯誤,您現在必須請行動通訊業者為裝置解鎖。"</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"SIM 卡的 PIN 碼輸入錯誤,您還可以再試 <xliff:g id="NUMBER">%d</xliff:g> 次。如果仍然失敗,就必須請行動通訊業者為裝置解鎖。"</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM 卡 PIN 碼操作失敗!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM 卡 PUK 碼操作失敗!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"密碼正確!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"[上一首曲目] 按鈕"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"[下一首曲目] 按鈕"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"[暫停] 按鈕"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"[播放] 按鈕"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"[停止] 按鈕"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"沒有服務。"</string>
</resources>
diff --git a/packages/Keyguard/res/values-zu/strings.xml b/packages/Keyguard/res/values-zu/strings.xml
index f8c8f53..4c8f757 100644
--- a/packages/Keyguard/res/values-zu/strings.xml
+++ b/packages/Keyguard/res/values-zu/strings.xml
@@ -29,8 +29,6 @@
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Bhala iphasiwedi ukuze kuvuleke"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Faka i-PIN ukuvula"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Ikhodi ye-PIN engalungile!"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"Ukuvula, chofoza Menyu bese 0."</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Ukuzama Kokuvula Ubuso Okuningi kudluliwe"</string>
<string name="keyguard_charged" msgid="3272223906073492454">"Kushajiwe"</string>
<string name="keyguard_plugged_in" msgid="9087497435553252863">"Iyashaja"</string>
<string name="keyguard_low_battery" msgid="8143808018719173859">"Xhuma ishaja yakho."</string>
@@ -46,20 +44,6 @@
<string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Ikhadi le-SIM likhiyiwe."</string>
<string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Ikhadi le-SIM likhiywe nge-PUK."</string>
<string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Ivula ikhadi le-SIM..."</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. iwijethi %2$d ye-%3$d."</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Engeza iwijethi."</string>
- <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Akunalutho"</string>
- <string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"Indawo yokuvula inwetshisiwe."</string>
- <string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"Indawo yokuvula inciphisiwe."</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> iwijethi."</string>
- <string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"Isikhethi somsebenzisi"</string>
- <string name="keyguard_accessibility_camera" msgid="8904231194181114603">"Ikhamera"</string>
- <string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"Izilawuli zemidiya"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"Ukuhlelwa kabusha kwewijethi kuqalile"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"Ukuhlelwa kabusha kwewijethi kuphelile."</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"Iwijethi <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> isusiwe."</string>
- <string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"Nwebisa indawo yokuvula."</string>
- <string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"Ukuvula ngokuslayida."</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ukuvula ngephethini."</string>
<string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Vula ngobuso"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Ukuvula ngephinikhodi."</string>
@@ -69,39 +53,9 @@
<string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Indawo yephinikhodi"</string>
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Indawo yephinikhodi ye-SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Indawo ye-SIM PUK"</string>
- <string name="keyguard_accessibility_transport_prev_description" msgid="1337286538318543555">"Inkinombo yethrekhi yangaphambilini"</string>
- <string name="keyguard_accessibility_transport_next_description" msgid="7073928300444909320">"Inkinobho yethrekhi elandelayo"</string>
- <string name="keyguard_accessibility_transport_pause_description" msgid="8455979545295224302">"Inkinobho yokumiswa isikhashana"</string>
- <string name="keyguard_accessibility_transport_play_description" msgid="8146417789511154044">"Inkinobho yokudlala"</string>
- <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Inkinobho yokumisa"</string>
- <string name="keyguard_accessibility_transport_thumbs_up_description" msgid="4535938129663903194">"Okushaphu"</string>
- <string name="keyguard_accessibility_transport_thumbs_down_description" msgid="8101433677192177861">"Akulungile"</string>
- <string name="keyguard_accessibility_transport_heart_description" msgid="2336943232474689887">"Inhliziyo"</string>
- <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Vula ukuze uqhubeke"</string>
- <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Ukuqalisa kukhanseliwe"</string>
- <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Lahla i-<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ukuze uyisuse."</string>
- <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ngeke isuswe."</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"I-alamu elandelayo esethelwe i-<xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string>
- <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string>
- <string name="password_keyboard_label_alt_key" msgid="1284820942620288678">"ALT"</string>
- <string name="keyboardview_keycode_alt" msgid="4856868820040051939">"i-ALT"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"Khansela"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Susa"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"Kwenziwe"</string>
- <string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Ukushintsha kwendlela esetshenziswayo"</string>
- <string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Beka kwenye indawo"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Faka"</string>
- <string name="description_target_unlock" msgid="2228524900439801453">"Vula"</string>
- <string name="description_target_camera" msgid="969071997552486814">"Ikhamera"</string>
- <string name="description_target_silent" msgid="893551287746522182">"Thulile"</string>
- <string name="description_target_soundon" msgid="30052466675500172">"Umsindo uvuliwe"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Sesha"</string>
- <string name="description_direction_up" msgid="7169032478259485180">"Shelelisela ngenhla ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_down" msgid="5087739728639014595">"Shelelisela ngezansi ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_left" msgid="7207478719805562165">"Shelelisela ngakwesokunxele ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="description_direction_right" msgid="8034433242579600980">"Shelelisela ngakwesokudla ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
- <string name="user_switched" msgid="3768006783166984410">"Umsebenzisi wamanje <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="kg_emergency_call_label" msgid="684946192523830531">"Ucingo lwezimo eziphuthumayo"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Ukhohlwe iphethini?"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Iphatheni engalungile"</string>
@@ -123,13 +77,6 @@
<string name="kg_invalid_puk" msgid="3638289409676051243">"Faka kabusha ikhodi ye-PUK elungile. Imizamo ephindiwe izokhubaza unaphakade i-SIM."</string>
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Iphinikhodi ayifani"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Kunemizamo eminingi kakhulu yephathini"</string>
- <string name="kg_login_instructions" msgid="1100551261265506448">"Ukuvula, ngena ngemvume kwi-akhawunti ye-Google"</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"Igama lomsebenzisi (i-imeyli)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"Iphasiwedi"</string>
- <string name="kg_login_submit_button" msgid="5355904582674054702">"Ngena ngemvume"</string>
- <string name="kg_login_invalid_input" msgid="5754664119319872197">"Igama lomsebezisi elingalungile noma iphasiwedi."</string>
- <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Ukhohlwe igama lomsebenzisi noma iphasiwedi?\nVakashela"<b>"google.com/accounts/recovery"</b></string>
- <string name="kg_login_checking_password" msgid="1052685197710252395">"Ukuhlola i-akhawunti…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Ubhale iphinikhodi ykho ngendlela engafanele izikhathi ezingu-<xliff:g id="NUMBER_0">%d</xliff:g>. \n\nZama futhi emasekhondini angu-<xliff:g id="NUMBER_1">%d</xliff:g>."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Ubhale iphasiwedi yakho ngendlela engafanele <xliff:g id="NUMBER_0">%d</xliff:g> izikhathi. \n\nZama futhi emasekhondini angu-<xliff:g id="NUMBER_1">%d</xliff:g>."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Udwebe iphathini yakho yokuvula ngendlela engafanele-<xliff:g id="NUMBER_0">%d</xliff:g>. \n\n Zama futhi emasekhondini angu-<xliff:g id="NUMBER_1">%d</xliff:g>"</string>
@@ -147,7 +94,6 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Uzame ngokungalungile ukuvula ifoni izikhathi ezingu-<xliff:g id="NUMBER">%d</xliff:g>. Iphrofayela yomsebenzi izosuswa, okuzosusa yonke idatha yephrofayela."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Udwebe ngokungalungile iphathini yakho yokuvula izikhathi ezingu-<xliff:g id="NUMBER_0">%d</xliff:g>. Emva <xliff:g id="NUMBER_1">%d</xliff:g> kweminye imizamo engaphumelelanga, uzocelwa ukuvula ithebhulethi yakho usebenzisa ukungena ngemvume kwi-Google.\n\n Sicela uzame futhi emuva kwamasekhondi angu-<xliff:g id="NUMBER_2">%d</xliff:g>"</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Ukulayisha ungenisa iphathini yakho yokuvula ngendlela engalungile izikhathi ezi-<xliff:g id="NUMBER_0">%d</xliff:g> Emva kweminye imizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g>, uzocelwa ukuvula ifoni yakho usebenzisa ukungena ngemvume ku-Google\n\n Zame futhi emumva kwengu- <xliff:g id="NUMBER_2">%d</xliff:g> amasekhondi."</string>
- <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Susa"</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Ikhodi yephinikhodi ye-SIM engalungile manje kumele uxhumane nenkampini yenethiwekhi yakho ukuvula idivayisi yakho."</string>
<plurals name="kg_password_wrong_pin_code">
<item quantity="one" msgid="8134313997799638254">"Ikhodi yephinikhodi ye-SIM engalungile, unemizamo engu-<xliff:g id="NUMBER">%d</xliff:g> esele ngaphambi kokuba uxhumane nenkampini yenethiwekhi."</item>
@@ -161,10 +107,5 @@
<string name="kg_password_pin_failed" msgid="6268288093558031564">"Umsebenzi wephinikhodi ye-SIM wehlulekile!"</string>
<string name="kg_password_puk_failed" msgid="2838824369502455984">"Umsebenzi we-PUK ye-SIM wehlulekile!"</string>
<string name="kg_pin_accepted" msgid="1448241673570020097">"Ikhodi yamukelwe!"</string>
- <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"Inkinombo yethrekhi yangaphambilini"</string>
- <string name="keyguard_transport_next_description" msgid="4299258300283778305">"Inkinobho yethrekhi elandelayo"</string>
- <string name="keyguard_transport_pause_description" msgid="5093073338238310224">"Inkinobho yokumiswa isikhashana"</string>
- <string name="keyguard_transport_play_description" msgid="2924628863741150956">"Inkinobho yokudlala"</string>
- <string name="keyguard_transport_stop_description" msgid="3084179324810575787">"Inkinobho yokumisa"</string>
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Ayikho isevisi."</string>
</resources>
diff --git a/packages/Keyguard/res/values/alias.xml b/packages/Keyguard/res/values/alias.xml
index 09e9591..f06b450 100644
--- a/packages/Keyguard/res/values/alias.xml
+++ b/packages/Keyguard/res/values/alias.xml
@@ -22,18 +22,6 @@
<!-- Alias used to reference framework color for transparency. -->
<item type="color" name="transparent">@android:color/transparent</item>
- <!-- Alias used to reference framework drawable in keyguard. -->
- <item type="drawable" name="stat_sys_warning">@android:drawable/stat_sys_warning</item>
-
- <!-- Alias used to reference framework drawable in keyguard. -->
- <item type="drawable" name="ic_media_pause">@android:drawable/ic_media_pause</item>
-
- <!-- Alias used to reference framework drawable in keyguard. -->
- <item type="drawable" name="ic_media_stop">@*android:drawable/ic_media_stop</item>
-
- <!-- Alias used to reference framework drawable in keyguard. -->
- <item type="drawable" name="ic_contact_picture">@*android:drawable/ic_contact_picture</item>
-
<!-- Alias used to reference framework "OK" string in keyguard. -->
<item type="string" name="ok">@*android:string/ok</item>
diff --git a/packages/Keyguard/res/values/attrs.xml b/packages/Keyguard/res/values/attrs.xml
index 9100140..96a5bcc 100644
--- a/packages/Keyguard/res/values/attrs.xml
+++ b/packages/Keyguard/res/values/attrs.xml
@@ -20,113 +20,9 @@
-->
<resources>
- <!-- Standard gravity constant that a child supplies to its parent.
- Defines how the child view should be positioned, on both the X and Y axes, within its enclosing layout. -->
- <attr name="layout_gravity">
- <!-- Push object to the top of its container, not changing its size. -->
- <flag name="top" value="0x30" />
- <!-- Push object to the bottom of its container, not changing its size. -->
- <flag name="bottom" value="0x50" />
- <!-- Push object to the left of its container, not changing its size. -->
- <flag name="left" value="0x03" />
- <!-- Push object to the right of its container, not changing its size. -->
- <flag name="right" value="0x05" />
- <!-- Place object in the vertical center of its container, not changing its size. -->
- <flag name="center_vertical" value="0x10" />
- <!-- Grow the vertical size of the object if needed so it completely fills its container. -->
- <flag name="fill_vertical" value="0x70" />
- <!-- Place object in the horizontal center of its container, not changing its size. -->
- <flag name="center_horizontal" value="0x01" />
- <!-- Grow the horizontal size of the object if needed so it completely fills its container. -->
- <flag name="fill_horizontal" value="0x07" />
- <!-- Place the object in the center of its container in both the vertical and horizontal axis, not changing its size. -->
- <flag name="center" value="0x11" />
- <!-- Grow the horizontal and vertical size of the object if needed so it completely fills its container. -->
- <flag name="fill" value="0x77" />
- <!-- Additional option that can be set to have the top and/or bottom edges of
- the child clipped to its container's bounds.
- The clip will be based on the vertical gravity: a top gravity will clip the bottom
- edge, a bottom gravity will clip the top edge, and neither will clip both edges. -->
- <flag name="clip_vertical" value="0x80" />
- <!-- Additional option that can be set to have the left and/or right edges of
- the child clipped to its container's bounds.
- The clip will be based on the horizontal gravity: a left gravity will clip the right
- edge, a right gravity will clip the left edge, and neither will clip both edges. -->
- <flag name="clip_horizontal" value="0x08" />
- <!-- Push object to the beginning of its container, not changing its size. -->
- <flag name="start" value="0x00800003" />
- <!-- Push object to the end of its container, not changing its size. -->
- <flag name="end" value="0x00800005" />
- </attr>
-
-
- <!-- PagedView specific attributes. These attributes are used to customize
- a PagedView view in XML files. -->
- <declare-styleable name="PagedView">
- <!-- The space between adjacent pages of the PagedView. -->
- <attr name="pageSpacing" format="dimension" />
- <!-- The padding for the scroll indicator area -->
- <attr name="scrollIndicatorPaddingLeft" format="dimension" />
- <attr name="scrollIndicatorPaddingRight" format="dimension" />
- </declare-styleable>
-
- <declare-styleable name="KeyguardGlowStripView">
- <attr name="dotSize" format="dimension" />
- <attr name="numDots" format="integer" />
- <attr name="glowDot" format="reference" />
- <attr name="leftToRight" format="boolean" />
- </declare-styleable>
-
- <!-- Some child types have special behavior. -->
- <attr name="layout_childType">
- <!-- No special behavior. Layout will proceed as normal. -->
- <enum name="none" value="0" />
- <!-- Widget container.
- This will be resized in response to certain events. -->
- <enum name="widget" value="1" />
- <!-- Security challenge container.
- This will be dismissed/shown in response to certain events,
- possibly obscuring widget elements. -->
- <enum name="challenge" value="2" />
- <!-- User switcher.
- This will consume space from the total layout area. -->
- <enum name="userSwitcher" value="3" />
- <!-- Scrim. This will block access to child views that
- come before it in the child list in bouncer mode. -->
- <enum name="scrim" value="4" />
- <!-- The home for widgets. All widgets will be descendents of this. -->
- <enum name="widgets" value="5" />
- <!-- This is a handle that is used for expanding the
- security challenge container when it is collapsed. -->
- <enum name="expandChallengeHandle" value="6" />
- <!-- Delete drop target. This will be the drop target to delete pages. -->
- <enum name="pageDeleteDropTarget" value="7" />
- </attr>
-
- <declare-styleable name="SlidingChallengeLayout_Layout">
- <attr name="layout_childType" />
- <attr name="layout_maxHeight" format="dimension" />
- </declare-styleable>
-
- <declare-styleable name="MultiPaneChallengeLayout">
- <!-- Influences how layout_centerWithinArea behaves -->
- <attr name="android:orientation" />
- </declare-styleable>
-
- <declare-styleable name="MultiPaneChallengeLayout_Layout">
- <!-- Percentage of the screen this child should consume or center within.
- If 0/default, the view will be measured by standard rules
- as if this were a FrameLayout. -->
- <attr name="layout_centerWithinArea" format="float" />
- <attr name="layout_childType" />
- <attr name="layout_gravity" />
- <attr name="layout_maxWidth" format="dimension" />
- <attr name="layout_maxHeight" />
- </declare-styleable>
-
<declare-styleable name="KeyguardSecurityViewFlipper_Layout">
- <attr name="layout_maxWidth" />
- <attr name="layout_maxHeight" />
+ <attr name="layout_maxWidth" format="dimension"/>
+ <attr name="layout_maxHeight" format="dimension" />
</declare-styleable>
<declare-styleable name="NumPadKey">
diff --git a/packages/Keyguard/res/values/bools.xml b/packages/Keyguard/res/values/bools.xml
index 5e842d7..2b83787 100644
--- a/packages/Keyguard/res/values/bools.xml
+++ b/packages/Keyguard/res/values/bools.xml
@@ -15,9 +15,6 @@
-->
<resources>
- <bool name="kg_enable_camera_default_widget">true</bool>
- <bool name="kg_center_small_widgets_vertically">false</bool>
- <bool name="kg_top_align_page_shrink_on_bouncer_visible">true</bool>
<bool name="kg_show_ime_at_screen_on">true</bool>
<bool name="kg_use_all_caps">true</bool>
</resources>
diff --git a/packages/Keyguard/res/values/colors.xml b/packages/Keyguard/res/values/colors.xml
index 4e28eff..3b741ea 100644
--- a/packages/Keyguard/res/values/colors.xml
+++ b/packages/Keyguard/res/values/colors.xml
@@ -14,15 +14,6 @@
limitations under the License.
-->
<resources>
- <!-- Keyguard colors -->
- <color name="keyguard_avatar_frame_color">#ffffffff</color>
- <color name="keyguard_avatar_frame_shadow_color">#80000000</color>
- <color name="keyguard_avatar_nick_color">#ffffffff</color>
- <color name="keyguard_avatar_frame_pressed_color">#ff35b5e5</color>
- <color name="kg_widget_pager_gradient">#ffffffff</color>
-
- <!-- FaceLock -->
- <color name="facelock_spotlight_mask">#CC000000</color>
<!-- Clock -->
<color name="clock_white">#ffffffff</color>
diff --git a/packages/Keyguard/res/values/config.xml b/packages/Keyguard/res/values/config.xml
index de17c4b..8d9d6ee 100644
--- a/packages/Keyguard/res/values/config.xml
+++ b/packages/Keyguard/res/values/config.xml
@@ -20,13 +20,6 @@
<!-- These resources are around just to allow their values to be customized -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Package name for default keyguard appwidget [DO NOT TRANSLATE] -->
- <string name="widget_default_package_name"></string>
-
- <!-- Class name for default keyguard appwidget [DO NOT TRANSLATE] -->
- <string name="widget_default_class_name"></string>
-
<!-- Allow the menu hard key to be disabled in LockScreen on some devices [DO NOT TRANSLATE] -->
<bool name="config_disableMenuKeyInLockScreen">false</bool>
-
</resources>
diff --git a/packages/Keyguard/res/values/dimens.xml b/packages/Keyguard/res/values/dimens.xml
index 8326d75..9290236 100644
--- a/packages/Keyguard/res/values/dimens.xml
+++ b/packages/Keyguard/res/values/dimens.xml
@@ -18,101 +18,10 @@
*/
-->
<resources>
- <!-- Size of lockscreen outerring on unsecure unlock LockScreen -->
- <dimen name="keyguard_lockscreen_outerring_diameter">270dp</dimen>
-
- <!-- The bottom margin for the GlowPadView container -->
- <dimen name="glowpadcontainer_bottom_margin">-80dp</dimen>
-
- <!-- Default target placement radius for GlowPadView. Should be 1/2 of outerring diameter. -->
- <dimen name="glowpadview_target_placement_radius">135dip</dimen>
-
- <!-- Default glow radius for GlowPadView -->
- <dimen name="glowpadview_glow_radius">75dip</dimen>
-
- <!-- Default distance beyond which GlowPadView snaps to the matching target -->
- <dimen name="glowpadview_snap_margin">40dip</dimen>
-
- <!-- Default distance from each snap target that GlowPadView considers a "hit" -->
- <dimen name="glowpadview_inner_radius">15dip</dimen>
-
- <!-- Size of status line font on Unsecure unlock LockScreen. -->
- <dimen name="keyguard_lockscreen_status_line_font_size">14dip</dimen>
-
- <!-- Size of right margin on Unsecure unlock LockScreen -->
- <dimen name="keyguard_lockscreen_status_line_font_right_margin">42dip</dimen>
-
- <!-- Size of top margin on Clock font to edge on unlock LockScreen -->
- <dimen name="keyguard_lockscreen_status_line_clockfont_top_margin">22dip</dimen>
-
- <!-- Size of top margin on Clock font to edge on unlock LockScreen -->
- <dimen name="keyguard_lockscreen_status_line_clockfont_bottom_margin">12dip</dimen>
-
- <!-- Padding on left margin of PIN text entry field to center it when del button is showing -->
- <dimen name="keyguard_lockscreen_pin_margin_left">40dip</dimen>
-
- <!-- Height of FaceUnlock view in keyguard -->
- <dimen name="face_unlock_height">330dip</dimen>
-
- <!-- Keyguard dimensions -->
- <!-- TEMP -->
- <dimen name="kg_security_panel_height">600dp</dimen>
-
- <!-- Height of security view in keyguard. -->
- <dimen name="kg_security_view_height">480dp</dimen>
-
- <!-- Width of widget view in keyguard. -->
- <dimen name="kg_widget_view_width">0dp</dimen>
-
- <!-- Height of widget view in keyguard. -->
- <dimen name="kg_widget_view_height">0dp</dimen>
-
- <!-- Size of the clock font in keyguard's status view -->
- <dimen name="kg_status_clock_font_size">75dp</dimen>
<!-- Size of the generic status lines keyguard's status view -->
<dimen name="kg_status_line_font_size">14sp</dimen>
- <!-- Size of margin on the right of keyguard's status view -->
- <dimen name="kg_status_line_font_right_margin">16dp</dimen>
-
- <!-- Top margin for the clock view -->
- <dimen name="kg_clock_top_margin">-16dp</dimen>
-
- <!-- Horizontal gap between keys in PIN and SIM PIN numeric keyboards in keyguard -->
- <dimen name="kg_key_horizontal_gap">0dp</dimen>
-
- <!-- Horizontal gap between keys in PIN and SIM PIN numeric keyboards in keyguard -->
- <dimen name="kg_key_vertical_gap">0dp</dimen>
-
- <!-- Horizontal gap between keys in PIN and SIM PIN numeric keyboards in keyguard -->
- <dimen name="kg_pin_key_height">60dp</dimen>
-
- <!-- Space reserved at the bottom of secure views (pin/pattern/password/SIM pin/SIM puk) -->
- <dimen name="kg_secure_padding_height">46dp</dimen>
-
- <!-- The height of the runway lights strip -->
- <dimen name="kg_runway_lights_height">7dp</dimen>
-
- <!-- The height of the runway lights strip -->
- <dimen name="kg_runway_lights_vertical_padding">2dp</dimen>
-
- <!-- Horizontal padding for the widget pager -->
- <dimen name="kg_widget_pager_horizontal_padding">16dp</dimen>
-
- <!-- Top padding for the widget pager -->
- <dimen name="kg_widget_pager_top_padding">0dp</dimen>
-
- <!-- Bottom padding for the widget pager -->
- <dimen name="kg_widget_pager_bottom_padding">64dp</dimen>
-
- <!-- Top margin for the runway lights. We add a negative margin in large
- devices to account for the widget pager padding -->
- <dimen name="kg_runway_lights_top_margin">0dp</dimen>
-
- <!-- Touch slop for the global toggle accessibility gesture -->
- <dimen name="accessibility_touch_slop">80dip</dimen>
-
<!-- Width of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) -->
<dimen name="keyguard_security_width">320dp</dimen>
@@ -125,44 +34,14 @@
<!-- Margin around the various security views -->
<dimen name="keyguard_security_view_margin">8dp</dimen>
- <!-- Margin around the various security views -->
- <dimen name="keyguard_muliuser_selector_margin">8dp</dimen>
-
- <!-- Stroke width of the frame for the circular avatars. -->
- <dimen name="keyguard_avatar_frame_stroke_width">2dp</dimen>
-
- <!-- Shadow radius under the frame for the circular avatars. -->
- <dimen name="keyguard_avatar_frame_shadow_radius">1dp</dimen>
-
- <!-- Size of the avator on hte multiuser lockscreen. -->
- <dimen name="keyguard_avatar_size">66dp</dimen>
-
- <!-- Size of the text under the avator on the multiuser lockscreen. -->
- <dimen name="keyguard_avatar_name_size">10sp</dimen>
-
- <!-- Size of the region along the edge of the screen that will accept
- swipes to scroll the widget area. -->
- <dimen name="kg_edge_swipe_region_size">24dp</dimen>
-
- <!-- If the height if keyguard drops below this threshold (most likely
- due to the appearance of the IME), then drop the multiuser selector. -->
- <dimen name="kg_squashed_layout_threshold">600dp</dimen>
-
- <!-- The height of widgets which do not support vertical resizing. This is only
- used on tablets; on phones, this size is determined by the space left by the
- security mode. -->
- <dimen name="kg_small_widget_height">160dp</dimen>
-
<!-- EmergencyCarrierArea overlap - amount to overlap the emergency button and carrier text.
Should be 0 on devices with plenty of room (e.g. tablets) -->
<dimen name="eca_overlap">-10dip</dimen>
<!-- Default clock parameters -->
<dimen name="bottom_text_spacing_digital">-10dp</dimen>
- <dimen name="label_font_size">14dp</dimen>
<dimen name="widget_label_font_size">16sp</dimen>
<dimen name="widget_big_font_size">88dp</dimen>
- <dimen name="big_font_size">120dp</dimen>
<!-- The y translation to apply at the start in appear animations. -->
<dimen name="appear_y_translation_start">32dp</dimen>
diff --git a/packages/Keyguard/res/values/integers.xml b/packages/Keyguard/res/values/integers.xml
deleted file mode 100644
index dc90bbf..0000000
--- a/packages/Keyguard/res/values/integers.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2012, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-<resources>
- <integer name="kg_carousel_angle">75</integer>
- <integer name="kg_glowpad_rotation_offset">0</integer>
-</resources>
diff --git a/packages/Keyguard/res/values/strings.xml b/packages/Keyguard/res/values/strings.xml
index feab127..8b18b2ed 100644
--- a/packages/Keyguard/res/values/strings.xml
+++ b/packages/Keyguard/res/values/strings.xml
@@ -48,12 +48,6 @@
to unlock the keyguard. Displayed in one line in a large font. -->
<string name="keyguard_password_wrong_pin_code">Incorrect PIN code.</string>
- <!-- Instructions telling the user how to unlock the phone. -->
- <string name="keyguard_label_text">To unlock, press Menu then 0.</string>
-
- <!-- Shown when face unlock failed multiple times so we're just using the backup -->
- <string name="faceunlock_multiple_failures">Maximum Face Unlock attempts exceeded</string>
-
<!-- When the lock screen is showing, the phone is plugged in and the battery is fully
charged, say that it is charged. -->
<string name="keyguard_charged">Charged</string>
@@ -101,35 +95,6 @@
<!-- Time format strings for fall-back clock widget -->
<string name="keyguard_widget_24_hours_format" translatable="false">kk\uee01mm</string>
- <!-- Accessibility description sent when user changes the current lock screen widget. [CHAR_LIMIT=none] -->
- <string name="keyguard_accessibility_widget_changed">%1$s. Widget %2$d of %3$d.</string>
- <!-- Accessibility description of the add widget button. [CHAR_LIMIT=none] -->
- <string name="keyguard_accessibility_add_widget">Add widget.</string>
- <!-- Accessibility description of the empty sidget slot (place holder for a new widget). [CHAR_LIMIT=none] -->
- <string name="keyguard_accessibility_widget_empty_slot">Empty</string>
- <!-- Accessibility description of the event of expanding an unlock area. [CHAR_LIMIT=none] -->
- <string name="keyguard_accessibility_unlock_area_expanded">Unlock area expanded.</string>
- <!-- Accessibility description of the event of collapsing an unlock area. [CHAR_LIMIT=none] -->
- <string name="keyguard_accessibility_unlock_area_collapsed">Unlock area collapsed.</string>
- <!-- Accessibility description of a lock screen widget. [CHAR_LIMIT=none] -->
- <string name="keyguard_accessibility_widget"><xliff:g id="widget_index">%1$s</xliff:g> widget.</string>
- <!-- Accessibility description of the lock screen user selector widget. [CHAR_LIMIT=none] -->
- <string name="keyguard_accessibility_user_selector">User selector</string>
- <!-- Accessibility description of the camera widget. [CHAR_LIMIT=none] -->
- <string name="keyguard_accessibility_camera">Camera</string>
- <!-- Accessibility description of the lock media control widget. [CHAR_LIMIT=none] -->
- <string name="keygaurd_accessibility_media_controls">Media controls</string>
- <!-- Accessibility description of widget reordering start. [CHAR_LIMIT=none] -->
- <string name="keyguard_accessibility_widget_reorder_start">Widget reordering started.</string>
- <!-- Accessibility description of widget reordering end. [CHAR_LIMIT=none] -->
- <string name="keyguard_accessibility_widget_reorder_end">Widget reordering ended.</string>
- <!-- Accessibility description of the a widget deletion event. [CHAR_LIMIT=none] -->
- <string name="keyguard_accessibility_widget_deleted">Widget <xliff:g id="widget_index">%1$s</xliff:g> deleted.</string>
- <!-- Accessibility description of the button to expand the lock area. [CHAR_LIMIT=none] -->
- <string name="keyguard_accessibility_expand_lock_area">Expand unlock area.</string>
- <!-- Accessibility description of the slide unlock. [CHAR_LIMIT=none] -->
- <string name="keyguard_accessibility_slide_unlock">Slide unlock.</string>
- <!-- Accessibility description of the pattern unlock. [CHAR_LIMIT=none] -->
<string name="keyguard_accessibility_pattern_unlock">Pattern unlock.</string>
<!-- Accessibility description of the face unlock. [CHAR_LIMIT=none] -->
<string name="keyguard_accessibility_face_unlock">Face unlock.</string>
@@ -148,88 +113,15 @@
<!-- Accessibility description of the SIM PUK password view. [CHAR_LIMIT=none] -->
<string name="keyguard_accessibility_sim_puk_area">SIM PUK area</string>
- <!-- Shown on transport control of lockscreen. Pressing button goes to previous track. -->
- <string name="keyguard_accessibility_transport_prev_description">Previous track button</string>
- <!-- Shown on transport control of lockscreen. Pressing button goes to next track. -->
- <string name="keyguard_accessibility_transport_next_description">Next track button</string>
- <!-- Shown on transport control of lockscreen. Pressing button pauses playback -->
- <string name="keyguard_accessibility_transport_pause_description">Pause button</string>
- <!-- Shown on transport control of lockscreen. Pressing button pauses playback -->
- <string name="keyguard_accessibility_transport_play_description">Play button</string>
- <!-- Shown on transport control of lockscreen. Pressing button pauses playback -->
- <string name="keyguard_accessibility_transport_stop_description">Stop button</string>
- <!-- Shown on transport control of lockscreen. Pressing button rates the track as "thumbs up." -->
- <string name="keyguard_accessibility_transport_thumbs_up_description">Thumbs up</string>
- <!-- Shown on transport control of lockscreen. Pressing button rates the track as "thumbs down." -->
- <string name="keyguard_accessibility_transport_thumbs_down_description">Thumbs down</string>
- <!-- Shown on transport control of lockscreen. Pressing button toggles the "heart" rating. -->
- <string name="keyguard_accessibility_transport_heart_description">Heart</string>
-
-
- <!-- Accessibility description for when the device prompts the user to dismiss keyguard
- in order to complete an action. This will be followed by a message about the current
- security option (e.g. "Pattern unlock."). [CHAR LIMIT=NONE] -->
- <string name="keyguard_accessibility_show_bouncer">Unlock to continue</string>
-
- <!-- Accessibility description for when the bouncer prompt is dismissed. [CHAR LIMIT=NONE] -->
- <string name="keyguard_accessibility_hide_bouncer">Launch canceled</string>
-
- <!-- Accessibility description announced when user drags widget over the delete drop target [CHAR LIMIT=NONE] -->
- <string name="keyguard_accessibility_delete_widget_start">Drop <xliff:g id="widget_index">%1$s</xliff:g> to delete.</string>
-
- <!-- Accessibility description announced when user drags widget away from delete drop target [CHAR LIMIT=NONE] -->
- <string name="keyguard_accessibility_delete_widget_end"><xliff:g id="widget_index">%1$s</xliff:g> will not be deleted.</string>
-
<!-- Accessibility description for the text view that indicates when the next alarm is set (not shown on screen). [CHAR_LIMIT=none] -->
<string name="keyguard_accessibility_next_alarm">Next alarm set for <xliff:g id="alarm" example="Fri 8:30 AM">%1$s</xliff:g></string>
- <!-- Password keyboard strings. Used by LockScreen and Settings --><skip />
- <!-- Label for "switch to symbols" key. Must be short to fit on key! -->
- <string name="password_keyboard_label_symbol_key">\?123</string>
- <!-- Label for "switch to alphabetic" key. Must be short to fit on key! -->
- <string name="password_keyboard_label_alpha_key">ABC</string>
- <!-- Label for ALT modifier key. Must be short to fit on key! -->
- <string name="password_keyboard_label_alt_key">ALT</string>
-
- <!-- KeyboardView - accessibility support --><skip />
- <!-- Description of the Alt button in a KeyboardView. [CHAR LIMIT=NONE] -->
- <string name="keyboardview_keycode_alt">Alt</string>
- <!-- Description of the Cancel button in a KeyboardView. [CHAR LIMIT=NONE] -->
- <string name="keyboardview_keycode_cancel">Cancel</string>
+ <!-- KeyguardPinView - accessibility support --><skip />
<!-- Description of the Delete button in a KeyboardView. [CHAR LIMIT=NONE] -->
<string name="keyboardview_keycode_delete">Delete</string>
- <!-- Description of the Done button in a KeyboardView. [CHAR LIMIT=NONE] -->
- <string name="keyboardview_keycode_done">Done</string>
- <!-- Description of the Mode change button in a KeyboardView. [CHAR LIMIT=NONE] -->
- <string name="keyboardview_keycode_mode_change">Mode change</string>
- <!-- Description of the Shift button in a KeyboardView. [CHAR LIMIT=NONE] -->
- <string name="keyboardview_keycode_shift">Shift</string>
<!-- Description of the Enter button in a KeyboardView. [CHAR LIMIT=NONE] -->
<string name="keyboardview_keycode_enter">Enter</string>
- <!-- Description of the unlock target in the Slide unlock screen. [CHAR LIMIT=NONE] -->
- <string name="description_target_unlock">Unlock</string>
- <!-- Description of the camera target in the Slide unlock screen. [CHAR LIMIT=NONE] -->
- <string name="description_target_camera">Camera</string>
- <!-- Description of the silent target in the Slide unlock screen. [CHAR LIMIT=NONE] -->
- <string name="description_target_silent">Silent</string>
- <!-- Description of the sound on target in the Slide unlock screen. [CHAR LIMIT=NONE] -->
- <string name="description_target_soundon">Sound on</string>
- <!-- Description of the unlock target in the Slide unlock screen. [CHAR LIMIT=NONE] -->
- <string name="description_target_search">Search</string>
-
- <!-- Description of the up direction in which one can to slide the handle in the Slide unlock screen. [CHAR LIMIT=NONE] -->
- <string name="description_direction_up">Slide up for <xliff:g id="target_description" example="Unlock">%s</xliff:g>.</string>
- <!-- Description of the down direction in which one can to slide the handle in the Slide unlock screen. [CHAR LIMIT=NONE] -->
- <string name="description_direction_down">Slide down for <xliff:g id="target_description" example="Unlock">%s</xliff:g>.</string>
- <!-- Description of the left direction in which one can to slide the handle in the Slide unlock screen. [CHAR LIMIT=NONE] -->
- <string name="description_direction_left">"Slide left for <xliff:g id="target_description" example="Unlock">%s</xliff:g>.</string>
- <!-- Description of the right direction in which one can to slide the handle in the Slide unlock screen. [CHAR LIMIT=NONE] -->
- <string name="description_direction_right">Slide right for <xliff:g id="target_description" example="Unlock">%s</xliff:g>.</string>
-
- <!-- Text spoken when the current user is switched if accessibility is enabled. [CHAR LIMIT=none] -->
- <string name="user_switched">Current user <xliff:g id="name" example="Bob">%1$s</xliff:g>.</string>
-
<!-- Label shown on emergency call button in keyguard -->
<string name="kg_emergency_call_label">Emergency call</string>
<!-- Message shown in pattern unlock after some number of unsuccessful attempts -->
@@ -272,20 +164,6 @@
<string name="kg_invalid_confirm_pin_hint" product="default">PIN codes does not match</string>
<!-- Message shown when the user exceeds the maximum number of pattern attempts -->
<string name="kg_login_too_many_attempts">Too many pattern attempts</string>
- <!-- Instructions show in account unlock screen allowing user to enter their email password -->
- <string name="kg_login_instructions">To unlock, sign in with your Google account.</string>
- <!-- Hint shown in TextView in account unlock screen of keyguard -->
- <string name="kg_login_username_hint">Username (email)</string>
- <!-- Hint shown in TextView in account unlock screen of keyguard -->
- <string name="kg_login_password_hint">Password</string>
- <!-- Label shown on sign in button on account unlock screen of keyguard -->
- <string name="kg_login_submit_button">Sign in</string>
- <!-- Message shown when the user enters an invalid username/password combination in account unlock screen of keyguard -->
- <string name="kg_login_invalid_input">Invalid username or password.</string>
- <!-- Hint text shown when user has too many failed password attempts in account unlock screen of keyguard -->
- <string name="kg_login_account_recovery_hint">Forgot your username or password\?\nVisit <b>google.com/accounts/recovery</b>.</string>
- <!-- Message shown while device checks username/password in account unlock screen of keyguard -->
- <string name="kg_login_checking_password">Checking account\u2026</string>
<!-- Message shown in dialog when max number of attempts are reached for PIN screen of keyguard -->
<string name="kg_too_many_failed_pin_attempts_dialog_message">
You have incorrectly typed your PIN <xliff:g id="number">%d</xliff:g> times.
@@ -386,8 +264,6 @@
you will be asked to unlock your phone using an email account.\n\n
Try again in <xliff:g id="number">%d</xliff:g> seconds.
</string>
- <!-- The delete-widget drop target button text -->
- <string name="kg_reordering_delete_drop_target_text">Remove</string>
<!-- Instructions telling the user that they entered the wrong SIM PIN for the last time.
Displayed in a dialog box. -->
@@ -417,18 +293,6 @@
<!-- Notification telling the user that the PIN1 they entered is valid -->
<string name="kg_pin_accepted">Code Accepted!</string>
- <!-- Transport control strings -->
- <!-- Shown on transport control of lockscreen. Pressing button goes to previous track. -->
- <string name="keyguard_transport_prev_description">Previous track button</string>
- <!-- Shown on transport control of lockscreen. Pressing button goes to next track. -->
- <string name="keyguard_transport_next_description">Next track button</string>
- <!-- Shown on transport control of lockscreen. Pressing button pauses playback -->
- <string name="keyguard_transport_pause_description">Pause button</string>
- <!-- Shown on transport control of lockscreen. Pressing button pauses playback -->
- <string name="keyguard_transport_play_description">Play button</string>
- <!-- Shown on transport control of lockscreen. Pressing button pauses playback -->
- <string name="keyguard_transport_stop_description">Stop button</string>
-
<!-- On the keyguard screen, it shows the carrier the phone is connected to.
This is displayed if the phone is not connected to a carrier.-->
<string name="keyguard_carrier_default">No service.</string>
diff --git a/packages/Keyguard/res/values/styles.xml b/packages/Keyguard/res/values/styles.xml
index 7d161af..404a17e 100644
--- a/packages/Keyguard/res/values/styles.xml
+++ b/packages/Keyguard/res/values/styles.xml
@@ -35,36 +35,13 @@
<item name="android:paddingBottom">0dp</item>
</style>
- <!-- Standard animations for a non-full-screen window or activity. -->
- <style name="Animation.LockScreen" parent="@android:style/Animation">
- <item name="android:windowEnterAnimation">@anim/lock_screen_enter</item>
- <item name="android:windowExitAnimation">@anim/lock_screen_exit</item>
- </style>
-
<!-- Built-in clock widget stuff -->
<style name="widget_label">
<item name="android:textSize">@dimen/widget_label_font_size</item>
</style>
- <style name="big_thin">
- <item name="android:textSize">@dimen/big_font_size</item>
- <item name="android:fontFamily">sans-serif-thin</item>
- </style>
- <style name="widget_big_thin" parent="big_thin">
+ <style name="widget_big_thin">
<item name="android:textSize">@dimen/widget_big_font_size</item>
- </style>
-
- <style name="Widget.TransportControl.SeekBar" parent="@android:style/Widget.DeviceDefault.Light.SeekBar">
- <item name="android:indeterminateOnly">false</item>
- <item name="android:progressDrawable">@drawable/scrubber_progress_horizontal_holo_light</item>
- <item name="android:indeterminateDrawable">@drawable/scrubber_progress_horizontal_holo_light</item>
- <item name="android:minHeight">13dip</item>
- <item name="android:maxHeight">13dip</item>
- <item name="android:thumb">@drawable/scrubber_control_selector_holo</item>
- <item name="android:thumbOffset">16dip</item>
- <item name="android:focusable">true</item>
- <item name="android:paddingStart">16dip</item>
- <item name="android:paddingEnd">16dip</item>
- <item name="android:mirrorForRtl">true</item>
+ <item name="android:fontFamily">sans-serif-thin</item>
</style>
<style name="BouncerSecurityContainer">
diff --git a/packages/Keyguard/src/com/android/keyguard/BiometricSensorUnlock.java b/packages/Keyguard/src/com/android/keyguard/BiometricSensorUnlock.java
deleted file mode 100644
index 230ef81..0000000
--- a/packages/Keyguard/src/com/android/keyguard/BiometricSensorUnlock.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-import android.view.View;
-
-interface BiometricSensorUnlock {
- /**
- * Initializes the view provided for the biometric unlock UI to work within. The provided area
- * completely covers the backup unlock mechanism.
- * @param biometricUnlockView View provided for the biometric unlock UI.
- */
- public void initializeView(View biometricUnlockView);
-
- /**
- * Indicates whether the biometric unlock is running. Before
- * {@link BiometricSensorUnlock#start} is called, isRunning() returns false. After a successful
- * call to {@link BiometricSensorUnlock#start}, isRunning() returns true until the biometric
- * unlock completes, {@link BiometricSensorUnlock#stop} has been called, or an error has
- * forced the biometric unlock to stop.
- * @return whether the biometric unlock is currently running.
- */
- public boolean isRunning();
-
- /**
- * Stops and removes the biometric unlock and shows the backup unlock
- */
- public void stopAndShowBackup();
-
- /**
- * Binds to the biometric unlock service and starts the unlock procedure. Called on the UI
- * thread.
- * @return false if it can't be started or the backup should be used.
- */
- public boolean start();
-
- /**
- * Stops the biometric unlock procedure and unbinds from the service. Called on the UI thread.
- * @return whether the biometric unlock was running when called.
- */
- public boolean stop();
-
- /**
- * Cleans up any resources used by the biometric unlock.
- */
- public void cleanUp();
-
- /**
- * Gets the Device Policy Manager quality of the biometric unlock sensor
- * (e.g., PASSWORD_QUALITY_BIOMETRIC_WEAK).
- * @return biometric unlock sensor quality, as defined by Device Policy Manager.
- */
- public int getQuality();
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/CameraWidgetFrame.java b/packages/Keyguard/src/com/android/keyguard/CameraWidgetFrame.java
deleted file mode 100644
index 2bf74ea..0000000
--- a/packages/Keyguard/src/com/android/keyguard/CameraWidgetFrame.java
+++ /dev/null
@@ -1,523 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-import android.content.Context;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.graphics.Color;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.os.Handler;
-import android.os.SystemClock;
-import android.util.Log;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
-
-import com.android.keyguard.KeyguardActivityLauncher.CameraWidgetInfo;
-
-public class CameraWidgetFrame extends KeyguardWidgetFrame implements View.OnClickListener {
- private static final String TAG = CameraWidgetFrame.class.getSimpleName();
- private static final boolean DEBUG = KeyguardConstants.DEBUG;
- private static final int WIDGET_ANIMATION_DURATION = 250; // ms
- private static final int WIDGET_WAIT_DURATION = 400; // ms
- private static final int RECOVERY_DELAY = 1000; // ms
-
- interface Callbacks {
- void onLaunchingCamera();
- void onCameraLaunchedSuccessfully();
- void onCameraLaunchedUnsuccessfully();
- }
-
- private final Handler mHandler = new Handler();
- private final KeyguardActivityLauncher mActivityLauncher;
- private final Callbacks mCallbacks;
- private final CameraWidgetInfo mWidgetInfo;
- private final WindowManager mWindowManager;
- private final Point mRenderedSize = new Point();
- private final int[] mTmpLoc = new int[2];
-
- private long mLaunchCameraStart;
- private boolean mActive;
- private boolean mTransitioning;
- private boolean mDown;
-
- private final Rect mInsets = new Rect();
-
- private FixedSizeFrameLayout mPreview;
- private View mFullscreenPreview;
- private View mFakeNavBar;
- private boolean mUseFastTransition;
-
- private final Runnable mTransitionToCameraRunnable = new Runnable() {
- @Override
- public void run() {
- transitionToCamera();
- }};
-
- private final Runnable mTransitionToCameraEndAction = new Runnable() {
- @Override
- public void run() {
- if (!mTransitioning)
- return;
- Handler worker = getWorkerHandler() != null ? getWorkerHandler() : mHandler;
- mLaunchCameraStart = SystemClock.uptimeMillis();
- if (DEBUG) Log.d(TAG, "Launching camera at " + mLaunchCameraStart);
- mActivityLauncher.launchCamera(worker, mSecureCameraActivityStartedRunnable);
- }};
-
- private final Runnable mPostTransitionToCameraEndAction = new Runnable() {
- @Override
- public void run() {
- mHandler.post(mTransitionToCameraEndAction);
- }};
-
- private final Runnable mRecoverRunnable = new Runnable() {
- @Override
- public void run() {
- recover();
- }};
-
- private final Runnable mRenderRunnable = new Runnable() {
- @Override
- public void run() {
- render();
- }};
-
- private final Runnable mSecureCameraActivityStartedRunnable = new Runnable() {
- @Override
- public void run() {
- onSecureCameraActivityStarted();
- }
- };
-
- private final KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() {
- private boolean mShowing;
-
- @Override
- public void onKeyguardVisibilityChanged(boolean showing) {
- if (mShowing == showing)
- return;
- mShowing = showing;
- CameraWidgetFrame.this.onKeyguardVisibilityChanged(mShowing);
- }
- };
-
- private static final class FixedSizeFrameLayout extends FrameLayout {
- int width;
- int height;
-
- FixedSizeFrameLayout(Context context) {
- super(context);
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- measureChildren(
- MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
- setMeasuredDimension(width, height);
- }
- }
-
- private CameraWidgetFrame(Context context, Callbacks callbacks,
- KeyguardActivityLauncher activityLauncher,
- CameraWidgetInfo widgetInfo, View previewWidget) {
- super(context);
- mCallbacks = callbacks;
- mActivityLauncher = activityLauncher;
- mWidgetInfo = widgetInfo;
- mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
- KeyguardUpdateMonitor.getInstance(context).registerCallback(mCallback);
-
- mPreview = new FixedSizeFrameLayout(context);
- mPreview.addView(previewWidget);
- addView(mPreview);
-
- View clickBlocker = new View(context);
- clickBlocker.setBackgroundColor(Color.TRANSPARENT);
- clickBlocker.setOnClickListener(this);
- addView(clickBlocker);
-
- setContentDescription(context.getString(R.string.keyguard_accessibility_camera));
- if (DEBUG) Log.d(TAG, "new CameraWidgetFrame instance " + instanceId());
- }
-
- public static CameraWidgetFrame create(Context context, Callbacks callbacks,
- KeyguardActivityLauncher launcher) {
- if (context == null || callbacks == null || launcher == null)
- return null;
-
- CameraWidgetInfo widgetInfo = launcher.getCameraWidgetInfo();
- if (widgetInfo == null)
- return null;
- View previewWidget = getPreviewWidget(context, widgetInfo);
- if (previewWidget == null)
- return null;
-
- return new CameraWidgetFrame(context, callbacks, launcher, widgetInfo, previewWidget);
- }
-
- private static View getPreviewWidget(Context context, CameraWidgetInfo widgetInfo) {
- return widgetInfo.layoutId > 0 ?
- inflateWidgetView(context, widgetInfo) :
- inflateGenericWidgetView(context);
- }
-
- private static View inflateWidgetView(Context context, CameraWidgetInfo widgetInfo) {
- if (DEBUG) Log.d(TAG, "inflateWidgetView: " + widgetInfo.contextPackage);
- View widgetView = null;
- Exception exception = null;
- try {
- Context cameraContext = context.createPackageContext(
- widgetInfo.contextPackage, Context.CONTEXT_RESTRICTED);
- LayoutInflater cameraInflater = (LayoutInflater)
- cameraContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- cameraInflater = cameraInflater.cloneInContext(cameraContext);
- widgetView = cameraInflater.inflate(widgetInfo.layoutId, null, false);
- } catch (NameNotFoundException e) {
- exception = e;
- } catch (RuntimeException e) {
- exception = e;
- }
- if (exception != null) {
- Log.w(TAG, "Error creating camera widget view", exception);
- }
- return widgetView;
- }
-
- private static View inflateGenericWidgetView(Context context) {
- if (DEBUG) Log.d(TAG, "inflateGenericWidgetView");
- ImageView iv = new ImageView(context);
- iv.setImageResource(R.drawable.ic_lockscreen_camera);
- iv.setScaleType(ScaleType.CENTER);
- iv.setBackgroundColor(Color.argb(127, 0, 0, 0));
- return iv;
- }
-
- private void render() {
- final View root = getRootView();
- final int width = root.getWidth() - mInsets.right; // leave room
- final int height = root.getHeight() - mInsets.bottom; // for bars
- if (mRenderedSize.x == width && mRenderedSize.y == height) {
- if (DEBUG) Log.d(TAG, String.format("Already rendered at size=%sx%s %d%%",
- width, height, (int)(100*mPreview.getScaleX())));
- return;
- }
- if (width == 0 || height == 0) {
- return;
- }
-
- mPreview.width = width;
- mPreview.height = height;
- mPreview.requestLayout();
-
- final int thisWidth = getWidth() - getPaddingLeft() - getPaddingRight();
- final int thisHeight = getHeight() - getPaddingTop() - getPaddingBottom();
-
- final float pvScaleX = (float) thisWidth / width;
- final float pvScaleY = (float) thisHeight / height;
- final float pvScale = Math.min(pvScaleX, pvScaleY);
-
- final int pvWidth = (int) (pvScale * width);
- final int pvHeight = (int) (pvScale * height);
-
- final float pvTransX = pvWidth < thisWidth ? (thisWidth - pvWidth) / 2 : 0;
- final float pvTransY = pvHeight < thisHeight ? (thisHeight - pvHeight) / 2 : 0;
-
- final boolean isRtl = mPreview.getLayoutDirection() == LAYOUT_DIRECTION_RTL;
- mPreview.setPivotX(isRtl ? mPreview.width : 0);
- mPreview.setPivotY(0);
- mPreview.setScaleX(pvScale);
- mPreview.setScaleY(pvScale);
- mPreview.setTranslationX((isRtl ? -1 : 1) * pvTransX);
- mPreview.setTranslationY(pvTransY);
-
- mRenderedSize.set(width, height);
- if (DEBUG) Log.d(TAG, String.format("Rendered camera widget size=%sx%s %d%% instance=%s",
- width, height, (int)(100*mPreview.getScaleX()), instanceId()));
- }
-
- private void transitionToCamera() {
- if (mTransitioning || mDown) return;
-
- mTransitioning = true;
-
- enableWindowExitAnimation(false);
-
- final int navHeight = mInsets.bottom;
- final int navWidth = mInsets.right;
-
- mPreview.getLocationInWindow(mTmpLoc);
- final float pvHeight = mPreview.getHeight() * mPreview.getScaleY();
- final float pvCenter = mTmpLoc[1] + pvHeight / 2f;
-
- final ViewGroup root = (ViewGroup) getRootView();
-
- if (DEBUG) {
- Log.d(TAG, "root = " + root.getLeft() + "," + root.getTop() + " "
- + root.getWidth() + "x" + root.getHeight());
- }
-
- if (mFullscreenPreview == null) {
- mFullscreenPreview = getPreviewWidget(mContext, mWidgetInfo);
- mFullscreenPreview.setClickable(false);
- root.addView(mFullscreenPreview, new FrameLayout.LayoutParams(
- root.getWidth() - navWidth,
- root.getHeight() - navHeight));
- }
-
- final float fsHeight = root.getHeight() - navHeight;
- final float fsCenter = root.getTop() + fsHeight / 2;
-
- final float fsScaleY = mPreview.getScaleY();
- final float fsTransY = pvCenter - fsCenter;
- final float fsScaleX = fsScaleY;
-
- mPreview.setVisibility(View.GONE);
- mFullscreenPreview.setVisibility(View.VISIBLE);
- mFullscreenPreview.setTranslationY(fsTransY);
- mFullscreenPreview.setScaleX(fsScaleX);
- mFullscreenPreview.setScaleY(fsScaleY);
- mFullscreenPreview
- .animate()
- .scaleX(1)
- .scaleY(1)
- .translationX(0)
- .translationY(0)
- .setDuration(WIDGET_ANIMATION_DURATION)
- .withEndAction(mPostTransitionToCameraEndAction)
- .start();
-
- if (navHeight > 0 || navWidth > 0) {
- final boolean atBottom = navHeight > 0;
- if (mFakeNavBar == null) {
- mFakeNavBar = new View(mContext);
- mFakeNavBar.setBackgroundColor(Color.BLACK);
- root.addView(mFakeNavBar, new FrameLayout.LayoutParams(
- atBottom ? FrameLayout.LayoutParams.MATCH_PARENT
- : navWidth,
- atBottom ? navHeight
- : FrameLayout.LayoutParams.MATCH_PARENT,
- atBottom ? Gravity.BOTTOM|Gravity.FILL_HORIZONTAL
- : Gravity.RIGHT|Gravity.FILL_VERTICAL));
- mFakeNavBar.setPivotY(navHeight);
- mFakeNavBar.setPivotX(navWidth);
- }
- mFakeNavBar.setAlpha(0f);
- if (atBottom) {
- mFakeNavBar.setScaleY(0.5f);
- } else {
- mFakeNavBar.setScaleX(0.5f);
- }
- mFakeNavBar.setVisibility(View.VISIBLE);
- mFakeNavBar.animate()
- .alpha(1f)
- .scaleY(1f)
- .scaleY(1f)
- .setDuration(WIDGET_ANIMATION_DURATION)
- .start();
- }
- mCallbacks.onLaunchingCamera();
- }
-
- private void recover() {
- if (DEBUG) Log.d(TAG, "recovering at " + SystemClock.uptimeMillis());
- mCallbacks.onCameraLaunchedUnsuccessfully();
- reset();
- }
-
- @Override
- public void setOnLongClickListener(OnLongClickListener l) {
- // ignore
- }
-
- @Override
- public void onClick(View v) {
- if (DEBUG) Log.d(TAG, "clicked");
- if (mTransitioning) return;
- if (mActive) {
- cancelTransitionToCamera();
- transitionToCamera();
- }
- }
-
- @Override
- protected void onDetachedFromWindow() {
- if (DEBUG) Log.d(TAG, "onDetachedFromWindow: instance " + instanceId()
- + " at " + SystemClock.uptimeMillis());
- super.onDetachedFromWindow();
- KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mCallback);
- cancelTransitionToCamera();
- mHandler.removeCallbacks(mRecoverRunnable);
- }
-
- @Override
- public void onActive(boolean isActive) {
- mActive = isActive;
- if (mActive) {
- rescheduleTransitionToCamera();
- } else {
- reset();
- }
- }
-
- @Override
- public boolean onUserInteraction(MotionEvent event) {
- if (mTransitioning) {
- if (DEBUG) Log.d(TAG, "onUserInteraction eaten: mTransitioning");
- return true;
- }
-
- getLocationOnScreen(mTmpLoc);
- int rawBottom = mTmpLoc[1] + getHeight();
- if (event.getRawY() > rawBottom) {
- if (DEBUG) Log.d(TAG, "onUserInteraction eaten: below widget");
- return true;
- }
-
- int action = event.getAction();
- mDown = action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE;
- if (mActive) {
- rescheduleTransitionToCamera();
- }
- if (DEBUG) Log.d(TAG, "onUserInteraction observed, not eaten");
- return false;
- }
-
- @Override
- protected void onFocusLost() {
- if (DEBUG) Log.d(TAG, "onFocusLost at " + SystemClock.uptimeMillis());
- cancelTransitionToCamera();
- super.onFocusLost();
- }
-
- public void onScreenTurnedOff() {
- if (DEBUG) Log.d(TAG, "onScreenTurnedOff");
- reset();
- }
-
- private void rescheduleTransitionToCamera() {
- if (DEBUG) Log.d(TAG, "rescheduleTransitionToCamera at " + SystemClock.uptimeMillis());
- mHandler.removeCallbacks(mTransitionToCameraRunnable);
- final long duration = mUseFastTransition ? 0 : WIDGET_WAIT_DURATION;
- mHandler.postDelayed(mTransitionToCameraRunnable, duration);
- }
-
- private void cancelTransitionToCamera() {
- if (DEBUG) Log.d(TAG, "cancelTransitionToCamera at " + SystemClock.uptimeMillis());
- mHandler.removeCallbacks(mTransitionToCameraRunnable);
- }
-
- private void onCameraLaunched() {
- mCallbacks.onCameraLaunchedSuccessfully();
- reset();
- }
-
- private void reset() {
- if (DEBUG) Log.d(TAG, "reset at " + SystemClock.uptimeMillis());
- mLaunchCameraStart = 0;
- mTransitioning = false;
- mDown = false;
- cancelTransitionToCamera();
- mHandler.removeCallbacks(mRecoverRunnable);
- mPreview.setVisibility(View.VISIBLE);
- if (mFullscreenPreview != null) {
- mFullscreenPreview.animate().cancel();
- mFullscreenPreview.setVisibility(View.GONE);
- }
- if (mFakeNavBar != null) {
- mFakeNavBar.animate().cancel();
- mFakeNavBar.setVisibility(View.GONE);
- }
- enableWindowExitAnimation(true);
- }
-
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- if (DEBUG) Log.d(TAG, String.format("onSizeChanged new=%sx%s old=%sx%s at %s",
- w, h, oldw, oldh, SystemClock.uptimeMillis()));
- if ((w != oldw && oldw > 0) || (h != oldh && oldh > 0)) {
- // we can't trust the old geometry anymore; force a re-render
- mRenderedSize.x = mRenderedSize.y = -1;
- }
- mHandler.post(mRenderRunnable);
- super.onSizeChanged(w, h, oldw, oldh);
- }
-
- @Override
- public void onBouncerShowing(boolean showing) {
- if (showing) {
- mTransitioning = false;
- mHandler.post(mRecoverRunnable);
- }
- }
-
- private void enableWindowExitAnimation(boolean isEnabled) {
- View root = getRootView();
- ViewGroup.LayoutParams lp = root.getLayoutParams();
- if (!(lp instanceof WindowManager.LayoutParams))
- return;
- WindowManager.LayoutParams wlp = (WindowManager.LayoutParams) lp;
- int newWindowAnimations = isEnabled ? R.style.Animation_LockScreen : 0;
- if (newWindowAnimations != wlp.windowAnimations) {
- if (DEBUG) Log.d(TAG, "setting windowAnimations to: " + newWindowAnimations
- + " at " + SystemClock.uptimeMillis());
- wlp.windowAnimations = newWindowAnimations;
- mWindowManager.updateViewLayout(root, wlp);
- }
- }
-
- private void onKeyguardVisibilityChanged(boolean showing) {
- if (DEBUG) Log.d(TAG, "onKeyguardVisibilityChanged " + showing
- + " at " + SystemClock.uptimeMillis());
- if (mTransitioning && !showing) {
- mTransitioning = false;
- mHandler.removeCallbacks(mRecoverRunnable);
- if (mLaunchCameraStart > 0) {
- long launchTime = SystemClock.uptimeMillis() - mLaunchCameraStart;
- if (DEBUG) Log.d(TAG, String.format("Camera took %sms to launch", launchTime));
- mLaunchCameraStart = 0;
- onCameraLaunched();
- }
- }
- }
-
- private void onSecureCameraActivityStarted() {
- if (DEBUG) Log.d(TAG, "onSecureCameraActivityStarted at " + SystemClock.uptimeMillis());
- mHandler.postDelayed(mRecoverRunnable, RECOVERY_DELAY);
- }
-
- private String instanceId() {
- return Integer.toHexString(hashCode());
- }
-
- public void setInsets(Rect insets) {
- if (DEBUG) Log.d(TAG, "setInsets: " + insets);
- mInsets.set(insets);
- }
-
- public void setUseFastTransition(boolean useFastTransition) {
- mUseFastTransition = useFastTransition;
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/ChallengeLayout.java b/packages/Keyguard/src/com/android/keyguard/ChallengeLayout.java
deleted file mode 100644
index 2ee21acd..0000000
--- a/packages/Keyguard/src/com/android/keyguard/ChallengeLayout.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-/**
- * Interface implemented by ViewGroup-derived layouts that implement
- * special logic for presenting security challenges to the user.
- */
-public interface ChallengeLayout {
- /**
- * @return true if the security challenge area of this layout is currently visible
- */
- boolean isChallengeShowing();
-
- /**
- * @return true if the challenge area significantly overlaps other content
- */
- boolean isChallengeOverlapping();
-
- /**
- * Show or hide the challenge layout.
- *
- * If you want to show the challenge layout in bouncer mode where applicable,
- * use {@link #showBouncer()} instead.
- *
- * @param b true to show, false to hide
- */
- void showChallenge(boolean show);
-
- /**
- * Show the bouncer challenge. This may block access to other child views.
- */
- void showBouncer();
-
- /**
- * Hide the bouncer challenge if it is currently showing.
- * This may restore previously blocked access to other child views.
- */
- void hideBouncer();
-
- /**
- * Returns true if the challenge is currently in bouncer mode,
- * potentially blocking access to other child views.
- */
- boolean isBouncing();
-
- /**
- * Returns the duration of the bounce animation.
- */
- int getBouncerAnimationDuration();
-
- /**
- * Set a listener that will respond to changes in bouncer state.
- *
- * @param listener listener to register
- */
- void setOnBouncerStateChangedListener(OnBouncerStateChangedListener listener);
-
- /**
- * Listener interface that reports changes in bouncer state.
- * The bouncer is
- */
- public interface OnBouncerStateChangedListener {
- /**
- * Called when the bouncer state changes.
- * The bouncer is activated when the user must pass a security challenge
- * to proceed with the requested action.
- *
- * <p>This differs from simply showing or hiding the security challenge
- * as the bouncer will prevent interaction with other elements of the UI.
- * If the user attempts to escape from the bouncer, it will be dismissed,
- * this method will be called with false as the parameter, and the action
- * should be canceled. If the security component reports a successful
- * authentication and the containing code calls hideBouncer() as a result,
- * this method will also be called with a false parameter. It is up to the
- * caller of hideBouncer to be ready for this.</p>
- *
- * @param bouncerActive true if the bouncer is now active,
- * false if the bouncer was dismissed.
- */
- public void onBouncerStateChanged(boolean bouncerActive);
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/CheckLongPressHelper.java b/packages/Keyguard/src/com/android/keyguard/CheckLongPressHelper.java
deleted file mode 100644
index 52e7cd5..0000000
--- a/packages/Keyguard/src/com/android/keyguard/CheckLongPressHelper.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-
-public class CheckLongPressHelper {
- private View mView;
- private boolean mHasPerformedLongPress;
- private CheckForLongPress mPendingCheckForLongPress;
- private float mDownX, mDownY;
- private int mLongPressTimeout;
- private int mScaledTouchSlop;
-
- class CheckForLongPress implements Runnable {
- public void run() {
- if ((mView.getParent() != null) && mView.hasWindowFocus()
- && !mHasPerformedLongPress) {
- if (mView.performLongClick()) {
- mView.setPressed(false);
- mHasPerformedLongPress = true;
- }
- }
- }
- }
-
- public CheckLongPressHelper(View v) {
- mScaledTouchSlop = ViewConfiguration.get(v.getContext()).getScaledTouchSlop();
- mLongPressTimeout = ViewConfiguration.getLongPressTimeout();
- mView = v;
- }
-
- public void postCheckForLongPress(MotionEvent ev) {
- mDownX = ev.getX();
- mDownY = ev.getY();
- mHasPerformedLongPress = false;
-
- if (mPendingCheckForLongPress == null) {
- mPendingCheckForLongPress = new CheckForLongPress();
- }
- mView.postDelayed(mPendingCheckForLongPress, mLongPressTimeout);
- }
-
- public void onMove(MotionEvent ev) {
- float x = ev.getX();
- float y = ev.getY();
- boolean xMoved = Math.abs(mDownX - x) > mScaledTouchSlop;
- boolean yMoved = Math.abs(mDownY - y) > mScaledTouchSlop;
-
- if (xMoved || yMoved) {
- cancelLongPress();
- }
- }
-
- public void cancelLongPress() {
- mHasPerformedLongPress = false;
- if (mPendingCheckForLongPress != null) {
- mView.removeCallbacks(mPendingCheckForLongPress);
- mPendingCheckForLongPress = null;
- }
- }
-
- public boolean hasPerformedLongPress() {
- return mHasPerformedLongPress;
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/FaceUnlock.java b/packages/Keyguard/src/com/android/keyguard/FaceUnlock.java
deleted file mode 100644
index 8d13ac2..0000000
--- a/packages/Keyguard/src/com/android/keyguard/FaceUnlock.java
+++ /dev/null
@@ -1,460 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-import com.android.internal.policy.IFaceLockCallback;
-import com.android.internal.policy.IFaceLockInterface;
-import com.android.internal.widget.LockPatternUtils;
-
-import android.app.admin.DevicePolicyManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
-import android.os.PowerManager;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.util.Log;
-import android.view.View;
-
-public class FaceUnlock implements BiometricSensorUnlock, Handler.Callback {
-
- private static final boolean DEBUG = KeyguardConstants.DEBUG;
- private static final String TAG = "FULLockscreen";
- private static final String FACE_LOCK_PACKAGE = "com.android.facelock";
-
- private final Context mContext;
- private final LockPatternUtils mLockPatternUtils;
-
- // TODO: is mServiceRunning needed or can we just use mIsRunning or check if mService is null?
- private boolean mServiceRunning = false;
- // TODO: now that the code has been restructure to do almost all operations from a handler, this
- // lock may no longer be necessary.
- private final Object mServiceRunningLock = new Object();
- private IFaceLockInterface mService;
- private boolean mBoundToService = false;
- private View mFaceUnlockView;
-
- private Handler mHandler;
- private final int MSG_SERVICE_CONNECTED = 0;
- private final int MSG_SERVICE_DISCONNECTED = 1;
- private final int MSG_UNLOCK = 2;
- private final int MSG_CANCEL = 3;
- private final int MSG_REPORT_FAILED_ATTEMPT = 4;
- private final int MSG_POKE_WAKELOCK = 5;
-
- // TODO: This was added for the purpose of adhering to what the biometric interface expects
- // the isRunning() function to return. However, it is probably not necessary to have both
- // mRunning and mServiceRunning. I'd just rather wait to change that logic.
- private volatile boolean mIsRunning = false;
-
- KeyguardSecurityCallback mKeyguardScreenCallback;
-
- /**
- * Stores some of the structures that Face Unlock will need to access and creates the handler
- * will be used to execute messages on the UI thread.
- */
- public FaceUnlock(Context context) {
- mContext = context;
- mLockPatternUtils = new LockPatternUtils(context);
- mHandler = new Handler(this);
- }
-
- public void setKeyguardCallback(KeyguardSecurityCallback keyguardScreenCallback) {
- mKeyguardScreenCallback = keyguardScreenCallback;
- }
-
- /**
- * Stores and displays the view that Face Unlock is allowed to draw within.
- * TODO: since the layout object will eventually be shared by multiple biometric unlock
- * methods, we will have to add our other views (background, cancel button) here.
- */
- public void initializeView(View biometricUnlockView) {
- Log.d(TAG, "initializeView()");
- mFaceUnlockView = biometricUnlockView;
- }
-
- /**
- * Indicates whether Face Unlock is currently running.
- */
- public boolean isRunning() {
- return mIsRunning;
- }
-
- /**
- * Dismisses face unlock and goes to the backup lock
- */
- public void stopAndShowBackup() {
- if (DEBUG) Log.d(TAG, "stopAndShowBackup()");
- mHandler.sendEmptyMessage(MSG_CANCEL);
- }
-
- /**
- * Binds to the Face Unlock service. Face Unlock will be started when the bind completes. The
- * Face Unlock view is displayed to hide the backup lock while the service is starting up.
- * Called on the UI thread.
- */
- public boolean start() {
- if (DEBUG) Log.d(TAG, "start()");
- if (mHandler.getLooper() != Looper.myLooper()) {
- Log.e(TAG, "start() called off of the UI thread");
- }
-
- if (mIsRunning) {
- Log.w(TAG, "start() called when already running");
- }
-
- if (!mBoundToService) {
- Log.d(TAG, "Binding to Face Unlock service for user="
- + mLockPatternUtils.getCurrentUser());
- mContext.bindServiceAsUser(
- new Intent(IFaceLockInterface.class.getName()).setPackage(FACE_LOCK_PACKAGE),
- mConnection,
- Context.BIND_AUTO_CREATE,
- new UserHandle(mLockPatternUtils.getCurrentUser()));
- mBoundToService = true;
- } else {
- Log.w(TAG, "Attempt to bind to Face Unlock when already bound");
- }
-
- mIsRunning = true;
- return true;
- }
-
- /**
- * Stops Face Unlock and unbinds from the service. Called on the UI thread.
- */
- public boolean stop() {
- if (DEBUG) Log.d(TAG, "stop()");
- if (mHandler.getLooper() != Looper.myLooper()) {
- Log.e(TAG, "stop() called from non-UI thread");
- }
-
- // Clearing any old service connected messages.
- mHandler.removeMessages(MSG_SERVICE_CONNECTED);
-
- boolean mWasRunning = mIsRunning;
-
- stopUi();
-
- if (mBoundToService) {
- if (mService != null) {
- try {
- mService.unregisterCallback(mFaceUnlockCallback);
- } catch (RemoteException e) {
- // Not much we can do
- }
- }
- Log.d(TAG, "Unbinding from Face Unlock service");
- mContext.unbindService(mConnection);
- mBoundToService = false;
- } else {
- // This is usually not an error when this happens. Sometimes we will tell it to
- // unbind multiple times because it's called from both onWindowFocusChanged and
- // onDetachedFromWindow.
- if (DEBUG) Log.d(TAG, "Attempt to unbind from Face Unlock when not bound");
- }
- mIsRunning = false;
- return mWasRunning;
- }
-
- /**
- * Frees up resources used by Face Unlock and stops it if it is still running.
- */
- public void cleanUp() {
- if (DEBUG) Log.d(TAG, "cleanUp()");
- if (mService != null) {
- try {
- mService.unregisterCallback(mFaceUnlockCallback);
- } catch (RemoteException e) {
- // Not much we can do
- }
- stopUi();
- mService = null;
- }
- }
-
- /**
- * Returns the Device Policy Manager quality for Face Unlock, which is BIOMETRIC_WEAK.
- */
- public int getQuality() {
- return DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK;
- }
-
- /**
- * Handles messages such that everything happens on the UI thread in a deterministic order.
- * Calls from the Face Unlock service come from binder threads. Calls from lockscreen typically
- * come from the UI thread. This makes sure there are no race conditions between those calls.
- */
- public boolean handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_SERVICE_CONNECTED:
- handleServiceConnected();
- break;
- case MSG_SERVICE_DISCONNECTED:
- handleServiceDisconnected();
- break;
- case MSG_UNLOCK:
- handleUnlock(msg.arg1);
- break;
- case MSG_CANCEL:
- handleCancel();
- break;
- case MSG_REPORT_FAILED_ATTEMPT:
- handleReportFailedAttempt();
- break;
- case MSG_POKE_WAKELOCK:
- handlePokeWakelock(msg.arg1);
- break;
- default:
- Log.e(TAG, "Unhandled message");
- return false;
- }
- return true;
- }
-
- /**
- * Tells the service to start its UI via an AIDL interface. Called when the
- * onServiceConnected() callback is received.
- */
- void handleServiceConnected() {
- Log.d(TAG, "handleServiceConnected()");
-
- // It is possible that an unbind has occurred in the time between the bind and when this
- // function is reached. If an unbind has already occurred, proceeding on to call startUi()
- // can result in a fatal error. Note that the onServiceConnected() callback is
- // asynchronous, so this possibility would still exist if we executed this directly in
- // onServiceConnected() rather than using a handler.
- if (!mBoundToService) {
- Log.d(TAG, "Dropping startUi() in handleServiceConnected() because no longer bound");
- return;
- }
-
- try {
- mService.registerCallback(mFaceUnlockCallback);
- } catch (RemoteException e) {
- Log.e(TAG, "Caught exception connecting to Face Unlock: " + e.toString());
- mService = null;
- mBoundToService = false;
- mIsRunning = false;
- return;
- }
-
- if (mFaceUnlockView != null) {
- IBinder windowToken = mFaceUnlockView.getWindowToken();
- if (windowToken != null) {
- // When switching between portrait and landscape view while Face Unlock is running,
- // the screen will eventually go dark unless we poke the wakelock when Face Unlock
- // is restarted.
- mKeyguardScreenCallback.userActivity();
-
- int[] position;
- position = new int[2];
- mFaceUnlockView.getLocationInWindow(position);
- startUi(windowToken, position[0], position[1], mFaceUnlockView.getWidth(),
- mFaceUnlockView.getHeight());
- } else {
- Log.e(TAG, "windowToken is null in handleServiceConnected()");
- }
- }
- }
-
- /**
- * Called when the onServiceDisconnected() callback is received. This should not happen during
- * normal operation. It indicates an error has occurred.
- */
- void handleServiceDisconnected() {
- Log.e(TAG, "handleServiceDisconnected()");
- // TODO: this lock may no longer be needed now that everything is being called from a
- // handler
- synchronized (mServiceRunningLock) {
- mService = null;
- mServiceRunning = false;
- }
- mBoundToService = false;
- mIsRunning = false;
- }
-
- /**
- * Stops the Face Unlock service and tells the device to grant access to the user.
- */
- void handleUnlock(int authenticatedUserId) {
- if (DEBUG) Log.d(TAG, "handleUnlock()");
- stop();
- int currentUserId = mLockPatternUtils.getCurrentUser();
- if (authenticatedUserId == currentUserId) {
- if (DEBUG) Log.d(TAG, "Unlocking for user " + authenticatedUserId);
- mKeyguardScreenCallback.reportUnlockAttempt(true);
- mKeyguardScreenCallback.dismiss(true);
- } else {
- Log.d(TAG, "Ignoring unlock for authenticated user (" + authenticatedUserId +
- ") because the current user is " + currentUserId);
- }
- }
-
- /**
- * Stops the Face Unlock service and goes to the backup lock.
- */
- void handleCancel() {
- if (DEBUG) Log.d(TAG, "handleCancel()");
- // We are going to the backup method, so we don't want to see Face Unlock again until the
- // next time the user visits keyguard.
- KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(false);
-
- mKeyguardScreenCallback.showBackupSecurity();
- stop();
- mKeyguardScreenCallback.userActivity();
- }
-
- /**
- * Increments the number of failed Face Unlock attempts.
- */
- void handleReportFailedAttempt() {
- if (DEBUG) Log.d(TAG, "handleReportFailedAttempt()");
- // We are going to the backup method, so we don't want to see Face Unlock again until the
- // next time the user visits keyguard.
- KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(false);
-
- mKeyguardScreenCallback.reportUnlockAttempt(false);
- }
-
- /**
- * If the screen is on, pokes the wakelock to keep the screen alive and active for a specific
- * amount of time.
- */
- void handlePokeWakelock(int millis) {
- PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
- if (powerManager.isScreenOn()) {
- mKeyguardScreenCallback.userActivity();
- }
- }
-
- /**
- * Implements service connection methods.
- */
- private ServiceConnection mConnection = new ServiceConnection() {
- /**
- * Called when the Face Unlock service connects after calling bind().
- */
- public void onServiceConnected(ComponentName className, IBinder iservice) {
- Log.d(TAG, "Connected to Face Unlock service");
- mService = IFaceLockInterface.Stub.asInterface(iservice);
- mHandler.sendEmptyMessage(MSG_SERVICE_CONNECTED);
- }
-
- /**
- * Called if the Face Unlock service unexpectedly disconnects. This indicates an error.
- */
- public void onServiceDisconnected(ComponentName className) {
- Log.e(TAG, "Unexpected disconnect from Face Unlock service");
- mHandler.sendEmptyMessage(MSG_SERVICE_DISCONNECTED);
- }
- };
-
- /**
- * Tells the Face Unlock service to start displaying its UI and start processing.
- */
- private void startUi(IBinder windowToken, int x, int y, int w, int h) {
- if (DEBUG) Log.d(TAG, "startUi()");
- synchronized (mServiceRunningLock) {
- if (!mServiceRunning) {
- Log.d(TAG, "Starting Face Unlock");
- try {
- mService.startUi(windowToken, x, y, w, h,
- mLockPatternUtils.isBiometricWeakLivelinessEnabled());
- } catch (RemoteException e) {
- Log.e(TAG, "Caught exception starting Face Unlock: " + e.toString());
- return;
- }
- mServiceRunning = true;
- } else {
- Log.w(TAG, "startUi() attempted while running");
- }
- }
- }
-
- /**
- * Tells the Face Unlock service to stop displaying its UI and stop processing.
- */
- private void stopUi() {
- if (DEBUG) Log.d(TAG, "stopUi()");
- // Note that attempting to stop Face Unlock when it's not running is not an issue.
- // Face Unlock can return, which stops it and then we try to stop it when the
- // screen is turned off. That's why we check.
- synchronized (mServiceRunningLock) {
- if (mServiceRunning) {
- Log.d(TAG, "Stopping Face Unlock");
- try {
- mService.stopUi();
- } catch (RemoteException e) {
- Log.e(TAG, "Caught exception stopping Face Unlock: " + e.toString());
- }
- mServiceRunning = false;
- } else {
- // This is usually not an error when this happens. Sometimes we will tell it to
- // stop multiple times because it's called from both onWindowFocusChanged and
- // onDetachedFromWindow.
- if (DEBUG) Log.d(TAG, "stopUi() attempted while not running");
- }
- }
- }
-
- /**
- * Implements the AIDL biometric unlock service callback interface.
- */
- private final IFaceLockCallback mFaceUnlockCallback = new IFaceLockCallback.Stub() {
- /**
- * Called when Face Unlock wants to grant access to the user.
- */
- public void unlock() {
- if (DEBUG) Log.d(TAG, "unlock()");
- Message message = mHandler.obtainMessage(MSG_UNLOCK, UserHandle.getCallingUserId(), -1);
- mHandler.sendMessage(message);
- }
-
- /**
- * Called when Face Unlock wants to go to the backup.
- */
- public void cancel() {
- if (DEBUG) Log.d(TAG, "cancel()");
- mHandler.sendEmptyMessage(MSG_CANCEL);
- }
-
- /**
- * Called when Face Unlock wants to increment the number of failed attempts.
- */
- public void reportFailedAttempt() {
- if (DEBUG) Log.d(TAG, "reportFailedAttempt()");
- mHandler.sendEmptyMessage(MSG_REPORT_FAILED_ATTEMPT);
- }
-
- /**
- * Called when Face Unlock wants to keep the screen alive and active for a specific amount
- * of time.
- */
- public void pokeWakelock(int millis) {
- if (DEBUG) Log.d(TAG, "pokeWakelock() for " + millis + "ms");
- Message message = mHandler.obtainMessage(MSG_POKE_WAKELOCK, millis, -1);
- mHandler.sendMessage(message);
- }
-
- };
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java
index a411df3..b03176c 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java
@@ -37,7 +37,6 @@
protected LockPatternUtils mLockPatternUtils;
protected SecurityMessageDisplay mSecurityMessageDisplay;
protected View mEcaView;
- private Drawable mBouncerFrame;
protected boolean mEnableHaptics;
// To avoid accidental lockout due to events while the device in in the pocket, ignore
@@ -86,10 +85,6 @@
mLockPatternUtils = new LockPatternUtils(mContext);
mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this);
mEcaView = findViewById(R.id.keyguard_selector_fade_container);
- View bouncerFrameView = findViewById(R.id.keyguard_bouncer_frame);
- if (bouncerFrameView != null) {
- mBouncerFrame = bouncerFrameView.getBackground();
- }
}
/*
@@ -183,18 +178,6 @@
}
@Override
- public void showBouncer(int duration) {
- KeyguardSecurityViewHelper.
- showBouncer(mSecurityMessageDisplay, mEcaView, mBouncerFrame, duration);
- }
-
- @Override
- public void hideBouncer(int duration) {
- KeyguardSecurityViewHelper.
- hideBouncer(mSecurityMessageDisplay, mEcaView, mBouncerFrame, duration);
- }
-
- @Override
public boolean startDisappearAnimation(Runnable finishRunnable) {
return false;
}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardAccountView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardAccountView.java
deleted file mode 100644
index 5cb3b9b..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardAccountView.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.keyguard;
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.accounts.AccountManagerCallback;
-import android.accounts.AccountManagerFuture;
-import android.accounts.AuthenticatorException;
-import android.accounts.OperationCanceledException;
-import android.app.Dialog;
-import android.app.ProgressDialog;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.text.Editable;
-import android.text.InputFilter;
-import android.text.LoginFilter;
-import android.text.TextWatcher;
-import android.util.AttributeSet;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.WindowManager;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-
-import com.android.internal.widget.LockPatternUtils;
-
-import java.io.IOException;
-
-/**
- * When the user forgets their password a bunch of times, we fall back on their
- * account's login/password to unlock the phone (and reset their lock pattern).
- */
-public class KeyguardAccountView extends LinearLayout implements KeyguardSecurityView,
- View.OnClickListener, TextWatcher {
- private static final String LOCK_PATTERN_PACKAGE = "com.android.settings";
- private static final String LOCK_PATTERN_CLASS = LOCK_PATTERN_PACKAGE + ".ChooseLockGeneric";
-
- private KeyguardSecurityCallback mCallback;
- private LockPatternUtils mLockPatternUtils;
- private EditText mLogin;
- private EditText mPassword;
- private Button mOk;
- public boolean mEnableFallback;
- private SecurityMessageDisplay mSecurityMessageDisplay;
-
- /**
- * Shown while making asynchronous check of password.
- */
- private ProgressDialog mCheckingDialog;
-
- public KeyguardAccountView(Context context) {
- this(context, null, 0);
- }
-
- public KeyguardAccountView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public KeyguardAccountView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- mLockPatternUtils = new LockPatternUtils(getContext());
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
-
- mLogin = (EditText) findViewById(R.id.login);
- mLogin.setFilters(new InputFilter[] { new LoginFilter.UsernameFilterGeneric() } );
- mLogin.addTextChangedListener(this);
-
- mPassword = (EditText) findViewById(R.id.password);
- mPassword.addTextChangedListener(this);
-
- mOk = (Button) findViewById(R.id.ok);
- mOk.setOnClickListener(this);
-
- mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this);
- reset();
- }
-
- public void setKeyguardCallback(KeyguardSecurityCallback callback) {
- mCallback = callback;
- }
-
- public void setLockPatternUtils(LockPatternUtils utils) {
- mLockPatternUtils = utils;
- }
-
- public KeyguardSecurityCallback getCallback() {
- return mCallback;
- }
-
-
- public void afterTextChanged(Editable s) {
- }
-
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- }
-
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- if (mCallback != null) {
- mCallback.userActivity();
- }
- }
-
- @Override
- protected boolean onRequestFocusInDescendants(int direction,
- Rect previouslyFocusedRect) {
- // send focus to the login field
- return mLogin.requestFocus(direction, previouslyFocusedRect);
- }
-
- public boolean needsInput() {
- return true;
- }
-
- public void reset() {
- // start fresh
- mLogin.setText("");
- mPassword.setText("");
- mLogin.requestFocus();
- boolean permLocked = mLockPatternUtils.isPermanentlyLocked();
- mSecurityMessageDisplay.setMessage(permLocked ? R.string.kg_login_too_many_attempts :
- R.string.kg_login_instructions, permLocked ? true : false);
- }
-
- /** {@inheritDoc} */
- public void cleanUp() {
- if (mCheckingDialog != null) {
- mCheckingDialog.hide();
- }
- mCallback = null;
- mLockPatternUtils = null;
- }
-
- public void onClick(View v) {
- mCallback.userActivity();
- if (v == mOk) {
- asyncCheckPassword();
- }
- }
-
- private void postOnCheckPasswordResult(final boolean success) {
- // ensure this runs on UI thread
- mLogin.post(new Runnable() {
- public void run() {
- if (success) {
- // clear out forgotten password
- mLockPatternUtils.setPermanentlyLocked(false);
- mLockPatternUtils.setLockPatternEnabled(false);
- mLockPatternUtils.saveLockPattern(null);
-
- // launch the 'choose lock pattern' activity so
- // the user can pick a new one if they want to
- Intent intent = new Intent();
- intent.setClassName(LOCK_PATTERN_PACKAGE, LOCK_PATTERN_CLASS);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivityAsUser(intent,
- new UserHandle(mLockPatternUtils.getCurrentUser()));
- mCallback.reportUnlockAttempt(true);
-
- // dismiss keyguard
- mCallback.dismiss(true);
- } else {
- mSecurityMessageDisplay.setMessage(R.string.kg_login_invalid_input, true);
- mPassword.setText("");
- mCallback.reportUnlockAttempt(false);
- }
- }
- });
- }
-
- @Override
- public boolean dispatchKeyEvent(KeyEvent event) {
- if (event.getAction() == KeyEvent.ACTION_DOWN
- && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
- if (mLockPatternUtils.isPermanentlyLocked()) {
- mCallback.dismiss(false);
- } else {
- // TODO: mCallback.forgotPattern(false);
- }
- return true;
- }
- return super.dispatchKeyEvent(event);
- }
-
- /**
- * Given the string the user entered in the 'username' field, find
- * the stored account that they probably intended. Prefer, in order:
- *
- * - an exact match for what was typed, or
- * - a case-insensitive match for what was typed, or
- * - if they didn't include a domain, an exact match of the username, or
- * - if they didn't include a domain, a case-insensitive
- * match of the username.
- *
- * If there is a tie for the best match, choose neither --
- * the user needs to be more specific.
- *
- * @return an account name from the database, or null if we can't
- * find a single best match.
- */
- private Account findIntendedAccount(String username) {
- Account[] accounts = AccountManager.get(mContext).getAccountsByTypeAsUser("com.google",
- new UserHandle(mLockPatternUtils.getCurrentUser()));
-
- // Try to figure out which account they meant if they
- // typed only the username (and not the domain), or got
- // the case wrong.
-
- Account bestAccount = null;
- int bestScore = 0;
- for (Account a: accounts) {
- int score = 0;
- if (username.equals(a.name)) {
- score = 4;
- } else if (username.equalsIgnoreCase(a.name)) {
- score = 3;
- } else if (username.indexOf('@') < 0) {
- int i = a.name.indexOf('@');
- if (i >= 0) {
- String aUsername = a.name.substring(0, i);
- if (username.equals(aUsername)) {
- score = 2;
- } else if (username.equalsIgnoreCase(aUsername)) {
- score = 1;
- }
- }
- }
- if (score > bestScore) {
- bestAccount = a;
- bestScore = score;
- } else if (score == bestScore) {
- bestAccount = null;
- }
- }
- return bestAccount;
- }
-
- private void asyncCheckPassword() {
- mCallback.userActivity();
- final String login = mLogin.getText().toString();
- final String password = mPassword.getText().toString();
- Account account = findIntendedAccount(login);
- if (account == null) {
- postOnCheckPasswordResult(false);
- return;
- }
- getProgressDialog().show();
- Bundle options = new Bundle();
- options.putString(AccountManager.KEY_PASSWORD, password);
- AccountManager.get(mContext).confirmCredentialsAsUser(account, options, null /* activity */,
- new AccountManagerCallback<Bundle>() {
- public void run(AccountManagerFuture<Bundle> future) {
- try {
- mCallback.userActivity();
- final Bundle result = future.getResult();
- final boolean verified = result.getBoolean(AccountManager.KEY_BOOLEAN_RESULT);
- postOnCheckPasswordResult(verified);
- } catch (OperationCanceledException e) {
- postOnCheckPasswordResult(false);
- } catch (IOException e) {
- postOnCheckPasswordResult(false);
- } catch (AuthenticatorException e) {
- postOnCheckPasswordResult(false);
- } finally {
- mLogin.post(new Runnable() {
- public void run() {
- getProgressDialog().hide();
- }
- });
- }
- }
- }, null /* handler */, new UserHandle(mLockPatternUtils.getCurrentUser()));
- }
-
- private Dialog getProgressDialog() {
- if (mCheckingDialog == null) {
- mCheckingDialog = new ProgressDialog(mContext);
- mCheckingDialog.setMessage(
- mContext.getString(R.string.kg_login_checking_password));
- mCheckingDialog.setIndeterminate(true);
- mCheckingDialog.setCancelable(false);
- mCheckingDialog.getWindow().setType(
- WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
- }
- return mCheckingDialog;
- }
-
- @Override
- public void onPause() {
-
- }
-
- @Override
- public void onResume(int reason) {
- reset();
- }
-
- @Override
- public void showUsabilityHint() {
- }
-
- @Override
- public void showBouncer(int duration) {
- }
-
- @Override
- public void hideBouncer(int duration) {
- }
-
- @Override
- public void startAppearAnimation() {
- // TODO.
- }
-
- @Override
- public boolean startDisappearAnimation(Runnable finishRunnable) {
- return false;
- }
-}
-
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardActivityLauncher.java b/packages/Keyguard/src/com/android/keyguard/KeyguardActivityLauncher.java
deleted file mode 100644
index 1978ded..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardActivityLauncher.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-import com.android.internal.widget.LockPatternUtils;
-
-import android.app.ActivityManagerNative;
-import android.app.ActivityOptions;
-import android.app.IActivityManager.WaitResult;
-import android.appwidget.AppWidgetManager;
-import android.appwidget.AppWidgetProviderInfo;
-import android.content.ActivityNotFoundException;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.RemoteException;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.provider.MediaStore;
-import android.util.Log;
-import android.view.WindowManager;
-import android.view.WindowManagerGlobal;
-
-import com.android.keyguard.KeyguardHostView.OnDismissAction;
-
-import java.util.List;
-
-public abstract class KeyguardActivityLauncher {
- private static final String TAG = KeyguardActivityLauncher.class.getSimpleName();
- private static final boolean DEBUG = KeyguardConstants.DEBUG;
- private static final String META_DATA_KEYGUARD_LAYOUT = "com.android.keyguard.layout";
- private static final Intent SECURE_CAMERA_INTENT =
- new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE)
- .addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
- private static final Intent INSECURE_CAMERA_INTENT =
- new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
-
- abstract Context getContext();
-
- abstract LockPatternUtils getLockPatternUtils();
-
- abstract void setOnDismissAction(OnDismissAction action);
-
- abstract void requestDismissKeyguard();
-
- public static class CameraWidgetInfo {
- public String contextPackage;
- public int layoutId;
- }
-
- public CameraWidgetInfo getCameraWidgetInfo() {
- CameraWidgetInfo info = new CameraWidgetInfo();
- Intent intent = getCameraIntent();
- PackageManager packageManager = getContext().getPackageManager();
- final List<ResolveInfo> appList = packageManager.queryIntentActivitiesAsUser(
- intent, PackageManager.MATCH_DEFAULT_ONLY, getLockPatternUtils().getCurrentUser());
- if (appList.size() == 0) {
- if (DEBUG) Log.d(TAG, "getCameraWidgetInfo(): Nothing found");
- return null;
- }
- ResolveInfo resolved = packageManager.resolveActivityAsUser(intent,
- PackageManager.MATCH_DEFAULT_ONLY | PackageManager.GET_META_DATA,
- getLockPatternUtils().getCurrentUser());
- if (DEBUG) Log.d(TAG, "getCameraWidgetInfo(): resolved: " + resolved);
- if (wouldLaunchResolverActivity(resolved, appList)) {
- if (DEBUG) Log.d(TAG, "getCameraWidgetInfo(): Would launch resolver");
- return info;
- }
- if (resolved == null || resolved.activityInfo == null) {
- return null;
- }
- if (resolved.activityInfo.metaData == null || resolved.activityInfo.metaData.isEmpty()) {
- if (DEBUG) Log.d(TAG, "getCameraWidgetInfo(): no metadata found");
- return info;
- }
- int layoutId = resolved.activityInfo.metaData.getInt(META_DATA_KEYGUARD_LAYOUT);
- if (layoutId == 0) {
- if (DEBUG) Log.d(TAG, "getCameraWidgetInfo(): no layout specified");
- return info;
- }
- info.contextPackage = resolved.activityInfo.packageName;
- info.layoutId = layoutId;
- return info;
- }
-
- public void launchCamera(Handler worker, Runnable onSecureCameraStarted) {
- LockPatternUtils lockPatternUtils = getLockPatternUtils();
-
- // Workaround to avoid camera release/acquisition race when resuming face unlock
- // after showing lockscreen camera (bug 11063890).
- KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(getContext());
- updateMonitor.setAlternateUnlockEnabled(false);
-
- if (mustLaunchSecurely()) {
- // Launch the secure version of the camera
- if (wouldLaunchResolverActivity(SECURE_CAMERA_INTENT)) {
- // TODO: Show disambiguation dialog instead.
- // For now, we'll treat this like launching any other app from secure keyguard.
- // When they do, user sees the system's ResolverActivity which lets them choose
- // which secure camera to use.
- launchActivity(SECURE_CAMERA_INTENT, false, false, null, null);
- } else {
- launchActivity(SECURE_CAMERA_INTENT, true, false, worker, onSecureCameraStarted);
- }
- } else {
- // Launch the normal camera
- launchActivity(INSECURE_CAMERA_INTENT, false, false, null, null);
- }
- }
-
- private boolean mustLaunchSecurely() {
- LockPatternUtils lockPatternUtils = getLockPatternUtils();
- KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(getContext());
- int currentUser = lockPatternUtils.getCurrentUser();
- return lockPatternUtils.isSecure() && !updateMonitor.getUserHasTrust(currentUser);
- }
-
- public void launchWidgetPicker(int appWidgetId) {
- Intent pickIntent = new Intent(AppWidgetManager.ACTION_KEYGUARD_APPWIDGET_PICK);
-
- pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
- pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_SORT, false);
- pickIntent.putExtra(AppWidgetManager.EXTRA_CATEGORY_FILTER,
- AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD);
-
- Bundle options = new Bundle();
- options.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
- AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD);
- pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options);
- pickIntent.addFlags(
- Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_SINGLE_TOP
- | Intent.FLAG_ACTIVITY_CLEAR_TOP
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
-
- launchActivity(pickIntent, false, false, null, null);
- }
-
- /**
- * Launches the said intent for the current foreground user.
- *
- * @param intent
- * @param showsWhileLocked true if the activity can be run on top of keyguard.
- * See {@link WindowManager#FLAG_SHOW_WHEN_LOCKED}
- * @param useDefaultAnimations true if default transitions should be used, else suppressed.
- * @param worker if supplied along with onStarted, used to launch the blocking activity call.
- * @param onStarted if supplied along with worker, called after activity is started.
- */
- public void launchActivity(final Intent intent,
- boolean showsWhileLocked,
- boolean useDefaultAnimations,
- final Handler worker,
- final Runnable onStarted) {
-
- final Context context = getContext();
- final Bundle animation = useDefaultAnimations ? null
- : ActivityOptions.makeCustomAnimation(context, 0, 0).toBundle();
- launchActivityWithAnimation(intent, showsWhileLocked, animation, worker, onStarted);
- }
-
- public void launchActivityWithAnimation(final Intent intent,
- boolean showsWhileLocked,
- final Bundle animation,
- final Handler worker,
- final Runnable onStarted) {
-
- LockPatternUtils lockPatternUtils = getLockPatternUtils();
- intent.addFlags(
- Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_SINGLE_TOP
- | Intent.FLAG_ACTIVITY_CLEAR_TOP);
- boolean mustLaunchSecurely = mustLaunchSecurely();
- if (!mustLaunchSecurely || showsWhileLocked) {
- if (!mustLaunchSecurely) {
- dismissKeyguardOnNextActivity();
- }
- try {
- if (DEBUG) Log.d(TAG, String.format("Starting activity for intent %s at %s",
- intent, SystemClock.uptimeMillis()));
- startActivityForCurrentUser(intent, animation, worker, onStarted);
- } catch (ActivityNotFoundException e) {
- Log.w(TAG, "Activity not found for intent + " + intent.getAction());
- }
- } else {
- // Create a runnable to start the activity and ask the user to enter their
- // credentials.
- setOnDismissAction(new OnDismissAction() {
- @Override
- public boolean onDismiss() {
- dismissKeyguardOnNextActivity();
- startActivityForCurrentUser(intent, animation, worker, onStarted);
- return true;
- }
- });
- requestDismissKeyguard();
- }
- }
-
- private void dismissKeyguardOnNextActivity() {
- try {
- WindowManagerGlobal.getWindowManagerService().dismissKeyguard();
- } catch (RemoteException e) {
- Log.w(TAG, "Error dismissing keyguard", e);
- }
- }
-
- private void startActivityForCurrentUser(final Intent intent, final Bundle options,
- Handler worker, final Runnable onStarted) {
- final UserHandle user = new UserHandle(UserHandle.USER_CURRENT);
- if (worker == null || onStarted == null) {
- getContext().startActivityAsUser(intent, options, user);
- return;
- }
- // if worker + onStarted are supplied, run blocking activity launch call in the background
- worker.post(new Runnable(){
- @Override
- public void run() {
- try {
- WaitResult result = ActivityManagerNative.getDefault().startActivityAndWait(
- null /*caller*/,
- null /*caller pkg*/,
- intent,
- intent.resolveTypeIfNeeded(getContext().getContentResolver()),
- null /*resultTo*/,
- null /*resultWho*/,
- 0 /*requestCode*/,
- Intent.FLAG_ACTIVITY_NEW_TASK,
- null /*profilerInfo*/,
- options,
- user.getIdentifier());
- if (DEBUG) Log.d(TAG, String.format("waitResult[%s,%s,%s,%s] at %s",
- result.result, result.thisTime, result.totalTime, result.who,
- SystemClock.uptimeMillis()));
- } catch (RemoteException e) {
- Log.w(TAG, "Error starting activity", e);
- return;
- }
- try {
- onStarted.run();
- } catch (Throwable t) {
- Log.w(TAG, "Error running onStarted callback", t);
- }
- }});
- }
-
- private Intent getCameraIntent() {
- return mustLaunchSecurely() ? SECURE_CAMERA_INTENT : INSECURE_CAMERA_INTENT;
- }
-
- private boolean wouldLaunchResolverActivity(Intent intent) {
- PackageManager packageManager = getContext().getPackageManager();
- ResolveInfo resolved = packageManager.resolveActivityAsUser(intent,
- PackageManager.MATCH_DEFAULT_ONLY, getLockPatternUtils().getCurrentUser());
- List<ResolveInfo> appList = packageManager.queryIntentActivitiesAsUser(
- intent, PackageManager.MATCH_DEFAULT_ONLY, getLockPatternUtils().getCurrentUser());
- return wouldLaunchResolverActivity(resolved, appList);
- }
-
- private boolean wouldLaunchResolverActivity(ResolveInfo resolved, List<ResolveInfo> appList) {
- // If the list contains the above resolved activity, then it can't be
- // ResolverActivity itself.
- for (int i = 0; i < appList.size(); i++) {
- ResolveInfo tmp = appList.get(i);
- if (tmp.activityInfo.name.equals(resolved.activityInfo.name)
- && tmp.activityInfo.packageName.equals(resolved.activityInfo.packageName)) {
- return false;
- }
- }
- return true;
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardCircleFramedDrawable.java b/packages/Keyguard/src/com/android/keyguard/KeyguardCircleFramedDrawable.java
deleted file mode 100644
index 0e08cf4..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardCircleFramedDrawable.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.ColorFilter;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.drawable.Drawable;
-
-class KeyguardCircleFramedDrawable extends Drawable {
-
- private final Bitmap mBitmap;
- private final int mSize;
- private final Paint mPaint;
- private final float mShadowRadius;
- private final float mStrokeWidth;
- private final int mFrameColor;
- private final int mHighlightColor;
- private final int mFrameShadowColor;
-
- private float mScale;
- private Path mFramePath;
- private Rect mSrcRect;
- private RectF mDstRect;
- private RectF mFrameRect;
- private boolean mPressed;
-
- public KeyguardCircleFramedDrawable(Bitmap bitmap, int size,
- int frameColor, float strokeWidth,
- int frameShadowColor, float shadowRadius,
- int highlightColor) {
- super();
- mSize = size;
- mShadowRadius = shadowRadius;
- mFrameColor = frameColor;
- mFrameShadowColor = frameShadowColor;
- mStrokeWidth = strokeWidth;
- mHighlightColor = highlightColor;
-
- mBitmap = Bitmap.createBitmap(mSize, mSize, Bitmap.Config.ARGB_8888);
- final Canvas canvas = new Canvas(mBitmap);
-
- final int width = bitmap.getWidth();
- final int height = bitmap.getHeight();
- final int square = Math.min(width, height);
-
- final Rect cropRect = new Rect((width - square) / 2, (height - square) / 2, square, square);
- final RectF circleRect = new RectF(0f, 0f, mSize, mSize);
- circleRect.inset(mStrokeWidth / 2f, mStrokeWidth / 2f);
- circleRect.inset(mShadowRadius, mShadowRadius);
-
- final Path fillPath = new Path();
- fillPath.addArc(circleRect, 0f, 360f);
-
- canvas.drawColor(0, PorterDuff.Mode.CLEAR);
-
- // opaque circle matte
- mPaint = new Paint();
- mPaint.setAntiAlias(true);
- mPaint.setColor(Color.BLACK);
- mPaint.setStyle(Paint.Style.FILL);
- canvas.drawPath(fillPath, mPaint);
-
- // mask in the icon where the bitmap is opaque
- mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
- canvas.drawBitmap(bitmap, cropRect, circleRect, mPaint);
-
- // prepare paint for frame drawing
- mPaint.setXfermode(null);
-
- mScale = 1f;
-
- mSrcRect = new Rect(0, 0, mSize, mSize);
- mDstRect = new RectF(0, 0, mSize, mSize);
- mFrameRect = new RectF(mDstRect);
- mFramePath = new Path();
- }
-
- public void reset() {
- mScale = 1f;
- mPressed = false;
- }
-
- @Override
- public void draw(Canvas canvas) {
- // clear background
- final float outside = Math.min(canvas.getWidth(), canvas.getHeight());
- final float inside = mScale * outside;
- final float pad = (outside - inside) / 2f;
-
- mDstRect.set(pad, pad, outside - pad, outside - pad);
- canvas.drawBitmap(mBitmap, mSrcRect, mDstRect, null);
-
- mFrameRect.set(mDstRect);
- mFrameRect.inset(mStrokeWidth / 2f, mStrokeWidth / 2f);
- mFrameRect.inset(mShadowRadius, mShadowRadius);
-
- mFramePath.reset();
- mFramePath.addArc(mFrameRect, 0f, 360f);
-
- // white frame
- if (mPressed) {
- mPaint.setStyle(Paint.Style.FILL);
- mPaint.setColor(Color.argb((int) (0.33f * 255),
- Color.red(mHighlightColor),
- Color.green(mHighlightColor),
- Color.blue(mHighlightColor)));
- canvas.drawPath(mFramePath, mPaint);
- }
- mPaint.setStrokeWidth(mStrokeWidth);
- mPaint.setStyle(Paint.Style.STROKE);
- mPaint.setColor(mPressed ? mHighlightColor : mFrameColor);
- mPaint.setShadowLayer(mShadowRadius, 0f, 0f, mFrameShadowColor);
- canvas.drawPath(mFramePath, mPaint);
- }
-
- public void setScale(float scale) {
- mScale = scale;
- }
-
- public float getScale() {
- return mScale;
- }
-
- public void setPressed(boolean pressed) {
- mPressed = pressed;
- }
-
- @Override
- public int getOpacity() {
- return PixelFormat.TRANSLUCENT;
- }
-
- @Override
- public void setAlpha(int alpha) {
- }
-
- @Override
- public void setColorFilter(ColorFilter cf) {
- }
-
- public boolean verifyParams(float iconSize, int frameColor, float stroke,
- int frameShadowColor, float shadowRadius, int highlightColor) {
- return mSize == iconSize
- && mFrameColor == frameColor
- && mStrokeWidth == stroke
- && mFrameShadowColor == frameShadowColor
- && mShadowRadius == shadowRadius
- && mHighlightColor == highlightColor;
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardFaceUnlockView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardFaceUnlockView.java
deleted file mode 100644
index b3e9f77..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardFaceUnlockView.java
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.keyguard;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.telephony.TelephonyManager;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.IRotationWatcher;
-import android.view.IWindowManager;
-import android.view.View;
-import android.widget.ImageButton;
-import android.widget.LinearLayout;
-
-import com.android.internal.widget.LockPatternUtils;
-
-import java.lang.Math;
-
-public class KeyguardFaceUnlockView extends LinearLayout implements KeyguardSecurityView {
-
- private static final String TAG = "FULKeyguardFaceUnlockView";
- private static final boolean DEBUG = KeyguardConstants.DEBUG;
- private KeyguardSecurityCallback mKeyguardSecurityCallback;
- private LockPatternUtils mLockPatternUtils;
- private BiometricSensorUnlock mBiometricUnlock;
- private View mFaceUnlockAreaView;
- private ImageButton mCancelButton;
- private SecurityMessageDisplay mSecurityMessageDisplay;
- private View mEcaView;
- private Drawable mBouncerFrame;
-
- private boolean mIsBouncerVisibleToUser = false;
- private final Object mIsBouncerVisibleToUserLock = new Object();
-
- private int mLastRotation;
- private boolean mWatchingRotation;
- private final IWindowManager mWindowManager =
- IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
-
- private final IRotationWatcher mRotationWatcher = new IRotationWatcher.Stub() {
- public void onRotationChanged(int rotation) {
- if (DEBUG) Log.d(TAG, "onRotationChanged(): " + mLastRotation + "->" + rotation);
-
- // If the difference between the new rotation value and the previous rotation value is
- // equal to 2, the rotation change was 180 degrees. This stops the biometric unlock
- // and starts it in the new position. This is not performed for 90 degree rotations
- // since a 90 degree rotation is a configuration change, which takes care of this for
- // us.
- if (Math.abs(rotation - mLastRotation) == 2) {
- if (mBiometricUnlock != null) {
- mBiometricUnlock.stop();
- maybeStartBiometricUnlock();
- }
- }
- mLastRotation = rotation;
- }
- };
-
- public KeyguardFaceUnlockView(Context context) {
- this(context, null);
- }
-
- public KeyguardFaceUnlockView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
-
- initializeBiometricUnlockView();
-
- mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this);
- mEcaView = findViewById(R.id.keyguard_selector_fade_container);
- View bouncerFrameView = findViewById(R.id.keyguard_bouncer_frame);
- if (bouncerFrameView != null) {
- mBouncerFrame = bouncerFrameView.getBackground();
- }
- }
-
- @Override
- public void setKeyguardCallback(KeyguardSecurityCallback callback) {
- mKeyguardSecurityCallback = callback;
- // TODO: formalize this in the interface or factor it out
- ((FaceUnlock)mBiometricUnlock).setKeyguardCallback(callback);
- }
-
- @Override
- public void setLockPatternUtils(LockPatternUtils utils) {
- mLockPatternUtils = utils;
- }
-
- @Override
- public void reset() {
-
- }
-
- @Override
- public void onDetachedFromWindow() {
- if (DEBUG) Log.d(TAG, "onDetachedFromWindow()");
- if (mBiometricUnlock != null) {
- mBiometricUnlock.stop();
- }
- KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateCallback);
- if (mWatchingRotation) {
- try {
- mWindowManager.removeRotationWatcher(mRotationWatcher);
- mWatchingRotation = false;
- } catch (RemoteException e) {
- Log.e(TAG, "Remote exception when removing rotation watcher");
- }
- }
- }
-
- @Override
- public void onPause() {
- if (DEBUG) Log.d(TAG, "onPause()");
- if (mBiometricUnlock != null) {
- mBiometricUnlock.stop();
- }
- KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateCallback);
- if (mWatchingRotation) {
- try {
- mWindowManager.removeRotationWatcher(mRotationWatcher);
- mWatchingRotation = false;
- } catch (RemoteException e) {
- Log.e(TAG, "Remote exception when removing rotation watcher");
- }
- }
- }
-
- @Override
- public void onResume(int reason) {
- if (DEBUG) Log.d(TAG, "onResume()");
- synchronized (mIsBouncerVisibleToUserLock) {
- mIsBouncerVisibleToUser = isBouncerVisibleToUser();
- }
- KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateCallback);
-
- // Registers a callback which handles stopping the biometric unlock and restarting it in
- // the new position for a 180 degree rotation change.
- if (!mWatchingRotation) {
- try {
- mLastRotation = mWindowManager.watchRotation(mRotationWatcher);
- mWatchingRotation = true;
- } catch (RemoteException e) {
- Log.e(TAG, "Remote exception when adding rotation watcher");
- }
- }
- }
-
- @Override
- public boolean needsInput() {
- return false;
- }
-
- @Override
- public KeyguardSecurityCallback getCallback() {
- return mKeyguardSecurityCallback;
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- super.onLayout(changed, l, t, r, b);
- mBiometricUnlock.initializeView(mFaceUnlockAreaView);
- }
-
- private void initializeBiometricUnlockView() {
- if (DEBUG) Log.d(TAG, "initializeBiometricUnlockView()");
- mFaceUnlockAreaView = findViewById(R.id.face_unlock_area_view);
- if (mFaceUnlockAreaView != null) {
- mBiometricUnlock = new FaceUnlock(mContext);
-
- mCancelButton = (ImageButton) findViewById(R.id.face_unlock_cancel_button);
- mCancelButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- mBiometricUnlock.stopAndShowBackup();
- }
- });
- } else {
- Log.w(TAG, "Couldn't find biometric unlock view");
- }
- }
-
- /**
- * Starts the biometric unlock if it should be started based on a number of factors. If it
- * should not be started, it either goes to the back up, or remains showing to prepare for
- * it being started later.
- */
- private void maybeStartBiometricUnlock() {
- if (DEBUG) Log.d(TAG, "maybeStartBiometricUnlock()");
- if (mBiometricUnlock != null) {
- KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
- final boolean backupIsTimedOut = (
- monitor.getFailedUnlockAttempts() >=
- LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT);
-
- boolean isBouncerVisibleToUser;
- synchronized(mIsBouncerVisibleToUserLock) {
- isBouncerVisibleToUser = mIsBouncerVisibleToUser;
- }
-
- // Don't start it if the bouncer is not showing, but keep this view up because we want
- // it here and ready for when the bouncer does show.
- if (!isBouncerVisibleToUser) {
- mBiometricUnlock.stop(); // It shouldn't be running but calling this can't hurt.
- return;
- }
-
- // Although these same conditions are handled in KeyguardSecurityModel, they are still
- // necessary here. When a tablet is rotated 90 degrees, a configuration change is
- // triggered and everything is torn down and reconstructed. That means
- // KeyguardSecurityModel gets a chance to take care of the logic and doesn't even
- // reconstruct KeyguardFaceUnlockView if the biometric unlock should be suppressed.
- // However, for a 180 degree rotation, no configuration change is triggered, so only
- // the logic here is capable of suppressing Face Unlock.
- if (monitor.getPhoneState() == TelephonyManager.CALL_STATE_IDLE
- && monitor.isAlternateUnlockEnabled()
- && !monitor.getMaxBiometricUnlockAttemptsReached()
- && !backupIsTimedOut) {
- mBiometricUnlock.start();
- } else {
- mBiometricUnlock.stopAndShowBackup();
- }
- }
- }
-
- // Returns true if the device is currently in a state where the user is seeing the bouncer.
- // This requires isKeyguardBouncer() to be true, but that doesn't imply that the screen is on or
- // the keyguard visibility is set to true, so we must check those conditions as well.
- private boolean isBouncerVisibleToUser() {
- KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
- return updateMonitor.isKeyguardBouncer() && updateMonitor.isKeyguardVisible() &&
- updateMonitor.isScreenOn();
- }
-
- // Starts the biometric unlock if the bouncer was not previously visible to the user, but is now
- // visibile to the user. Stops the biometric unlock if the bouncer was previously visible to
- // the user, but is no longer visible to the user.
- private void handleBouncerUserVisibilityChanged() {
- boolean wasBouncerVisibleToUser;
- synchronized(mIsBouncerVisibleToUserLock) {
- wasBouncerVisibleToUser = mIsBouncerVisibleToUser;
- mIsBouncerVisibleToUser = isBouncerVisibleToUser();
- }
-
- if (mBiometricUnlock != null) {
- if (wasBouncerVisibleToUser && !mIsBouncerVisibleToUser) {
- mBiometricUnlock.stop();
- } else if (!wasBouncerVisibleToUser && mIsBouncerVisibleToUser) {
- maybeStartBiometricUnlock();
- }
- }
- }
-
- KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() {
- // We need to stop the biometric unlock when a phone call comes in
- @Override
- public void onPhoneStateChanged(int phoneState) {
- if (DEBUG) Log.d(TAG, "onPhoneStateChanged(" + phoneState + ")");
- if (phoneState == TelephonyManager.CALL_STATE_RINGING) {
- if (mBiometricUnlock != null) {
- mBiometricUnlock.stopAndShowBackup();
- }
- }
- }
-
- @Override
- public void onUserSwitching(int userId) {
- if (DEBUG) Log.d(TAG, "onUserSwitched(" + userId + ")");
- if (mBiometricUnlock != null) {
- mBiometricUnlock.stop();
- }
- // No longer required; static value set by KeyguardViewMediator
- // mLockPatternUtils.setCurrentUser(userId);
- }
-
- @Override
- public void onUserSwitchComplete(int userId) {
- if (DEBUG) Log.d(TAG, "onUserSwitchComplete(" + userId + ")");
- if (mBiometricUnlock != null) {
- maybeStartBiometricUnlock();
- }
- }
-
- @Override
- public void onKeyguardVisibilityChanged(boolean showing) {
- if (DEBUG) Log.d(TAG, "onKeyguardVisibilityChanged(" + showing + ")");
- handleBouncerUserVisibilityChanged();
- }
-
- @Override
- public void onKeyguardBouncerChanged(boolean bouncer) {
- if (DEBUG) Log.d(TAG, "onKeyguardBouncerChanged(" + bouncer + ")");
- handleBouncerUserVisibilityChanged();
- }
-
- @Override
- public void onScreenTurnedOn() {
- if (DEBUG) Log.d(TAG, "onScreenTurnedOn()");
- handleBouncerUserVisibilityChanged();
- }
-
- @Override
- public void onScreenTurnedOff(int why) {
- if (DEBUG) Log.d(TAG, "onScreenTurnedOff()");
- handleBouncerUserVisibilityChanged();
- }
-
- @Override
- public void onEmergencyCallAction() {
- if (mBiometricUnlock != null) {
- mBiometricUnlock.stop();
- }
- }
- };
-
- @Override
- public void showUsabilityHint() {
- }
-
- @Override
- public void showBouncer(int duration) {
- KeyguardSecurityViewHelper.
- showBouncer(mSecurityMessageDisplay, mEcaView, mBouncerFrame, duration);
- }
-
- @Override
- public void hideBouncer(int duration) {
- KeyguardSecurityViewHelper.
- hideBouncer(mSecurityMessageDisplay, mEcaView, mBouncerFrame, duration);
- }
-
- @Override
- public void startAppearAnimation() {
- // TODO.
- }
-
- @Override
- public boolean startDisappearAnimation(Runnable finishRunnable) {
- return false;
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardGlowStripView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardGlowStripView.java
deleted file mode 100644
index 98a44a6..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardGlowStripView.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.keyguard;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
-import android.animation.ValueAnimator.AnimatorUpdateListener;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.Interpolator;
-import android.view.animation.LinearInterpolator;
-import android.widget.LinearLayout;
-
-/**
- * A layout which animates a strip of horizontal, pulsing dots on request. This is used
- * to indicate the presence of pages to the left / right.
- */
-public class KeyguardGlowStripView extends LinearLayout {
- private static final int DURATION = 500;
-
- private static final float SLIDING_WINDOW_SIZE = 0.4f;
- private int mDotStripTop;
- private int mHorizontalDotGap;
-
- private int mDotSize;
- private int mNumDots;
- private Drawable mDotDrawable;
- private boolean mLeftToRight = true;
-
- private float mAnimationProgress = 0f;
- private boolean mDrawDots = false;
- private ValueAnimator mAnimator;
- private Interpolator mDotAlphaInterpolator = new DecelerateInterpolator(0.5f);
-
- public KeyguardGlowStripView(Context context) {
- this(context, null, 0);
- }
-
- public KeyguardGlowStripView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public KeyguardGlowStripView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.KeyguardGlowStripView);
- mDotSize = a.getDimensionPixelSize(R.styleable.KeyguardGlowStripView_dotSize, mDotSize);
- mNumDots = a.getInt(R.styleable.KeyguardGlowStripView_numDots, mNumDots);
- mDotDrawable = a.getDrawable(R.styleable.KeyguardGlowStripView_glowDot);
- mLeftToRight = a.getBoolean(R.styleable.KeyguardGlowStripView_leftToRight, mLeftToRight);
- }
-
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- int availableWidth = w - getPaddingLeft() - getPaddingRight();
- mHorizontalDotGap = (availableWidth - mDotSize * mNumDots) / (mNumDots - 1);
- mDotStripTop = getPaddingTop();
- invalidate();
- }
-
- @Override
- protected void dispatchDraw(Canvas canvas) {
- super.dispatchDraw(canvas);
-
- if (!mDrawDots) return;
-
- int xOffset = getPaddingLeft();
- mDotDrawable.setBounds(0, 0, mDotSize, mDotSize);
-
- for (int i = 0; i < mNumDots; i++) {
- // We fudge the relative position to provide a fade in of the first dot and a fade
- // out of the final dot.
- float relativeDotPosition = SLIDING_WINDOW_SIZE / 2 + ((1.0f * i) / (mNumDots - 1)) *
- (1 - SLIDING_WINDOW_SIZE);
- float distance = Math.abs(relativeDotPosition - mAnimationProgress);
- float alpha = Math.max(0, 1 - distance / (SLIDING_WINDOW_SIZE / 2));
-
- alpha = mDotAlphaInterpolator.getInterpolation(alpha);
-
- canvas.save();
- canvas.translate(xOffset, mDotStripTop);
- mDotDrawable.setAlpha((int) (alpha * 255));
- mDotDrawable.draw(canvas);
- canvas.restore();
- xOffset += mDotSize + mHorizontalDotGap;
- }
- }
-
- public void makeEmGo() {
- if (mAnimator != null) {
- mAnimator.cancel();
- }
- float from = mLeftToRight ? 0f : 1f;
- float to = mLeftToRight ? 1f : 0f;
- mAnimator = ValueAnimator.ofFloat(from, to);
- mAnimator.setDuration(DURATION);
- mAnimator.setInterpolator(new LinearInterpolator());
- mAnimator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mDrawDots = false;
- // make sure we draw one frame at the end with everything gone.
- invalidate();
- }
-
- @Override
- public void onAnimationStart(Animator animation) {
- mDrawDots = true;
- }
- });
- mAnimator.addUpdateListener(new AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- mAnimationProgress = (Float) animation.getAnimatedValue();
- invalidate();
- }
- });
- mAnimator.start();
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
index ab18271..7fa5055 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2007 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.
@@ -16,101 +16,37 @@
package com.android.keyguard;
-import com.android.internal.widget.LockPatternUtils;
-import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
-import com.android.keyguard.KeyguardUpdateMonitor.DisplayClientState;
-
+import android.app.Activity;
import android.app.ActivityManager;
-import android.app.ActivityOptions;
-import android.app.admin.DevicePolicyManager;
-import android.appwidget.AppWidgetHost;
-import android.appwidget.AppWidgetHostView;
-import android.appwidget.AppWidgetManager;
-import android.appwidget.AppWidgetProviderInfo;
-import android.content.ComponentName;
import android.content.Context;
-import android.content.Intent;
-import android.content.IntentSender;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
-import android.graphics.Rect;
-import android.media.RemoteControlClient;
+import android.graphics.Canvas;
+import android.media.AudioManager;
import android.os.Bundle;
-import android.os.Looper;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.UserHandle;
-import android.os.UserManager;
-import android.provider.Settings;
+import android.os.SystemClock;
+import android.telephony.TelephonyManager;
import android.util.AttributeSet;
import android.util.Log;
-import android.util.Slog;
-import android.view.LayoutInflater;
+import android.view.KeyEvent;
import android.view.MotionEvent;
-import android.view.View;
-import android.widget.RemoteViews.OnClickHandler;
+import android.widget.FrameLayout;
-import java.lang.ref.WeakReference;
+import com.android.internal.widget.LockPatternUtils;
+import com.android.keyguard.KeyguardSecurityContainer.SecurityCallback;
+import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
-public class KeyguardHostView extends KeyguardViewBase {
- private static final String TAG = "KeyguardHostView";
- public static boolean DEBUG = KeyguardConstants.DEBUG;
- public static boolean DEBUGXPORT = true; // debug music transport control
+import java.io.File;
- // Transport control states.
- static final int TRANSPORT_GONE = 0;
- static final int TRANSPORT_INVISIBLE = 1;
- static final int TRANSPORT_VISIBLE = 2;
-
- private int mTransportState = TRANSPORT_GONE;
-
- // Found in KeyguardAppWidgetPickActivity.java
- static final int APPWIDGET_HOST_ID = 0x4B455947;
- private final int MAX_WIDGETS = 5;
-
- private AppWidgetHost mAppWidgetHost;
- private AppWidgetManager mAppWidgetManager;
- private KeyguardWidgetPager mAppWidgetContainer;
- // TODO remove transport control references, these don't exist anymore
- private KeyguardTransportControlView mTransportControl;
- private int mAppWidgetToShow;
-
- protected int mFailedAttempts;
-
- private KeyguardViewStateManager mViewStateManager;
-
- private Rect mTempRect = new Rect();
- private int mDisabledFeatures;
- private boolean mCameraDisabled;
- private boolean mSafeModeEnabled;
- private boolean mUserSetupCompleted;
-
- // User for whom this host view was created. Final because we should never change the
- // id without reconstructing an instance of KeyguardHostView. See note below...
- private final int mUserId;
-
- private KeyguardMultiUserSelectorView mKeyguardMultiUserSelectorView;
-
- protected int mClientGeneration;
-
- protected boolean mShowSecurityWhenReturn;
-
- private final Rect mInsets = new Rect();
-
- private MyOnClickHandler mOnClickHandler = new MyOnClickHandler(this);
-
- private Runnable mPostBootCompletedRunnable;
-
- /*package*/ interface UserSwitcherCallback {
- void hideSecurityView(int duration);
- void showSecurityView();
- void showUnlockHint();
- void userActivity();
- }
-
- interface TransportControlCallback {
- void userActivity();
- }
+/**
+ * Base class for keyguard view. {@link #reset} is where you should
+ * reset the state of your view. Use the {@link KeyguardViewCallback} via
+ * {@link #getCallback()} to send information back (such as poking the wake lock,
+ * or finishing the keyguard).
+ *
+ * Handles intercepting of media keys that still work when the keyguard is
+ * showing.
+ */
+public class KeyguardHostView extends FrameLayout implements SecurityCallback {
public interface OnDismissAction {
/**
@@ -119,361 +55,143 @@
boolean onDismiss();
}
+ private AudioManager mAudioManager;
+ private TelephonyManager mTelephonyManager = null;
+ protected ViewMediatorCallback mViewMediatorCallback;
+ protected LockPatternUtils mLockPatternUtils;
+ private OnDismissAction mDismissAction;
+
+ private final KeyguardUpdateMonitorCallback mUpdateCallback =
+ new KeyguardUpdateMonitorCallback() {
+
+ @Override
+ public void onUserSwitchComplete(int userId) {
+ getSecurityContainer().showPrimarySecurityScreen(false /* turning off */);
+ }
+
+ @Override
+ public void onTrustInitiatedByUser(int userId) {
+ if (userId != mLockPatternUtils.getCurrentUser()) return;
+ if (!isAttachedToWindow()) return;
+
+ if (isVisibleToUser()) {
+ dismiss(false /* authenticated */);
+ } else {
+ mViewMediatorCallback.playTrustedSound();
+ }
+ }
+ };
+
+ // Whether the volume keys should be handled by keyguard. If true, then
+ // they will be handled here for specific media types such as music, otherwise
+ // the audio service will bring up the volume dialog.
+ private static final boolean KEYGUARD_MANAGES_VOLUME = false;
+ public static final boolean DEBUG = KeyguardConstants.DEBUG;
+ private static final String TAG = "KeyguardViewBase";
+
+ private KeyguardSecurityContainer mSecurityContainer;
+
public KeyguardHostView(Context context) {
this(context, null);
}
public KeyguardHostView(Context context, AttributeSet attrs) {
super(context, attrs);
-
- if (DEBUG) Log.e(TAG, "KeyguardHostView()");
-
- mLockPatternUtils = new LockPatternUtils(context);
-
- // Note: This depends on KeyguardHostView getting reconstructed every time the
- // user switches, since mUserId will be used for the entire session.
- // Once created, keyguard should *never* re-use this instance with another user.
- // In other words, mUserId should never change - hence it's marked final.
- mUserId = mLockPatternUtils.getCurrentUser();
-
- DevicePolicyManager dpm =
- (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
- if (dpm != null) {
- mDisabledFeatures = getDisabledFeatures(dpm);
- mCameraDisabled = dpm.getCameraDisabled(null);
- }
-
- mSafeModeEnabled = LockPatternUtils.isSafeModeEnabled();
-
- // These need to be created with the user context...
- Context userContext = null;
- try {
- final String packageName = "system";
- userContext = mContext.createPackageContextAsUser(packageName, 0,
- new UserHandle(mUserId));
-
- } catch (NameNotFoundException e) {
- e.printStackTrace();
- // This should never happen, but it's better to have no widgets than to crash.
- userContext = context;
- }
-
- mAppWidgetHost = new AppWidgetHost(userContext, APPWIDGET_HOST_ID, mOnClickHandler,
- Looper.myLooper());
-
- mAppWidgetManager = AppWidgetManager.getInstance(userContext);
-
- mViewStateManager = new KeyguardViewStateManager(this);
-
- mUserSetupCompleted = Settings.Secure.getIntForUser(mContext.getContentResolver(),
- Settings.Secure.USER_SETUP_COMPLETE, 0, UserHandle.USER_CURRENT) != 0;
-
- // Ensure we have the current state *before* we call showAppropriateWidgetPage()
- getInitialTransportState();
-
- if (mSafeModeEnabled) {
- Log.v(TAG, "Keyguard widgets disabled by safe mode");
- }
- if ((mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_WIDGETS_ALL) != 0) {
- Log.v(TAG, "Keyguard widgets disabled by DPM");
- }
- if ((mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0) {
- Log.v(TAG, "Keyguard secure camera disabled by DPM");
- }
+ KeyguardUpdateMonitor.getInstance(context).registerCallback(mUpdateCallback);
}
- private void getInitialTransportState() {
- DisplayClientState dcs = KeyguardUpdateMonitor.getInstance(mContext)
- .getCachedDisplayClientState();
- mTransportState = (dcs.clearing ? TRANSPORT_GONE :
- (isMusicPlaying(dcs.playbackState) ? TRANSPORT_VISIBLE : TRANSPORT_INVISIBLE));
-
- if (DEBUGXPORT) Log.v(TAG, "Initial transport state: "
- + mTransportState + ", pbstate=" + dcs.playbackState);
- }
-
- private void cleanupAppWidgetIds() {
- if (mSafeModeEnabled || widgetsDisabled()) return;
-
- // Clean up appWidgetIds that are bound to lockscreen, but not actually used
- // This is only to clean up after another bug: we used to not call
- // deleteAppWidgetId when a user manually deleted a widget in keyguard. This code
- // shouldn't have to run more than once per user. AppWidgetProviders rely on callbacks
- // that are triggered by deleteAppWidgetId, which is why we're doing this
- int[] appWidgetIdsInKeyguardSettings = mLockPatternUtils.getAppWidgets();
- int[] appWidgetIdsBoundToHost = mAppWidgetHost.getAppWidgetIds();
- for (int i = 0; i < appWidgetIdsBoundToHost.length; i++) {
- int appWidgetId = appWidgetIdsBoundToHost[i];
- if (!contains(appWidgetIdsInKeyguardSettings, appWidgetId)) {
- Log.d(TAG, "Found a appWidgetId that's not being used by keyguard, deleting id "
- + appWidgetId);
- mAppWidgetHost.deleteAppWidgetId(appWidgetId);
- }
- }
- }
-
- private static boolean contains(int[] array, int target) {
- for (int value : array) {
- if (value == target) {
- return true;
- }
- }
- return false;
- }
-
- private KeyguardUpdateMonitorCallback mUpdateMonitorCallbacks =
- new KeyguardUpdateMonitorCallback() {
- @Override
- public void onBootCompleted() {
- if (mPostBootCompletedRunnable != null) {
- mPostBootCompletedRunnable.run();
- mPostBootCompletedRunnable = null;
- }
- }
- @Override
- public void onUserSwitchComplete(int userId) {
- if (mKeyguardMultiUserSelectorView != null) {
- mKeyguardMultiUserSelectorView.finalizeActiveUserView(true);
- }
- }
- };
-
- private static final boolean isMusicPlaying(int playbackState) {
- // This should agree with the list in AudioService.isPlaystateActive()
- switch (playbackState) {
- case RemoteControlClient.PLAYSTATE_PLAYING:
- case RemoteControlClient.PLAYSTATE_BUFFERING:
- case RemoteControlClient.PLAYSTATE_FAST_FORWARDING:
- case RemoteControlClient.PLAYSTATE_REWINDING:
- case RemoteControlClient.PLAYSTATE_SKIPPING_BACKWARDS:
- case RemoteControlClient.PLAYSTATE_SKIPPING_FORWARDS:
- return true;
- default:
- return false;
- }
- }
-
- private SlidingChallengeLayout mSlidingChallengeLayout;
- private MultiPaneChallengeLayout mMultiPaneChallengeLayout;
-
@Override
- public boolean onTouchEvent(MotionEvent ev) {
- boolean result = super.onTouchEvent(ev);
- mTempRect.set(0, 0, 0, 0);
- offsetRectIntoDescendantCoords(getSecurityContainer(), mTempRect);
- ev.offsetLocation(mTempRect.left, mTempRect.top);
- result = getSecurityContainer().dispatchTouchEvent(ev) || result;
- ev.offsetLocation(-mTempRect.left, -mTempRect.top);
- return result;
+ protected void dispatchDraw(Canvas canvas) {
+ super.dispatchDraw(canvas);
+ if (mViewMediatorCallback != null) {
+ mViewMediatorCallback.keyguardDoneDrawing();
+ }
}
- private int getWidgetPosition(int id) {
- final KeyguardWidgetPager appWidgetContainer = mAppWidgetContainer;
- final int children = appWidgetContainer.getChildCount();
- for (int i = 0; i < children; i++) {
- final View content = appWidgetContainer.getWidgetPageAt(i).getContent();
- if (content != null && content.getId() == id) {
- return i;
- } else if (content == null) {
- // Attempt to track down bug #8886916
- Log.w(TAG, "*** Null content at " + "i=" + i + ",id=" + id + ",N=" + children);
- }
- }
- return -1;
+ /**
+ * Sets an action to run when keyguard finishes.
+ *
+ * @param action
+ */
+ public void setOnDismissAction(OnDismissAction action) {
+ mDismissAction = action;
}
@Override
protected void onFinishInflate() {
- super.onFinishInflate();
-
- // Grab instances of and make any necessary changes to the main layouts. Create
- // view state manager and wire up necessary listeners / callbacks.
- View deleteDropTarget = findViewById(R.id.keyguard_widget_pager_delete_target);
- mAppWidgetContainer = (KeyguardWidgetPager) findViewById(R.id.app_widget_container);
- mAppWidgetContainer.setVisibility(VISIBLE);
- mAppWidgetContainer.setCallbacks(mWidgetCallbacks);
- mAppWidgetContainer.setDeleteDropTarget(deleteDropTarget);
- mAppWidgetContainer.setMinScale(0.5f);
-
- mSlidingChallengeLayout = (SlidingChallengeLayout) findViewById(R.id.sliding_layout);
- if (mSlidingChallengeLayout != null) {
- mSlidingChallengeLayout.setOnChallengeScrolledListener(mViewStateManager);
- }
- mAppWidgetContainer.setViewStateManager(mViewStateManager);
- mAppWidgetContainer.setLockPatternUtils(mLockPatternUtils);
-
- mMultiPaneChallengeLayout =
- (MultiPaneChallengeLayout) findViewById(R.id.multi_pane_challenge);
- ChallengeLayout challenge = mSlidingChallengeLayout != null ? mSlidingChallengeLayout :
- mMultiPaneChallengeLayout;
- challenge.setOnBouncerStateChangedListener(mViewStateManager);
- mAppWidgetContainer.setBouncerAnimationDuration(challenge.getBouncerAnimationDuration());
- mViewStateManager.setPagedView(mAppWidgetContainer);
- mViewStateManager.setChallengeLayout(challenge);
-
- mViewStateManager.setSecurityViewContainer(getSecurityContainer());
-
- if (KeyguardUpdateMonitor.getInstance(mContext).hasBootCompleted()) {
- updateAndAddWidgets();
- } else {
- // We can't add widgets until after boot completes because AppWidgetHost may try
- // to contact the providers. Do it later.
- mPostBootCompletedRunnable = new Runnable() {
- @Override
- public void run() {
- updateAndAddWidgets();
- }
- };
- }
-
- getSecurityContainer().updateSecurityViews(mViewStateManager.isBouncing());
- enableUserSelectorIfNecessary();
+ mSecurityContainer =
+ (KeyguardSecurityContainer) findViewById(R.id.keyguard_security_container);
+ mLockPatternUtils = new LockPatternUtils(mContext);
+ mSecurityContainer.setLockPatternUtils(mLockPatternUtils);
+ mSecurityContainer.setSecurityCallback(this);
+ mSecurityContainer.showPrimarySecurityScreen(false);
+ // mSecurityContainer.updateSecurityViews(false /* not bouncing */);
}
- private void updateAndAddWidgets() {
- cleanupAppWidgetIds();
- addDefaultWidgets();
- addWidgetsFromSettings();
- maybeEnableAddButton();
- checkAppWidgetConsistency();
-
- // Don't let the user drag the challenge down if widgets are disabled.
- if (mSlidingChallengeLayout != null) {
- mSlidingChallengeLayout.setEnableChallengeDragging(!widgetsDisabled());
- }
-
- // Select the appropriate page
- mSwitchPageRunnable.run();
-
- // This needs to be called after the pages are all added.
- mViewStateManager.showUsabilityHints();
+ /**
+ * Called when the view needs to be shown.
+ */
+ public void showPrimarySecurityScreen() {
+ if (DEBUG) Log.d(TAG, "show()");
+ mSecurityContainer.showPrimarySecurityScreen(false);
}
- private void maybeEnableAddButton() {
- if (!shouldEnableAddWidget()) {
- mAppWidgetContainer.setAddWidgetEnabled(false);
- }
+ /**
+ * Dismisses the keyguard by going to the next screen or making it gone.
+ *
+ * @return True if the keyguard is done.
+ */
+ public boolean dismiss() {
+ return dismiss(false);
}
- private boolean shouldEnableAddWidget() {
- return numWidgets() < MAX_WIDGETS && mUserSetupCompleted;
+ public boolean handleBackKey() {
+ if (mSecurityContainer.getCurrentSecuritySelection() != SecurityMode.None) {
+ mSecurityContainer.dismiss(false);
+ return true;
+ }
+ return false;
+ }
+
+ protected KeyguardSecurityContainer getSecurityContainer() {
+ return mSecurityContainer;
}
@Override
public boolean dismiss(boolean authenticated) {
- boolean finished = super.dismiss(authenticated);
- if (!finished) {
- mViewStateManager.showBouncer(true);
+ return mSecurityContainer.showNextSecurityScreenOrFinish(authenticated);
+ }
- // Enter full screen mode if we're in SIM or Account screen
- SecurityMode securityMode = getSecurityContainer().getSecurityMode();
- boolean isFullScreen = getResources().getBoolean(R.bool.kg_sim_puk_account_full_screen);
- boolean isSimOrAccount = securityMode == SecurityMode.SimPin
- || securityMode == SecurityMode.SimPuk
- || securityMode == SecurityMode.Account;
- mAppWidgetContainer.setVisibility(
- isSimOrAccount && isFullScreen ? View.GONE : View.VISIBLE);
+ /**
+ * Authentication has happened and it's time to dismiss keyguard. This function
+ * should clean up and inform KeyguardViewMediator.
+ */
+ @Override
+ public void finish() {
+ // If the alternate unlock was suppressed, it can now be safely
+ // enabled because the user has left keyguard.
+ KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true);
- // Don't show camera or search in navbar when SIM or Account screen is showing
- setSystemUiVisibility(isSimOrAccount ?
- (getSystemUiVisibility() | View.STATUS_BAR_DISABLE_SEARCH)
- : (getSystemUiVisibility() & ~View.STATUS_BAR_DISABLE_SEARCH));
-
- if (mSlidingChallengeLayout != null) {
- mSlidingChallengeLayout.setChallengeInteractive(!isFullScreen);
+ // If there's a pending runnable because the user interacted with a widget
+ // and we're leaving keyguard, then run it.
+ boolean deferKeyguardDone = false;
+ if (mDismissAction != null) {
+ deferKeyguardDone = mDismissAction.onDismiss();
+ mDismissAction = null;
+ }
+ if (mViewMediatorCallback != null) {
+ if (deferKeyguardDone) {
+ mViewMediatorCallback.keyguardDonePending();
+ } else {
+ mViewMediatorCallback.keyguardDone(true);
}
}
- return finished;
- }
-
- private int getDisabledFeatures(DevicePolicyManager dpm) {
- int disabledFeatures = DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_NONE;
- if (dpm != null) {
- final int currentUser = mLockPatternUtils.getCurrentUser();
- disabledFeatures = dpm.getKeyguardDisabledFeatures(null, currentUser);
- }
- return disabledFeatures;
- }
-
- private boolean widgetsDisabled() {
- boolean disabledByLowRamDevice = ActivityManager.isLowRamDeviceStatic();
- boolean disabledByDpm =
- (mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_WIDGETS_ALL) != 0;
- boolean disabledByUser = !mLockPatternUtils.getWidgetsEnabled();
- return disabledByLowRamDevice || disabledByDpm || disabledByUser;
- }
-
- private boolean cameraDisabledByDpm() {
- return mCameraDisabled
- || (mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0;
}
@Override
- public void setLockPatternUtils(LockPatternUtils utils) {
- super.setLockPatternUtils(utils);
- getSecurityContainer().updateSecurityViews(mViewStateManager.isBouncing());
- }
-
- @Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
- mAppWidgetHost.startListening();
- KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallbacks);
- }
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- mAppWidgetHost.stopListening();
- KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallbacks);
- }
-
- void addWidget(AppWidgetHostView view, int pageIndex) {
- mAppWidgetContainer.addWidget(view, pageIndex);
- }
-
- private KeyguardWidgetPager.Callbacks mWidgetCallbacks
- = new KeyguardWidgetPager.Callbacks() {
- @Override
- public void userActivity() {
- KeyguardHostView.this.userActivity();
- }
-
- @Override
- public void onUserActivityTimeoutChanged() {
- KeyguardHostView.this.onUserActivityTimeoutChanged();
- }
-
- @Override
- public void onAddView(View v) {
- if (!shouldEnableAddWidget()) {
- mAppWidgetContainer.setAddWidgetEnabled(false);
- }
- }
-
- @Override
- public void onRemoveView(View v, boolean deletePermanently) {
- if (deletePermanently) {
- final int appWidgetId = ((KeyguardWidgetFrame) v).getContentAppWidgetId();
- if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID &&
- appWidgetId != LockPatternUtils.ID_DEFAULT_STATUS_WIDGET) {
- mAppWidgetHost.deleteAppWidgetId(appWidgetId);
- }
- }
- }
-
- @Override
- public void onRemoveViewAnimationCompleted() {
- if (shouldEnableAddWidget()) {
- mAppWidgetContainer.setAddWidgetEnabled(true);
- }
- }
- };
-
- @Override
- public void onUserSwitching(boolean switching) {
- if (!switching && mKeyguardMultiUserSelectorView != null) {
- mKeyguardMultiUserSelectorView.finalizeActiveUserView(false);
+ public void onSecurityModeChanged(SecurityMode securityMode, boolean needsInput) {
+ if (mViewMediatorCallback != null) {
+ mViewMediatorCallback.setNeedsInput(needsInput);
}
}
@@ -483,631 +201,228 @@
}
}
- public void onUserActivityTimeoutChanged() {
- if (mViewMediatorCallback != null) {
- mViewMediatorCallback.onUserActivityTimeoutChanged();
+ /**
+ * Called when the Keyguard is not actively shown anymore on the screen.
+ */
+ public void onPause() {
+ if (DEBUG) Log.d(TAG, String.format("screen off, instance %s at %s",
+ Integer.toHexString(hashCode()), SystemClock.uptimeMillis()));
+ // Once the screen turns off, we no longer consider this to be first boot and we want the
+ // biometric unlock to start next time keyguard is shown.
+ KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true);
+ mSecurityContainer.showPrimarySecurityScreen(true);
+ mSecurityContainer.onPause();
+ clearFocus();
+ }
+
+ /**
+ * Called when the Keyguard is actively shown on the screen.
+ */
+ public void onResume() {
+ if (DEBUG) Log.d(TAG, "screen on, instance " + Integer.toHexString(hashCode()));
+ mSecurityContainer.onResume(KeyguardSecurityView.SCREEN_ON);
+ requestFocus();
+ }
+
+ /**
+ * Starts the animation when the Keyguard gets shown.
+ */
+ public void startAppearAnimation() {
+ mSecurityContainer.startAppearAnimation();
+ }
+
+ public void startDisappearAnimation(Runnable finishRunnable) {
+ if (!mSecurityContainer.startDisappearAnimation(finishRunnable) && finishRunnable != null) {
+ finishRunnable.run();
}
}
+ /**
+ * Verify that the user can get past the keyguard securely. This is called,
+ * for example, when the phone disables the keyguard but then wants to launch
+ * something else that requires secure access.
+ *
+ * The result will be propogated back via {@link KeyguardViewCallback#keyguardDone(boolean)}
+ */
+ public void verifyUnlock() {
+ SecurityMode securityMode = mSecurityContainer.getSecurityMode();
+ if (securityMode == KeyguardSecurityModel.SecurityMode.None) {
+ if (mViewMediatorCallback != null) {
+ mViewMediatorCallback.keyguardDone(true);
+ }
+ } else if (securityMode != KeyguardSecurityModel.SecurityMode.Pattern
+ && securityMode != KeyguardSecurityModel.SecurityMode.PIN
+ && securityMode != KeyguardSecurityModel.SecurityMode.Password) {
+ // can only verify unlock when in pattern/password mode
+ if (mViewMediatorCallback != null) {
+ mViewMediatorCallback.keyguardDone(false);
+ }
+ } else {
+ // otherwise, go to the unlock screen, see if they can verify it
+ mSecurityContainer.verifyUnlock();
+ }
+ }
+
+ /**
+ * Called before this view is being removed.
+ */
+ public void cleanUp() {
+ getSecurityContainer().onPause();
+ }
+
@Override
- public long getUserActivityTimeout() {
- // Currently only considering user activity timeouts needed by widgets.
- // Could also take into account longer timeouts for certain security views.
- if (mAppWidgetContainer != null) {
- return mAppWidgetContainer.getUserActivityTimeout();
+ public boolean dispatchKeyEvent(KeyEvent event) {
+ if (interceptMediaKey(event)) {
+ return true;
}
- return -1;
+ return super.dispatchKeyEvent(event);
}
- private static class MyOnClickHandler extends OnClickHandler {
+ /**
+ * Allows the media keys to work when the keyguard is showing.
+ * The media keys should be of no interest to the actual keyguard view(s),
+ * so intercepting them here should not be of any harm.
+ * @param event The key event
+ * @return whether the event was consumed as a media key.
+ */
+ public boolean interceptMediaKey(KeyEvent event) {
+ final int keyCode = event.getKeyCode();
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_MEDIA_PLAY:
+ case KeyEvent.KEYCODE_MEDIA_PAUSE:
+ case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
+ /* Suppress PLAY/PAUSE toggle when phone is ringing or
+ * in-call to avoid music playback */
+ if (mTelephonyManager == null) {
+ mTelephonyManager = (TelephonyManager) getContext().getSystemService(
+ Context.TELEPHONY_SERVICE);
+ }
+ if (mTelephonyManager != null &&
+ mTelephonyManager.getCallState() != TelephonyManager.CALL_STATE_IDLE) {
+ return true; // suppress key event
+ }
+ case KeyEvent.KEYCODE_MUTE:
+ case KeyEvent.KEYCODE_HEADSETHOOK:
+ case KeyEvent.KEYCODE_MEDIA_STOP:
+ case KeyEvent.KEYCODE_MEDIA_NEXT:
+ case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
+ case KeyEvent.KEYCODE_MEDIA_REWIND:
+ case KeyEvent.KEYCODE_MEDIA_RECORD:
+ case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
+ case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK: {
+ handleMediaKeyEvent(event);
+ return true;
+ }
- // weak reference to the hostView to avoid keeping a live reference
- // due to Binder GC linkages to AppWidgetHost. By the same token,
- // this click handler should not keep references to any large
- // objects.
- WeakReference<KeyguardHostView> mKeyguardHostView;
-
- MyOnClickHandler(KeyguardHostView hostView) {
- mKeyguardHostView = new WeakReference<KeyguardHostView>(hostView);
- }
-
- @Override
- public boolean onClickHandler(final View view,
- final android.app.PendingIntent pendingIntent,
- final Intent fillInIntent) {
- KeyguardHostView hostView = mKeyguardHostView.get();
- if (hostView == null) {
- return false;
- }
- if (pendingIntent.isActivity()) {
- hostView.setOnDismissAction(new OnDismissAction() {
- public boolean onDismiss() {
- try {
- // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT?
- Context context = view.getContext();
- ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(view,
- 0, 0,
- view.getMeasuredWidth(), view.getMeasuredHeight());
- context.startIntentSender(
- pendingIntent.getIntentSender(), fillInIntent,
- Intent.FLAG_ACTIVITY_NEW_TASK,
- Intent.FLAG_ACTIVITY_NEW_TASK, 0, opts.toBundle());
- } catch (IntentSender.SendIntentException e) {
- android.util.Log.e(TAG, "Cannot send pending intent: ", e);
- } catch (Exception e) {
- android.util.Log.e(TAG, "Cannot send pending intent due to " +
- "unknown exception: ", e);
+ case KeyEvent.KEYCODE_VOLUME_UP:
+ case KeyEvent.KEYCODE_VOLUME_DOWN:
+ case KeyEvent.KEYCODE_VOLUME_MUTE: {
+ if (KEYGUARD_MANAGES_VOLUME) {
+ synchronized (this) {
+ if (mAudioManager == null) {
+ mAudioManager = (AudioManager) getContext().getSystemService(
+ Context.AUDIO_SERVICE);
+ }
}
+ // Volume buttons should only function for music (local or remote).
+ // TODO: Actually handle MUTE.
+ mAudioManager.adjustSuggestedStreamVolume(
+ keyCode == KeyEvent.KEYCODE_VOLUME_UP
+ ? AudioManager.ADJUST_RAISE
+ : AudioManager.ADJUST_LOWER /* direction */,
+ AudioManager.STREAM_MUSIC /* stream */, 0 /* flags */);
+ // Don't execute default volume behavior
+ return true;
+ } else {
return false;
}
- });
-
- if (hostView.mViewStateManager.isChallengeShowing()) {
- hostView.mViewStateManager.showBouncer(true);
- } else {
- hostView.dismiss();
- }
- return true;
- } else {
- return super.onClickHandler(view, pendingIntent, fillInIntent);
- }
- };
- };
-
- @Override
- public void onResume() {
- super.onResume();
- if (mViewStateManager != null) {
- mViewStateManager.showUsabilityHints();
- }
- }
-
- @Override
- public void onPause() {
- super.onPause();
- // We use mAppWidgetToShow to show a particular widget after you add it-- once the screen
- // turns off we reset that behavior
- clearAppWidgetToShow();
- if (KeyguardUpdateMonitor.getInstance(mContext).hasBootCompleted()) {
- checkAppWidgetConsistency();
- }
- CameraWidgetFrame cameraPage = findCameraPage();
- if (cameraPage != null) {
- cameraPage.onScreenTurnedOff();
- }
- }
-
- public void clearAppWidgetToShow() {
- mAppWidgetToShow = AppWidgetManager.INVALID_APPWIDGET_ID;
- }
-
- private boolean addWidget(int appId, int pageIndex, boolean updateDbIfFailed) {
- AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appId);
- if (appWidgetInfo != null) {
- AppWidgetHostView view = mAppWidgetHost.createView(mContext, appId, appWidgetInfo);
- addWidget(view, pageIndex);
- return true;
- } else {
- if (updateDbIfFailed) {
- Log.w(TAG, "*** AppWidgetInfo for app widget id " + appId + " was null for user"
- + mUserId + ", deleting");
- mAppWidgetHost.deleteAppWidgetId(appId);
- mLockPatternUtils.removeAppWidget(appId);
- }
- return false;
- }
- }
-
- private final CameraWidgetFrame.Callbacks mCameraWidgetCallbacks =
- new CameraWidgetFrame.Callbacks() {
- @Override
- public void onLaunchingCamera() {
- setSliderHandleAlpha(0);
- }
-
- @Override
- public void onCameraLaunchedSuccessfully() {
- if (mAppWidgetContainer.isCameraPage(mAppWidgetContainer.getCurrentPage())) {
- mAppWidgetContainer.scrollLeft();
- }
- setSliderHandleAlpha(1);
- mShowSecurityWhenReturn = true;
- }
-
- @Override
- public void onCameraLaunchedUnsuccessfully() {
- setSliderHandleAlpha(1);
- }
-
- private void setSliderHandleAlpha(float alpha) {
- SlidingChallengeLayout slider =
- (SlidingChallengeLayout) findViewById(R.id.sliding_layout);
- if (slider != null) {
- slider.setHandleAlpha(alpha);
}
}
- };
-
- private int numWidgets() {
- final int childCount = mAppWidgetContainer.getChildCount();
- int widgetCount = 0;
- for (int i = 0; i < childCount; i++) {
- if (mAppWidgetContainer.isWidgetPage(i)) {
- widgetCount++;
- }
- }
- return widgetCount;
- }
-
- private void addDefaultWidgets() {
- if (!mSafeModeEnabled && !widgetsDisabled()) {
- LayoutInflater inflater = LayoutInflater.from(mContext);
- View addWidget = inflater.inflate(R.layout.keyguard_add_widget, this, false);
- mAppWidgetContainer.addWidget(addWidget, 0);
- View addWidgetButton = addWidget.findViewById(R.id.keyguard_add_widget_view);
- addWidgetButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // Pass in an invalid widget id... the picker will allocate an ID for us
- getActivityLauncher().launchWidgetPicker(AppWidgetManager.INVALID_APPWIDGET_ID);
- }
- });
- }
-
- // We currently disable cameras in safe mode because we support loading 3rd party
- // cameras we can't trust. TODO: plumb safe mode into camera creation code and only
- // inflate system-provided camera?
- if (!mSafeModeEnabled && !cameraDisabledByDpm() && mUserSetupCompleted
- && mContext.getResources().getBoolean(R.bool.kg_enable_camera_default_widget)) {
- View cameraWidget = CameraWidgetFrame.create(mContext, mCameraWidgetCallbacks,
- getActivityLauncher());
- if (cameraWidget != null) {
- mAppWidgetContainer.addWidget(cameraWidget);
- }
- }
- }
-
- /**
- * Create KeyguardTransportControlView on demand.
- * @return
- */
- private KeyguardTransportControlView getOrCreateTransportControl() {
- if (mTransportControl == null) {
- LayoutInflater inflater = LayoutInflater.from(mContext);
- mTransportControl = (KeyguardTransportControlView)
- inflater.inflate(R.layout.keyguard_transport_control_view, this, false);
- mTransportControl.setTransportControlCallback(new TransportControlCallback() {
- public void userActivity() {
- mViewMediatorCallback.userActivity();
- }
- });
- }
- return mTransportControl;
- }
-
- private int getInsertPageIndex() {
- View addWidget = mAppWidgetContainer.findViewById(R.id.keyguard_add_widget);
- int insertionIndex = mAppWidgetContainer.indexOfChild(addWidget);
- if (insertionIndex < 0) {
- insertionIndex = 0; // no add widget page found
- } else {
- insertionIndex++; // place after add widget
- }
- return insertionIndex;
- }
-
- private void addDefaultStatusWidget(int index) {
- LayoutInflater inflater = LayoutInflater.from(mContext);
- View statusWidget = inflater.inflate(R.layout.keyguard_status_view, null, true);
- mAppWidgetContainer.addWidget(statusWidget, index);
- }
-
- private void addWidgetsFromSettings() {
- if (mSafeModeEnabled || widgetsDisabled()) {
- addDefaultStatusWidget(0);
- return;
- }
-
- int insertionIndex = getInsertPageIndex();
-
- // Add user-selected widget
- final int[] widgets = mLockPatternUtils.getAppWidgets();
-
- if (widgets == null) {
- Log.d(TAG, "Problem reading widgets");
- } else {
- for (int i = widgets.length -1; i >= 0; i--) {
- if (widgets[i] == LockPatternUtils.ID_DEFAULT_STATUS_WIDGET) {
- addDefaultStatusWidget(insertionIndex);
- } else {
- // We add the widgets from left to right, starting after the first page after
- // the add page. We count down, since the order will be persisted from right
- // to left, starting after camera.
- addWidget(widgets[i], insertionIndex, true);
+ } else if (event.getAction() == KeyEvent.ACTION_UP) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_MUTE:
+ case KeyEvent.KEYCODE_HEADSETHOOK:
+ case KeyEvent.KEYCODE_MEDIA_PLAY:
+ case KeyEvent.KEYCODE_MEDIA_PAUSE:
+ case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
+ case KeyEvent.KEYCODE_MEDIA_STOP:
+ case KeyEvent.KEYCODE_MEDIA_NEXT:
+ case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
+ case KeyEvent.KEYCODE_MEDIA_REWIND:
+ case KeyEvent.KEYCODE_MEDIA_RECORD:
+ case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
+ case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK: {
+ handleMediaKeyEvent(event);
+ return true;
}
}
}
- }
-
- private int allocateIdForDefaultAppWidget() {
- int appWidgetId;
- Resources res = getContext().getResources();
- ComponentName defaultAppWidget = new ComponentName(
- res.getString(R.string.widget_default_package_name),
- res.getString(R.string.widget_default_class_name));
-
- // Note: we don't support configuring the widget
- appWidgetId = mAppWidgetHost.allocateAppWidgetId();
-
- try {
- mAppWidgetManager.bindAppWidgetId(appWidgetId, defaultAppWidget);
- } catch (IllegalArgumentException e) {
- Log.e(TAG, "Error when trying to bind default AppWidget: " + e);
- mAppWidgetHost.deleteAppWidgetId(appWidgetId);
- appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
- }
- return appWidgetId;
- }
-
- public void checkAppWidgetConsistency() {
- final int childCount = mAppWidgetContainer.getChildCount();
- boolean widgetPageExists = false;
- for (int i = 0; i < childCount; i++) {
- if (mAppWidgetContainer.isWidgetPage(i)) {
- widgetPageExists = true;
- break;
- }
- }
- if (!widgetPageExists) {
- final int insertPageIndex = getInsertPageIndex();
-
- final boolean userAddedWidgetsEnabled = !widgetsDisabled();
-
- boolean addedDefaultAppWidget = false;
-
- if (!mSafeModeEnabled) {
- if (userAddedWidgetsEnabled) {
- int appWidgetId = allocateIdForDefaultAppWidget();
- if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
- addedDefaultAppWidget = addWidget(appWidgetId, insertPageIndex, true);
- }
- } else {
- // note: even if widgetsDisabledByDpm() returns true, we still bind/create
- // the default appwidget if possible
- int appWidgetId = mLockPatternUtils.getFallbackAppWidgetId();
- if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
- appWidgetId = allocateIdForDefaultAppWidget();
- if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
- mLockPatternUtils.writeFallbackAppWidgetId(appWidgetId);
- }
- }
- if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
- addedDefaultAppWidget = addWidget(appWidgetId, insertPageIndex, false);
- if (!addedDefaultAppWidget) {
- mAppWidgetHost.deleteAppWidgetId(appWidgetId);
- mLockPatternUtils.writeFallbackAppWidgetId(
- AppWidgetManager.INVALID_APPWIDGET_ID);
- }
- }
- }
- }
-
- // Use the built-in status/clock view if we can't inflate the default widget
- if (!addedDefaultAppWidget) {
- addDefaultStatusWidget(insertPageIndex);
- }
-
- // trigger DB updates only if user-added widgets are enabled
- if (!mSafeModeEnabled && userAddedWidgetsEnabled) {
- mAppWidgetContainer.onAddView(
- mAppWidgetContainer.getChildAt(insertPageIndex), insertPageIndex);
- }
- }
- }
-
- private final Runnable mSwitchPageRunnable = new Runnable() {
- @Override
- public void run() {
- showAppropriateWidgetPage();
- }
- };
-
- static class SavedState extends BaseSavedState {
- int transportState;
- int appWidgetToShow = AppWidgetManager.INVALID_APPWIDGET_ID;
- Rect insets = new Rect();
-
- SavedState(Parcelable superState) {
- super(superState);
- }
-
- private SavedState(Parcel in) {
- super(in);
- this.transportState = in.readInt();
- this.appWidgetToShow = in.readInt();
- this.insets = in.readParcelable(null);
- }
-
- @Override
- public void writeToParcel(Parcel out, int flags) {
- super.writeToParcel(out, flags);
- out.writeInt(this.transportState);
- out.writeInt(this.appWidgetToShow);
- out.writeParcelable(insets, 0);
- }
-
- public static final Parcelable.Creator<SavedState> CREATOR
- = new Parcelable.Creator<SavedState>() {
- public SavedState createFromParcel(Parcel in) {
- return new SavedState(in);
- }
-
- public SavedState[] newArray(int size) {
- return new SavedState[size];
- }
- };
- }
-
- @Override
- public Parcelable onSaveInstanceState() {
- if (DEBUG) Log.d(TAG, "onSaveInstanceState, tstate=" + mTransportState);
- Parcelable superState = super.onSaveInstanceState();
- SavedState ss = new SavedState(superState);
- // If the transport is showing, force it to show it on restore.
- final boolean showing = mTransportControl != null
- && mAppWidgetContainer.getWidgetPageIndex(mTransportControl) >= 0;
- ss.transportState = showing ? TRANSPORT_VISIBLE : mTransportState;
- ss.appWidgetToShow = mAppWidgetToShow;
- ss.insets.set(mInsets);
- return ss;
- }
-
- @Override
- public void onRestoreInstanceState(Parcelable state) {
- if (!(state instanceof SavedState)) {
- super.onRestoreInstanceState(state);
- return;
- }
- SavedState ss = (SavedState) state;
- super.onRestoreInstanceState(ss.getSuperState());
- mTransportState = (ss.transportState);
- mAppWidgetToShow = ss.appWidgetToShow;
- setInsets(ss.insets);
- if (DEBUG) Log.d(TAG, "onRestoreInstanceState, transport=" + mTransportState);
- mSwitchPageRunnable.run();
- }
-
- @Override
- protected boolean fitSystemWindows(Rect insets) {
- setInsets(insets);
- return true;
- }
-
- private void setInsets(Rect insets) {
- mInsets.set(insets);
- if (mSlidingChallengeLayout != null) mSlidingChallengeLayout.setInsets(mInsets);
- if (mMultiPaneChallengeLayout != null) mMultiPaneChallengeLayout.setInsets(mInsets);
-
- final CameraWidgetFrame cameraWidget = findCameraPage();
- if (cameraWidget != null) cameraWidget.setInsets(mInsets);
- }
-
- @Override
- public void onWindowFocusChanged(boolean hasWindowFocus) {
- super.onWindowFocusChanged(hasWindowFocus);
- if (DEBUG) Log.d(TAG, "Window is " + (hasWindowFocus ? "focused" : "unfocused"));
- if (hasWindowFocus && mShowSecurityWhenReturn) {
- SlidingChallengeLayout slider =
- (SlidingChallengeLayout) findViewById(R.id.sliding_layout);
- if (slider != null) {
- slider.setHandleAlpha(1);
- slider.showChallenge(true);
- }
- mShowSecurityWhenReturn = false;
- }
- }
-
- private void showAppropriateWidgetPage() {
- final int state = mTransportState;
- final boolean transportAdded = ensureTransportPresentOrRemoved(state);
- final int pageToShow = getAppropriateWidgetPage(state);
- if (!transportAdded) {
- mAppWidgetContainer.setCurrentPage(pageToShow);
- } else if (state == TRANSPORT_VISIBLE) {
- // If the transport was just added, we need to wait for layout to happen before
- // we can set the current page.
- post(new Runnable() {
- @Override
- public void run() {
- mAppWidgetContainer.setCurrentPage(pageToShow);
- }
- });
- }
- }
-
- /**
- * Examines the current state and adds the transport to the widget pager when the state changes.
- *
- * Showing the initial transport and keeping it around is a bit tricky because the signals
- * coming from music players aren't always clear. Here's how the states are handled:
- *
- * {@link TRANSPORT_GONE} means we have no reason to show the transport - remove it if present.
- *
- * {@link TRANSPORT_INVISIBLE} means we have potential to show the transport because a music
- * player is registered but not currently playing music (or we don't know the state yet). The
- * code adds it conditionally on play state.
- *
- * {@link #TRANSPORT_VISIBLE} means a music player is active and transport should be showing.
- *
- * Once the transport is showing, we always show it until keyguard is dismissed. This state is
- * maintained by onSave/RestoreInstanceState(). This state is cleared in
- * {@link KeyguardViewManager#hide} when keyguard is dismissed, which causes the transport to be
- * gone when keyguard is restarted until we get an update with the current state.
- *
- * @param state
- */
- private boolean ensureTransportPresentOrRemoved(int state) {
- final boolean showing = getWidgetPosition(R.id.keyguard_transport_control) != -1;
- final boolean visible = state == TRANSPORT_VISIBLE;
- final boolean shouldBeVisible = state == TRANSPORT_INVISIBLE && isMusicPlaying(state);
- if (!showing && (visible || shouldBeVisible)) {
- // insert to left of camera if it exists, otherwise after right-most widget
- int lastWidget = mAppWidgetContainer.getChildCount() - 1;
- int position = 0; // handle no widget case
- if (lastWidget >= 0) {
- position = mAppWidgetContainer.isCameraPage(lastWidget) ?
- lastWidget : lastWidget + 1;
- }
- if (DEBUGXPORT) Log.v(TAG, "add transport at " + position);
- mAppWidgetContainer.addWidget(getOrCreateTransportControl(), position);
- return true;
- } else if (showing && state == TRANSPORT_GONE) {
- if (DEBUGXPORT) Log.v(TAG, "remove transport");
- mAppWidgetContainer.removeWidget(getOrCreateTransportControl());
- mTransportControl = null;
- KeyguardUpdateMonitor.getInstance(getContext()).dispatchSetBackground(null);
- }
return false;
}
- private CameraWidgetFrame findCameraPage() {
- for (int i = mAppWidgetContainer.getChildCount() - 1; i >= 0; i--) {
- if (mAppWidgetContainer.isCameraPage(i)) {
- return (CameraWidgetFrame) mAppWidgetContainer.getChildAt(i);
+ private void handleMediaKeyEvent(KeyEvent keyEvent) {
+ synchronized (this) {
+ if (mAudioManager == null) {
+ mAudioManager = (AudioManager) getContext().getSystemService(
+ Context.AUDIO_SERVICE);
}
}
- return null;
- }
-
- boolean isMusicPage(int pageIndex) {
- return pageIndex >= 0 && pageIndex == getWidgetPosition(R.id.keyguard_transport_control);
- }
-
- private int getAppropriateWidgetPage(int musicTransportState) {
- // assumes at least one widget (besides camera + add)
- if (mAppWidgetToShow != AppWidgetManager.INVALID_APPWIDGET_ID) {
- final int childCount = mAppWidgetContainer.getChildCount();
- for (int i = 0; i < childCount; i++) {
- if (mAppWidgetContainer.getWidgetPageAt(i).getContentAppWidgetId()
- == mAppWidgetToShow) {
- return i;
- }
- }
- mAppWidgetToShow = AppWidgetManager.INVALID_APPWIDGET_ID;
- }
- // if music playing, show transport
- if (musicTransportState == TRANSPORT_VISIBLE) {
- if (DEBUG) Log.d(TAG, "Music playing, show transport");
- return mAppWidgetContainer.getWidgetPageIndex(getOrCreateTransportControl());
- }
-
- // else show the right-most widget (except for camera)
- int rightMost = mAppWidgetContainer.getChildCount() - 1;
- if (mAppWidgetContainer.isCameraPage(rightMost)) {
- rightMost--;
- }
- if (DEBUG) Log.d(TAG, "Show right-most page " + rightMost);
- return rightMost;
- }
-
- private void enableUserSelectorIfNecessary() {
- final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
- if (um == null) {
- Throwable t = new Throwable();
- t.fillInStackTrace();
- Log.e(TAG, "user service is null.", t);
- return;
- }
-
- // if there are multiple users, we need to enable to multi-user switcher
- if (!um.isUserSwitcherEnabled()) {
- return;
- }
-
- final View multiUserView = findViewById(R.id.keyguard_user_selector);
- if (multiUserView == null) {
- if (DEBUG) Log.d(TAG, "can't find user_selector in layout.");
- return;
- }
-
- if (multiUserView instanceof KeyguardMultiUserSelectorView) {
- mKeyguardMultiUserSelectorView = (KeyguardMultiUserSelectorView) multiUserView;
- mKeyguardMultiUserSelectorView.setVisibility(View.VISIBLE);
- mKeyguardMultiUserSelectorView.addUsers(um.getUsers(true));
- UserSwitcherCallback callback = new UserSwitcherCallback() {
- @Override
- public void hideSecurityView(int duration) {
- getSecurityContainer().animate().alpha(0).setDuration(duration);
- }
-
- @Override
- public void showSecurityView() {
- getSecurityContainer().setAlpha(1.0f);
- }
-
- @Override
- public void showUnlockHint() {
- if (getSecurityContainer() != null) {
- getSecurityContainer().showUsabilityHint();
- }
- }
-
- @Override
- public void userActivity() {
- if (mViewMediatorCallback != null) {
- mViewMediatorCallback.userActivity();
- }
- }
- };
- mKeyguardMultiUserSelectorView.setCallback(callback);
- } else {
- Throwable t = new Throwable();
- t.fillInStackTrace();
- if (multiUserView == null) {
- Log.e(TAG, "could not find the user_selector.", t);
- } else {
- Log.e(TAG, "user_selector is the wrong type.", t);
- }
- }
+ mAudioManager.dispatchMediaKeyEvent(keyEvent);
}
@Override
- public void cleanUp() {
- // Make sure we let go of all widgets and their package contexts promptly. If we don't do
- // this, and the associated application is uninstalled, it can cause a soft reboot.
- int count = mAppWidgetContainer.getChildCount();
- for (int i = 0; i < count; i++) {
- KeyguardWidgetFrame frame = mAppWidgetContainer.getWidgetPageAt(i);
- frame.removeAllViews();
- }
- getSecurityContainer().onPause(); // clean up any actions in progress
- }
+ public void dispatchSystemUiVisibilityChanged(int visibility) {
+ super.dispatchSystemUiVisibilityChanged(visibility);
- public void goToWidget(int appWidgetId) {
- mAppWidgetToShow = appWidgetId;
- mSwitchPageRunnable.run();
- }
-
- @Override
- protected void showBouncer(boolean show) {
- super.showBouncer(show);
- mViewStateManager.showBouncer(show);
- }
-
- @Override
- public void onExternalMotionEvent(MotionEvent event) {
- mAppWidgetContainer.handleExternalCameraEvent(event);
- }
-
- @Override
- protected void onCreateOptions(Bundle options) {
- if (options != null) {
- int widgetToShow = options.getInt(LockPatternUtils.KEYGUARD_SHOW_APPWIDGET,
- AppWidgetManager.INVALID_APPWIDGET_ID);
- if (widgetToShow != AppWidgetManager.INVALID_APPWIDGET_ID) {
- goToWidget(widgetToShow);
- }
+ if (!(mContext instanceof Activity)) {
+ setSystemUiVisibility(STATUS_BAR_DISABLE_BACK);
}
}
+ /**
+ * In general, we enable unlocking the insecure keyguard with the menu key. However, there are
+ * some cases where we wish to disable it, notably when the menu button placement or technology
+ * is prone to false positives.
+ *
+ * @return true if the menu key should be enabled
+ */
+ private static final String ENABLE_MENU_KEY_FILE = "/data/local/enable_menu_key";
+ private boolean shouldEnableMenuKey() {
+ final Resources res = getResources();
+ final boolean configDisabled = res.getBoolean(R.bool.config_disableMenuKeyInLockScreen);
+ final boolean isTestHarness = ActivityManager.isRunningInTestHarness();
+ final boolean fileOverride = (new File(ENABLE_MENU_KEY_FILE)).exists();
+ return !configDisabled || isTestHarness || fileOverride;
+ }
+
+ public boolean handleMenuKey() {
+ // The following enables the MENU key to work for testing automation
+ if (shouldEnableMenuKey()) {
+ dismiss();
+ return true;
+ }
+ return false;
+ }
+
+ public void setViewMediatorCallback(ViewMediatorCallback viewMediatorCallback) {
+ mViewMediatorCallback = viewMediatorCallback;
+ // Update ViewMediator with the current input method requirements
+ mViewMediatorCallback.setNeedsInput(mSecurityContainer.needsInput());
+ }
+
+ public void setLockPatternUtils(LockPatternUtils utils) {
+ mLockPatternUtils = utils;
+ mSecurityContainer.setLockPatternUtils(utils);
+ }
+
+ public SecurityMode getSecurityMode() {
+ return mSecurityContainer.getSecurityMode();
+ }
+
+ public SecurityMode getCurrentSecurityMode() {
+ return mSecurityContainer.getCurrentSecurityMode();
+ }
+
+
}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardLinearLayout.java b/packages/Keyguard/src/com/android/keyguard/KeyguardLinearLayout.java
deleted file mode 100644
index 343fdcb..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardLinearLayout.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.keyguard;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.LinearLayout;
-
-/**
- * A layout that arranges its children into a special type of grid.
- */
-public class KeyguardLinearLayout extends LinearLayout {
- int mTopChild = 0;
-
- public KeyguardLinearLayout(Context context) {
- this(context, null, 0);
- }
-
- public KeyguardLinearLayout(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public KeyguardLinearLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- public void setTopChild(View child) {
- int top = indexOfChild(child);
- mTopChild = top;
- invalidate();
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardMultiUserAvatar.java b/packages/Keyguard/src/com/android/keyguard/KeyguardMultiUserAvatar.java
deleted file mode 100644
index 3aec55c..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardMultiUserAvatar.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator.AnimatorUpdateListener;
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.content.pm.UserInfo;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Color;
-import android.os.UserManager;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-class KeyguardMultiUserAvatar extends FrameLayout {
- private static final String TAG = KeyguardMultiUserAvatar.class.getSimpleName();
- private static final boolean DEBUG = KeyguardConstants.DEBUG;
-
- private ImageView mUserImage;
- private TextView mUserName;
- private UserInfo mUserInfo;
- private static final float ACTIVE_ALPHA = 1.0f;
- private static final float INACTIVE_ALPHA = 1.0f;
- private static final float ACTIVE_SCALE = 1.5f;
- private static final float ACTIVE_TEXT_ALPHA = 0f;
- private static final float INACTIVE_TEXT_ALPHA = 0.5f;
- private static final int SWITCH_ANIMATION_DURATION = 150;
-
- private final float mActiveAlpha;
- private final float mActiveScale;
- private final float mActiveTextAlpha;
- private final float mInactiveAlpha;
- private final float mInactiveTextAlpha;
- private final float mShadowRadius;
- private final float mStroke;
- private final float mIconSize;
- private final int mFrameColor;
- private final int mFrameShadowColor;
- private final int mTextColor;
- private final int mHighlightColor;
-
- private boolean mTouched;
-
- private boolean mActive;
- private boolean mInit = true;
- private KeyguardMultiUserSelectorView mUserSelector;
- private KeyguardCircleFramedDrawable mFramed;
- private boolean mPressLock;
- private UserManager mUserManager;
-
- public static KeyguardMultiUserAvatar fromXml(int resId, Context context,
- KeyguardMultiUserSelectorView userSelector, UserInfo info) {
- KeyguardMultiUserAvatar icon = (KeyguardMultiUserAvatar)
- LayoutInflater.from(context).inflate(resId, userSelector, false);
-
- icon.init(info, userSelector);
- return icon;
- }
-
- public KeyguardMultiUserAvatar(Context context) {
- this(context, null, 0);
- }
-
- public KeyguardMultiUserAvatar(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public KeyguardMultiUserAvatar(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- Resources res = mContext.getResources();
- mTextColor = res.getColor(R.color.keyguard_avatar_nick_color);
- mIconSize = res.getDimension(R.dimen.keyguard_avatar_size);
- mStroke = res.getDimension(R.dimen.keyguard_avatar_frame_stroke_width);
- mShadowRadius = res.getDimension(R.dimen.keyguard_avatar_frame_shadow_radius);
- mFrameColor = res.getColor(R.color.keyguard_avatar_frame_color);
- mFrameShadowColor = res.getColor(R.color.keyguard_avatar_frame_shadow_color);
- mHighlightColor = res.getColor(R.color.keyguard_avatar_frame_pressed_color);
- mActiveTextAlpha = ACTIVE_TEXT_ALPHA;
- mInactiveTextAlpha = INACTIVE_TEXT_ALPHA;
- mActiveScale = ACTIVE_SCALE;
- mActiveAlpha = ACTIVE_ALPHA;
- mInactiveAlpha = INACTIVE_ALPHA;
- mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
-
- mTouched = false;
-
- setLayerType(View.LAYER_TYPE_SOFTWARE, null);
- }
-
- protected String rewriteIconPath(String path) {
- return path;
- }
-
- public void init(UserInfo user, KeyguardMultiUserSelectorView userSelector) {
- mUserInfo = user;
- mUserSelector = userSelector;
-
- mUserImage = (ImageView) findViewById(R.id.keyguard_user_avatar);
- mUserName = (TextView) findViewById(R.id.keyguard_user_name);
-
- mFramed = (KeyguardCircleFramedDrawable)
- MultiUserAvatarCache.getInstance().get(user.id);
-
- // If we can't find it or the params don't match, create the drawable again
- if (mFramed == null
- || !mFramed.verifyParams(mIconSize, mFrameColor, mStroke, mFrameShadowColor,
- mShadowRadius, mHighlightColor)) {
- Bitmap icon = null;
- try {
- icon = mUserManager.getUserIcon(user.id);
- } catch (Exception e) {
- if (DEBUG) Log.d(TAG, "failed to get profile icon " + user, e);
- }
-
- if (icon == null) {
- icon = BitmapFactory.decodeResource(mContext.getResources(),
- com.android.internal.R.drawable.ic_contact_picture);
- }
-
- mFramed = new KeyguardCircleFramedDrawable(icon, (int) mIconSize, mFrameColor, mStroke,
- mFrameShadowColor, mShadowRadius, mHighlightColor);
- MultiUserAvatarCache.getInstance().put(user.id, mFramed);
- }
-
- mFramed.reset();
-
- mUserImage.setImageDrawable(mFramed);
- mUserName.setText(mUserInfo.name);
- setOnClickListener(mUserSelector);
- mInit = false;
- }
-
- public void setActive(boolean active, boolean animate, final Runnable onComplete) {
- if (mActive != active || mInit) {
- mActive = active;
-
- if (active) {
- KeyguardLinearLayout parent = (KeyguardLinearLayout) getParent();
- parent.setTopChild(this);
- // TODO: Create an appropriate asset when string changes are possible.
- setContentDescription(mUserName.getText()
- + ". " + mContext.getString(R.string.user_switched, ""));
- } else {
- setContentDescription(mUserName.getText());
- }
- }
- updateVisualsForActive(mActive, animate, SWITCH_ANIMATION_DURATION, onComplete);
- }
-
- void updateVisualsForActive(boolean active, boolean animate, int duration,
- final Runnable onComplete) {
- final float finalAlpha = active ? mActiveAlpha : mInactiveAlpha;
- final float initAlpha = active ? mInactiveAlpha : mActiveAlpha;
- final float finalScale = active ? 1f : 1f / mActiveScale;
- final float initScale = mFramed.getScale();
- final int finalTextAlpha = active ? (int) (mActiveTextAlpha * 255) :
- (int) (mInactiveTextAlpha * 255);
- final int initTextAlpha = active ? (int) (mInactiveTextAlpha * 255) :
- (int) (mActiveTextAlpha * 255);
- int textColor = mTextColor;
- mUserName.setTextColor(textColor);
-
- if (animate && mTouched) {
- ValueAnimator va = ValueAnimator.ofFloat(0f, 1f);
- va.addUpdateListener(new AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- float r = animation.getAnimatedFraction();
- float scale = (1 - r) * initScale + r * finalScale;
- float alpha = (1 - r) * initAlpha + r * finalAlpha;
- int textAlpha = (int) ((1 - r) * initTextAlpha + r * finalTextAlpha);
- mFramed.setScale(scale);
- mUserImage.setAlpha(alpha);
- mUserName.setTextColor(Color.argb(textAlpha, 255, 255, 255));
- mUserImage.invalidate();
- }
- });
- va.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- if (onComplete != null) {
- onComplete.run();
- }
- }
- });
- va.setDuration(duration);
- va.start();
- } else {
- mFramed.setScale(finalScale);
- mUserImage.setAlpha(finalAlpha);
- mUserName.setTextColor(Color.argb(finalTextAlpha, 255, 255, 255));
- if (onComplete != null) {
- post(onComplete);
- }
- }
-
- mTouched = true;
- }
-
- @Override
- public void setPressed(boolean pressed) {
- if (mPressLock && !pressed) {
- return;
- }
-
- if (mPressLock || !pressed || isClickable()) {
- super.setPressed(pressed);
- mFramed.setPressed(pressed);
- mUserImage.invalidate();
- }
- }
-
- public void lockPressed(boolean pressed) {
- mPressLock = pressed;
- setPressed(pressed);
- }
-
- public UserInfo getUserInfo() {
- return mUserInfo;
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardMultiUserSelectorView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardMultiUserSelectorView.java
deleted file mode 100644
index 06815e1..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardMultiUserSelectorView.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-import android.app.ActivityManagerNative;
-import android.content.Context;
-import android.content.pm.UserInfo;
-import android.os.RemoteException;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-
-public class KeyguardMultiUserSelectorView extends FrameLayout implements View.OnClickListener {
- private static final String TAG = "KeyguardMultiUserSelectorView";
-
- private ViewGroup mUsersGrid;
- private KeyguardMultiUserAvatar mActiveUserAvatar;
- private KeyguardHostView.UserSwitcherCallback mCallback;
- private static final int FADE_OUT_ANIMATION_DURATION = 100;
-
- public KeyguardMultiUserSelectorView(Context context) {
- this(context, null, 0);
- }
-
- public KeyguardMultiUserSelectorView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public KeyguardMultiUserSelectorView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- protected void onFinishInflate () {
- mUsersGrid = (ViewGroup) findViewById(R.id.keyguard_users_grid);
- mUsersGrid.removeAllViews();
- setClipChildren(false);
- setClipToPadding(false);
-
- }
-
- public void setCallback(KeyguardHostView.UserSwitcherCallback callback) {
- mCallback = callback;
- }
-
- public void addUsers(Collection<UserInfo> userList) {
- UserInfo activeUser;
- try {
- activeUser = ActivityManagerNative.getDefault().getCurrentUser();
- } catch (RemoteException re) {
- activeUser = null;
- }
-
- ArrayList<UserInfo> users = new ArrayList<UserInfo>(userList);
- Collections.sort(users, mOrderAddedComparator);
-
- for (UserInfo user: users) {
- if (user.supportsSwitchTo()) {
- KeyguardMultiUserAvatar uv = createAndAddUser(user);
- if (user.id == activeUser.id) {
- mActiveUserAvatar = uv;
- }
- uv.setActive(false, false, null);
- }
- }
- mActiveUserAvatar.lockPressed(true);
- }
-
- public void finalizeActiveUserView(boolean animate) {
- if (animate) {
- getHandler().postDelayed(new Runnable() {
- @Override
- public void run() {
- finalizeActiveUserNow(true);
- }
- }, 500);
- } else {
- finalizeActiveUserNow(animate);
- }
- }
-
- void finalizeActiveUserNow(boolean animate) {
- mActiveUserAvatar.lockPressed(false);
- mActiveUserAvatar.setActive(true, animate, null);
- }
-
- Comparator<UserInfo> mOrderAddedComparator = new Comparator<UserInfo>() {
- @Override
- public int compare(UserInfo lhs, UserInfo rhs) {
- return (lhs.serialNumber - rhs.serialNumber);
- }
- };
-
- private KeyguardMultiUserAvatar createAndAddUser(UserInfo user) {
- KeyguardMultiUserAvatar uv = KeyguardMultiUserAvatar.fromXml(
- R.layout.keyguard_multi_user_avatar, mContext, this, user);
- mUsersGrid.addView(uv);
- return uv;
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent event) {
- if(event.getActionMasked() != MotionEvent.ACTION_CANCEL && mCallback != null) {
- mCallback.userActivity();
- }
- return false;
- }
-
- private void setAllClickable(boolean clickable)
- {
- for(int i = 0; i < mUsersGrid.getChildCount(); i++) {
- View v = mUsersGrid.getChildAt(i);
- v.setClickable(clickable);
- v.setPressed(false);
- }
- }
-
- @Override
- public void onClick(View v) {
- if (!(v instanceof KeyguardMultiUserAvatar)) return;
- final KeyguardMultiUserAvatar avatar = (KeyguardMultiUserAvatar) v;
- if (avatar.isClickable()) { // catch race conditions
- if (mActiveUserAvatar == avatar) {
- // If they click the currently active user, show the unlock hint
- mCallback.showUnlockHint();
- return;
- } else {
- // Reset the previously active user to appear inactive
- mCallback.hideSecurityView(FADE_OUT_ANIMATION_DURATION);
- setAllClickable(false);
- avatar.lockPressed(true);
- mActiveUserAvatar.setActive(false, true, new Runnable() {
- @Override
- public void run() {
- mActiveUserAvatar = avatar;
- try {
- ActivityManagerNative.getDefault()
- .switchUser(avatar.getUserInfo().id);
- } catch (RemoteException re) {
- Log.e(TAG, "Couldn't switch user " + re);
- }
- }
- });
- }
- }
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java
index 04ef57e..d0be855 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java
@@ -29,7 +29,7 @@
private final AppearAnimationUtils mAppearAnimationUtils;
private final DisappearAnimationUtils mDisappearAnimationUtils;
- private ViewGroup mKeyguardBouncerFrame;
+ private ViewGroup mContainer;
private ViewGroup mRow0;
private ViewGroup mRow1;
private ViewGroup mRow2;
@@ -55,11 +55,7 @@
protected void resetState() {
super.resetState();
- if (KeyguardUpdateMonitor.getInstance(mContext).getMaxBiometricUnlockAttemptsReached()) {
- mSecurityMessageDisplay.setMessage(R.string.faceunlock_multiple_failures, true);
- } else {
- mSecurityMessageDisplay.setMessage(R.string.kg_pin_instructions, false);
- }
+ mSecurityMessageDisplay.setMessage(R.string.kg_pin_instructions, false);
}
@Override
@@ -71,7 +67,7 @@
protected void onFinishInflate() {
super.onFinishInflate();
- mKeyguardBouncerFrame = (ViewGroup) findViewById(R.id.keyguard_bouncer_frame);
+ mContainer = (ViewGroup) findViewById(R.id.container);
mRow0 = (ViewGroup) findViewById(R.id.row0);
mRow1 = (ViewGroup) findViewById(R.id.row1);
mRow2 = (ViewGroup) findViewById(R.id.row2);
@@ -150,8 +146,8 @@
}
private void enableClipping(boolean enable) {
- mKeyguardBouncerFrame.setClipToPadding(enable);
- mKeyguardBouncerFrame.setClipChildren(enable);
+ mContainer.setClipToPadding(enable);
+ mContainer.setClipChildren(enable);
mRow1.setClipToPadding(enable);
mRow2.setClipToPadding(enable);
mRow3.setClipToPadding(enable);
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java
index 0dfe1dc..62f1b69 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java
@@ -20,7 +20,6 @@
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
import android.os.CountDownTimer;
import android.os.SystemClock;
import android.text.TextUtils;
@@ -81,8 +80,7 @@
private Rect mTempRect = new Rect();
private SecurityMessageDisplay mSecurityMessageDisplay;
private View mEcaView;
- private Drawable mBouncerFrame;
- private ViewGroup mKeyguardBouncerFrame;
+ private ViewGroup mContainer;
private KeyguardMessageArea mHelpMessage;
private int mDisappearYTranslation;
@@ -140,12 +138,7 @@
mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this);
mEcaView = findViewById(R.id.keyguard_selector_fade_container);
- View bouncerFrameView = findViewById(R.id.keyguard_bouncer_frame);
- if (bouncerFrameView != null) {
- mBouncerFrame = bouncerFrameView.getBackground();
- }
-
- mKeyguardBouncerFrame = (ViewGroup) findViewById(R.id.keyguard_bouncer_frame);
+ mContainer = (ViewGroup) findViewById(R.id.container);
mHelpMessage = (KeyguardMessageArea) findViewById(R.id.keyguard_message_area);
}
@@ -182,11 +175,7 @@
}
private void displayDefaultSecurityMessage() {
- if (mKeyguardUpdateMonitor.getMaxBiometricUnlockAttemptsReached()) {
- mSecurityMessageDisplay.setMessage(R.string.faceunlock_multiple_failures, true);
- } else {
- mSecurityMessageDisplay.setMessage(R.string.kg_pattern_instructions, false);
- }
+ mSecurityMessageDisplay.setMessage(R.string.kg_pattern_instructions, false);
}
@Override
@@ -288,18 +277,6 @@
}
@Override
- public void showBouncer(int duration) {
- KeyguardSecurityViewHelper.
- showBouncer(mSecurityMessageDisplay, mEcaView, mBouncerFrame, duration);
- }
-
- @Override
- public void hideBouncer(int duration) {
- KeyguardSecurityViewHelper.
- hideBouncer(mSecurityMessageDisplay, mEcaView, mBouncerFrame, duration);
- }
-
- @Override
public void startAppearAnimation() {
enableClipping(false);
setAlpha(1f);
@@ -359,8 +336,8 @@
private void enableClipping(boolean enable) {
setClipChildren(enable);
- mKeyguardBouncerFrame.setClipToPadding(enable);
- mKeyguardBouncerFrame.setClipChildren(enable);
+ mContainer.setClipToPadding(enable);
+ mContainer.setClipChildren(enable);
}
@Override
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java
index faecaed..4f5638b 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -20,7 +20,6 @@
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.os.UserHandle;
-import android.os.UserManager;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Slog;
@@ -41,13 +40,11 @@
private static final int USER_TYPE_SECONDARY_USER = 3;
private KeyguardSecurityModel mSecurityModel;
- private boolean mEnableFallback; // TODO: This should get the value from KeyguardPatternView
private LockPatternUtils mLockPatternUtils;
private KeyguardSecurityViewFlipper mSecurityViewFlipper;
private boolean mIsVerifyUnlockOnly;
private SecurityMode mCurrentSecuritySelection = SecurityMode.Invalid;
- private boolean mIsBouncing;
private SecurityCallback mSecurityCallback;
private final KeyguardUpdateMonitor mUpdateMonitor;
@@ -107,13 +104,6 @@
return false;
}
- void updateSecurityViews(boolean isBouncing) {
- int children = mSecurityViewFlipper.getChildCount();
- for (int i = 0; i < children; i++) {
- updateSecurityView(mSecurityViewFlipper.getChildAt(i), isBouncing);
- }
- }
-
public void announceCurrentSecurityMethod() {
View v = (View) getSecurityView(mCurrentSecuritySelection);
if (v != null) {
@@ -137,24 +127,18 @@
if (DEBUG) Log.v(TAG, "inflating id = " + layoutId);
View v = inflater.inflate(layoutId, mSecurityViewFlipper, false);
mSecurityViewFlipper.addView(v);
- updateSecurityView(v, mIsBouncing);
+ updateSecurityView(v);
view = (KeyguardSecurityView)v;
}
return view;
}
- private void updateSecurityView(View view, boolean isBouncing) {
- mIsBouncing = isBouncing;
+ private void updateSecurityView(View view) {
if (view instanceof KeyguardSecurityView) {
KeyguardSecurityView ksv = (KeyguardSecurityView) view;
ksv.setKeyguardCallback(mCallback);
ksv.setLockPatternUtils(mLockPatternUtils);
- if (isBouncing) {
- ksv.showBouncer(0);
- } else {
- ksv.hideBouncer(0);
- }
} else {
Log.w(TAG, "View " + view + " is not a KeyguardSecurityView");
}
@@ -198,8 +182,6 @@
messageId = R.string.kg_too_many_failed_password_attempts_dialog_message;
break;
// These don't have timeout dialogs.
- case Account:
- case Biometric:
case Invalid:
case None:
case SimPin:
@@ -306,17 +288,6 @@
} else {
showTimeout =
(failedAttempts % LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT) == 0;
- if (usingPattern && mEnableFallback) {
- if (failedAttempts == failedAttemptWarning) {
- showAlmostAtAccountLoginDialog();
- showTimeout = false; // don't show both dialogs
- } else if (failedAttempts >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET) {
- mLockPatternUtils.setPermanentlyLocked(true);
- showSecurityScreen(SecurityMode.Account);
- // don't show timeout dialog because we show account unlock screen next
- showTimeout = false;
- }
- }
}
monitor.reportFailedUnlockAttempt();
mLockPatternUtils.reportFailedPasswordAttempt();
@@ -356,7 +327,6 @@
/**
* Shows the next security screen if there is one.
* @param authenticated true if the user entered the correct authentication
- * @param authenticated
* @return true if keyguard is done
*/
boolean showNextSecurityScreenOrFinish(boolean authenticated) {
@@ -378,8 +348,6 @@
case Pattern:
case Password:
case PIN:
- case Account:
- case Biometric:
finish = true;
break;
@@ -456,20 +424,6 @@
return null;
}
- public void showBouncer(int duration) {
- KeyguardSecurityViewFlipper flipper = getFlipper();
- if (flipper != null) {
- flipper.showBouncer(duration);
- }
- }
-
- public void hideBouncer(int duration) {
- KeyguardSecurityViewFlipper flipper = getFlipper();
- if (flipper != null) {
- flipper.hideBouncer(duration);
- }
- }
-
private KeyguardSecurityCallback mCallback = new KeyguardSecurityCallback() {
public void userActivity() {
@@ -492,11 +446,7 @@
monitor.clearFailedUnlockAttempts();
mLockPatternUtils.reportSuccessfulPasswordAttempt();
} else {
- if (mCurrentSecuritySelection == SecurityMode.Biometric) {
- monitor.reportFailedBiometricUnlockAttempt();
- } else {
- KeyguardSecurityContainer.this.reportFailedUnlockAttempt();
- }
+ KeyguardSecurityContainer.this.reportFailedUnlockAttempt();
}
}
@@ -528,8 +478,6 @@
case Pattern: return R.id.keyguard_pattern_view;
case PIN: return R.id.keyguard_pin_view;
case Password: return R.id.keyguard_password_view;
- case Biometric: return R.id.keyguard_face_unlock_view;
- case Account: return R.id.keyguard_account_view;
case SimPin: return R.id.keyguard_sim_pin_view;
case SimPuk: return R.id.keyguard_sim_puk_view;
}
@@ -541,8 +489,6 @@
case Pattern: return R.layout.keyguard_pattern_view;
case PIN: return R.layout.keyguard_pin_view;
case Password: return R.layout.keyguard_password_view;
- case Biometric: return R.layout.keyguard_face_unlock_view;
- case Account: return R.layout.keyguard_account_view;
case SimPin: return R.layout.keyguard_sim_pin_view;
case SimPuk: return R.layout.keyguard_sim_puk_view;
default:
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityModel.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityModel.java
index 1e2a233..11f7c63 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityModel.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityModel.java
@@ -38,8 +38,6 @@
Pattern, // Unlock by drawing a pattern.
Password, // Unlock by entering an alphanumeric password
PIN, // Strictly numeric password
- Biometric, // Unlock with a biometric key (e.g. finger print or face unlock)
- Account, // Unlock by entering an account's login and password.
SimPin, // Unlock by entering a sim pin.
SimPuk // Unlock by entering a sim puk
}
@@ -56,28 +54,6 @@
mLockPatternUtils = utils;
}
- /**
- * Returns true if biometric unlock is installed and selected. If this returns false there is
- * no need to even construct the biometric unlock.
- */
- boolean isBiometricUnlockEnabled() {
- return mLockPatternUtils.usingBiometricWeak()
- && mLockPatternUtils.isBiometricWeakInstalled();
- }
-
- /**
- * Returns true if a condition is currently suppressing the biometric unlock. If this returns
- * true there is no need to even construct the biometric unlock.
- */
- private boolean isBiometricUnlockSuppressed() {
- KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
- final boolean backupIsTimedOut = monitor.getFailedUnlockAttempts() >=
- LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT;
- return monitor.getMaxBiometricUnlockAttemptsReached() || backupIsTimedOut
- || !monitor.isAlternateUnlockEnabled()
- || monitor.getPhoneState() != TelephonyManager.CALL_STATE_IDLE;
- }
-
SecurityMode getSecurityMode() {
KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
SecurityMode mode = SecurityMode.None;
@@ -105,10 +81,8 @@
case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:
- if (mLockPatternUtils.isLockPatternEnabled()) {
- mode = mLockPatternUtils.isPermanentlyLocked() ?
- SecurityMode.Account : SecurityMode.Pattern;
- }
+ mode = mLockPatternUtils.isLockPatternEnabled() ?
+ SecurityMode.Pattern : SecurityMode.None;
break;
default:
@@ -127,12 +101,6 @@
* @return alternate or the given mode
*/
SecurityMode getAlternateFor(SecurityMode mode) {
- if (isBiometricUnlockEnabled() && !isBiometricUnlockSuppressed()
- && (mode == SecurityMode.Password
- || mode == SecurityMode.PIN
- || mode == SecurityMode.Pattern)) {
- return SecurityMode.Biometric;
- }
return mode; // no alternate, return what was given
}
@@ -143,12 +111,6 @@
* @return backup method or current security mode
*/
SecurityMode getBackupSecurityMode(SecurityMode mode) {
- switch(mode) {
- case Biometric:
- return getSecurityMode();
- case Pattern:
- return SecurityMode.Account;
- }
return mode; // no backup, return current security mode
}
}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java
index 78fcb9f..5b50236 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java
@@ -72,20 +72,6 @@
void showUsabilityHint();
/**
- * Place the security view into bouncer mode.
- * Animate transisiton if duration is non-zero.
- * @param duration millisends for the transisiton animation.
- */
- void showBouncer(int duration);
-
- /**
- * Place the security view into non-bouncer mode.
- * Animate transisiton if duration is non-zero.
- * @param duration millisends for the transisiton animation.
- */
- void hideBouncer(int duration);
-
- /**
* Starts the animation which should run when the security view appears.
*/
void startAppearAnimation();
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewFlipper.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewFlipper.java
index ea5c304..b5eda90 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewFlipper.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewFlipper.java
@@ -135,30 +135,6 @@
}
@Override
- public void showBouncer(int duration) {
- KeyguardSecurityView active = getSecurityView();
- for (int i = 0; i < getChildCount(); i++) {
- View child = getChildAt(i);
- if (child instanceof KeyguardSecurityView) {
- KeyguardSecurityView ksv = (KeyguardSecurityView) child;
- ksv.showBouncer(ksv == active ? duration : 0);
- }
- }
- }
-
- @Override
- public void hideBouncer(int duration) {
- KeyguardSecurityView active = getSecurityView();
- for (int i = 0; i < getChildCount(); i++) {
- View child = getChildAt(i);
- if (child instanceof KeyguardSecurityView) {
- KeyguardSecurityView ksv = (KeyguardSecurityView) child;
- ksv.hideBouncer(ksv == active ? duration : 0);
- }
- }
- }
-
- @Override
public void startAppearAnimation() {
KeyguardSecurityView ksv = getSecurityView();
if (ksv != null) {
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewHelper.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewHelper.java
deleted file mode 100644
index 67a6f52..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewHelper.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.graphics.drawable.Drawable;
-import android.view.View;
-
-/**
- * Some common functions that are useful for KeyguardSecurityViews.
- */
-public class KeyguardSecurityViewHelper {
-
- public static void showBouncer(SecurityMessageDisplay securityMessageDisplay,
- final View ecaView, Drawable bouncerFrame, int duration) {
- if (securityMessageDisplay != null) {
- securityMessageDisplay.showBouncer(duration);
- }
- if (ecaView != null) {
- if (duration > 0) {
- Animator anim = ObjectAnimator.ofFloat(ecaView, "alpha", 0f);
- anim.setDuration(duration);
- anim.addListener(new AnimatorListenerAdapter() {
- private boolean mCanceled;
- @Override
- public void onAnimationCancel(Animator animation) {
- // Fail safe and show the emergency button in onAnimationEnd()
- mCanceled = true;
- ecaView.setAlpha(1f);
- }
- @Override
- public void onAnimationEnd(Animator animation) {
- ecaView.setVisibility(mCanceled ? View.VISIBLE : View.INVISIBLE);
- }
- });
- anim.start();
- } else {
- ecaView.setAlpha(0f);
- ecaView.setVisibility(View.INVISIBLE);
- }
- }
- if (bouncerFrame != null) {
- if (duration > 0) {
- Animator anim = ObjectAnimator.ofInt(bouncerFrame, "alpha", 0, 255);
- anim.setDuration(duration);
- anim.start();
- } else {
- bouncerFrame.setAlpha(255);
- }
- }
- }
-
- public static void hideBouncer(SecurityMessageDisplay securityMessageDisplay,
- View ecaView, Drawable bouncerFrame, int duration) {
- if (securityMessageDisplay != null) {
- securityMessageDisplay.hideBouncer(duration);
- }
- if (ecaView != null) {
- ecaView.setVisibility(View.VISIBLE);
- if (duration > 0) {
- Animator anim = ObjectAnimator.ofFloat(ecaView, "alpha", 1f);
- anim.setDuration(duration);
- anim.start();
- } else {
- ecaView.setAlpha(1f);
- }
- }
- if (bouncerFrame != null) {
- if (duration > 0) {
- Animator anim = ObjectAnimator.ofInt(bouncerFrame, "alpha", 255, 0);
- anim.setDuration(duration);
- anim.start();
- } else {
- bouncerFrame.setAlpha(0);
- }
- }
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSimpleHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSimpleHostView.java
deleted file mode 100644
index 828c921..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardSimpleHostView.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-
-public class KeyguardSimpleHostView extends KeyguardViewBase {
-
- public KeyguardSimpleHostView(Context context, AttributeSet attrs) {
- super(context, attrs);
- KeyguardUpdateMonitor.getInstance(context).registerCallback(mUpdateCallback);
- }
-
- @Override
- protected void showBouncer(boolean show) {
- super.showBouncer(show);
- if (show) {
- getSecurityContainer().showBouncer(250);
- } else {
- getSecurityContainer().hideBouncer(250);
- }
- }
-
- @Override
- public void cleanUp() {
- getSecurityContainer().onPause();
- }
-
- @Override
- public long getUserActivityTimeout() {
- return -1; // not used
- }
-
- @Override
- protected void onUserSwitching(boolean switching) {
- // TODO Auto-generated method stub
- }
-
- @Override
- protected void onCreateOptions(Bundle options) {
- // TODO Auto-generated method stub
- }
-
- @Override
- protected void onExternalMotionEvent(MotionEvent event) {
- // TODO Auto-generated method stub
- }
-
- private KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() {
- @Override
- public void onUserSwitchComplete(int userId) {
- getSecurityContainer().showPrimarySecurityScreen(false /* turning off */);
- }
-
- @Override
- public void onTrustInitiatedByUser(int userId) {
- if (userId != mLockPatternUtils.getCurrentUser()) return;
- if (!isAttachedToWindow()) return;
-
- if (isVisibleToUser()) {
- dismiss(false /* authenticated */);
- } else {
- mViewMediatorCallback.playTrustedSound();
- }
- }
- };
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusViewManager.java b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusViewManager.java
deleted file mode 100644
index e69de29..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusViewManager.java
+++ /dev/null
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java
deleted file mode 100644
index 0d472ae..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardTransportControlView.java
+++ /dev/null
@@ -1,716 +0,0 @@
-/*
- * 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 com.android.keyguard;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.content.res.Configuration;
-import android.graphics.Bitmap;
-import android.graphics.ColorMatrix;
-import android.graphics.ColorMatrixColorFilter;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.drawable.Drawable;
-import android.media.AudioManager;
-import android.media.MediaMetadataEditor;
-import android.media.MediaMetadataRetriever;
-import android.media.RemoteControlClient;
-import android.media.RemoteController;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-import android.text.format.DateFormat;
-import android.transition.ChangeBounds;
-import android.transition.ChangeText;
-import android.transition.Fade;
-import android.transition.TransitionManager;
-import android.transition.TransitionSet;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.TimeZone;
-
-/**
- * This is the widget responsible for showing music controls in keyguard.
- */
-public class KeyguardTransportControlView extends FrameLayout {
-
- private static final int RESET_TO_METADATA_DELAY = 5000;
- protected static final boolean DEBUG = KeyguardConstants.DEBUG;
- protected static final String TAG = "TransportControlView";
-
- private static final boolean ANIMATE_TRANSITIONS = true;
- protected static final long QUIESCENT_PLAYBACK_FACTOR = 1000;
-
- private ViewGroup mMetadataContainer;
- private ViewGroup mInfoContainer;
- private TextView mTrackTitle;
- private TextView mTrackArtistAlbum;
-
- private View mTransientSeek;
- private SeekBar mTransientSeekBar;
- private TextView mTransientSeekTimeElapsed;
- private TextView mTransientSeekTimeTotal;
-
- private ImageView mBtnPrev;
- private ImageView mBtnPlay;
- private ImageView mBtnNext;
- private Metadata mMetadata = new Metadata();
- private int mTransportControlFlags;
- private int mCurrentPlayState;
- private AudioManager mAudioManager;
- private RemoteController mRemoteController;
-
- private ImageView mBadge;
-
- private boolean mSeekEnabled;
- private java.text.DateFormat mFormat;
-
- private Date mTempDate = new Date();
-
- /**
- * The metadata which should be populated into the view once we've been attached
- */
- private RemoteController.MetadataEditor mPopulateMetadataWhenAttached = null;
-
- private RemoteController.OnClientUpdateListener mRCClientUpdateListener =
- new RemoteController.OnClientUpdateListener() {
- @Override
- public void onClientChange(boolean clearing) {
- if (clearing) {
- clearMetadata();
- }
- }
-
- @Override
- public void onClientPlaybackStateUpdate(int state) {
- updatePlayPauseState(state);
- }
-
- @Override
- public void onClientPlaybackStateUpdate(int state, long stateChangeTimeMs,
- long currentPosMs, float speed) {
- updatePlayPauseState(state);
- if (DEBUG) Log.d(TAG, "onClientPlaybackStateUpdate(state=" + state +
- ", stateChangeTimeMs=" + stateChangeTimeMs + ", currentPosMs=" + currentPosMs +
- ", speed=" + speed + ")");
-
- removeCallbacks(mUpdateSeekBars);
- // Since the music client may be responding to historical events that cause the
- // playback state to change dramatically, wait until things become quiescent before
- // resuming automatic scrub position update.
- if (mTransientSeek.getVisibility() == View.VISIBLE
- && playbackPositionShouldMove(mCurrentPlayState)) {
- postDelayed(mUpdateSeekBars, QUIESCENT_PLAYBACK_FACTOR);
- }
- }
-
- @Override
- public void onClientTransportControlUpdate(int transportControlFlags) {
- updateTransportControls(transportControlFlags);
- }
-
- @Override
- public void onClientMetadataUpdate(RemoteController.MetadataEditor metadataEditor) {
- updateMetadata(metadataEditor);
- }
- };
-
- private class UpdateSeekBarRunnable implements Runnable {
- public void run() {
- boolean seekAble = updateOnce();
- if (seekAble) {
- removeCallbacks(this);
- postDelayed(this, 1000);
- }
- }
- public boolean updateOnce() {
- return updateSeekBars();
- }
- };
-
- private final UpdateSeekBarRunnable mUpdateSeekBars = new UpdateSeekBarRunnable();
-
- private final Runnable mResetToMetadata = new Runnable() {
- public void run() {
- resetToMetadata();
- }
- };
-
- private final OnClickListener mTransportCommandListener = new OnClickListener() {
- public void onClick(View v) {
- int keyCode = -1;
- if (v == mBtnPrev) {
- keyCode = KeyEvent.KEYCODE_MEDIA_PREVIOUS;
- } else if (v == mBtnNext) {
- keyCode = KeyEvent.KEYCODE_MEDIA_NEXT;
- } else if (v == mBtnPlay) {
- keyCode = KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE;
- }
- if (keyCode != -1) {
- sendMediaButtonClick(keyCode);
- delayResetToMetadata(); // if the scrub bar is showing, keep showing it.
- }
- }
- };
-
- private final OnLongClickListener mTransportShowSeekBarListener = new OnLongClickListener() {
- @Override
- public boolean onLongClick(View v) {
- if (mSeekEnabled) {
- return tryToggleSeekBar();
- }
- return false;
- }
- };
-
- // This class is here to throttle scrub position updates to the music client
- class FutureSeekRunnable implements Runnable {
- private int mProgress;
- private boolean mPending;
-
- public void run() {
- scrubTo(mProgress);
- mPending = false;
- }
-
- void setProgress(int progress) {
- mProgress = progress;
- if (!mPending) {
- mPending = true;
- postDelayed(this, 30);
- }
- }
- };
-
- // This is here because RemoteControlClient's method isn't visible :/
- private final static boolean playbackPositionShouldMove(int playstate) {
- switch(playstate) {
- case RemoteControlClient.PLAYSTATE_STOPPED:
- case RemoteControlClient.PLAYSTATE_PAUSED:
- case RemoteControlClient.PLAYSTATE_BUFFERING:
- case RemoteControlClient.PLAYSTATE_ERROR:
- case RemoteControlClient.PLAYSTATE_SKIPPING_FORWARDS:
- case RemoteControlClient.PLAYSTATE_SKIPPING_BACKWARDS:
- return false;
- case RemoteControlClient.PLAYSTATE_PLAYING:
- case RemoteControlClient.PLAYSTATE_FAST_FORWARDING:
- case RemoteControlClient.PLAYSTATE_REWINDING:
- default:
- return true;
- }
- }
-
- private final FutureSeekRunnable mFutureSeekRunnable = new FutureSeekRunnable();
-
- private final SeekBar.OnSeekBarChangeListener mOnSeekBarChangeListener =
- new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- if (fromUser) {
- mFutureSeekRunnable.setProgress(progress);
- delayResetToMetadata();
- mTempDate.setTime(progress);
- mTransientSeekTimeElapsed.setText(mFormat.format(mTempDate));
- } else {
- updateSeekDisplay();
- }
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- delayResetToMetadata();
- removeCallbacks(mUpdateSeekBars); // don't update during user interaction
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- }
- };
-
- private static final int TRANSITION_DURATION = 200;
- private final TransitionSet mMetadataChangeTransition;
-
- KeyguardHostView.TransportControlCallback mTransportControlCallback;
-
- private final KeyguardUpdateMonitorCallback mUpdateMonitor
- = new KeyguardUpdateMonitorCallback() {
- public void onScreenTurnedOff(int why) {
- setEnableMarquee(false);
- }
- public void onScreenTurnedOn() {
- setEnableMarquee(true);
- }
- };
-
- public KeyguardTransportControlView(Context context, AttributeSet attrs) {
- super(context, attrs);
- if (DEBUG) Log.v(TAG, "Create TCV " + this);
- mAudioManager = new AudioManager(mContext);
- mCurrentPlayState = RemoteControlClient.PLAYSTATE_NONE; // until we get a callback
- mRemoteController = new RemoteController(context, mRCClientUpdateListener);
-
- final DisplayMetrics dm = context.getResources().getDisplayMetrics();
- final int dim = Math.max(dm.widthPixels, dm.heightPixels);
- mRemoteController.setArtworkConfiguration(true, dim, dim);
-
- final ChangeText tc = new ChangeText();
- tc.setChangeBehavior(ChangeText.CHANGE_BEHAVIOR_OUT_IN);
- final TransitionSet inner = new TransitionSet();
- inner.addTransition(tc).addTransition(new ChangeBounds());
- final TransitionSet tg = new TransitionSet();
- tg.addTransition(new Fade(Fade.OUT)).addTransition(inner).
- addTransition(new Fade(Fade.IN));
- tg.setOrdering(TransitionSet.ORDERING_SEQUENTIAL);
- tg.setDuration(TRANSITION_DURATION);
- mMetadataChangeTransition = tg;
- }
-
- private void updateTransportControls(int transportControlFlags) {
- mTransportControlFlags = transportControlFlags;
- setSeekBarsEnabled(
- (transportControlFlags & RemoteControlClient.FLAG_KEY_MEDIA_POSITION_UPDATE) != 0);
- }
-
- void setSeekBarsEnabled(boolean enabled) {
- if (enabled == mSeekEnabled) return;
-
- mSeekEnabled = enabled;
- if (mTransientSeek.getVisibility() == VISIBLE && !enabled) {
- mTransientSeek.setVisibility(INVISIBLE);
- mMetadataContainer.setVisibility(VISIBLE);
- cancelResetToMetadata();
- }
- }
-
- public void setTransportControlCallback(KeyguardHostView.TransportControlCallback
- transportControlCallback) {
- mTransportControlCallback = transportControlCallback;
- }
-
- private void setEnableMarquee(boolean enabled) {
- if (DEBUG) Log.v(TAG, (enabled ? "Enable" : "Disable") + " transport text marquee");
- if (mTrackTitle != null) mTrackTitle.setSelected(enabled);
- if (mTrackArtistAlbum != null) mTrackTitle.setSelected(enabled);
- }
-
- @Override
- public void onFinishInflate() {
- super.onFinishInflate();
- mInfoContainer = (ViewGroup) findViewById(R.id.info_container);
- mMetadataContainer = (ViewGroup) findViewById(R.id.metadata_container);
- mBadge = (ImageView) findViewById(R.id.badge);
- mTrackTitle = (TextView) findViewById(R.id.title);
- mTrackArtistAlbum = (TextView) findViewById(R.id.artist_album);
- mTransientSeek = findViewById(R.id.transient_seek);
- mTransientSeekBar = (SeekBar) findViewById(R.id.transient_seek_bar);
- mTransientSeekBar.setOnSeekBarChangeListener(mOnSeekBarChangeListener);
- mTransientSeekTimeElapsed = (TextView) findViewById(R.id.transient_seek_time_elapsed);
- mTransientSeekTimeTotal = (TextView) findViewById(R.id.transient_seek_time_remaining);
- mBtnPrev = (ImageView) findViewById(R.id.btn_prev);
- mBtnPlay = (ImageView) findViewById(R.id.btn_play);
- mBtnNext = (ImageView) findViewById(R.id.btn_next);
- final View buttons[] = { mBtnPrev, mBtnPlay, mBtnNext };
- for (View view : buttons) {
- view.setOnClickListener(mTransportCommandListener);
- view.setOnLongClickListener(mTransportShowSeekBarListener);
- }
- final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn();
- setEnableMarquee(screenOn);
- // Allow long-press anywhere else in this view to show the seek bar
- setOnLongClickListener(mTransportShowSeekBarListener);
- }
-
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
- if (DEBUG) Log.v(TAG, "onAttachToWindow()");
- if (mPopulateMetadataWhenAttached != null) {
- updateMetadata(mPopulateMetadataWhenAttached);
- mPopulateMetadataWhenAttached = null;
- }
- if (DEBUG) Log.v(TAG, "Registering TCV " + this);
- mMetadata.clear();
- mAudioManager.registerRemoteController(mRemoteController);
- KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitor);
- }
-
- @Override
- protected void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- final DisplayMetrics dm = getContext().getResources().getDisplayMetrics();
- final int dim = Math.max(dm.widthPixels, dm.heightPixels);
- mRemoteController.setArtworkConfiguration(true, dim, dim);
- }
-
- @Override
- public void onDetachedFromWindow() {
- if (DEBUG) Log.v(TAG, "onDetachFromWindow()");
- super.onDetachedFromWindow();
- if (DEBUG) Log.v(TAG, "Unregistering TCV " + this);
- mAudioManager.unregisterRemoteController(mRemoteController);
- KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitor);
- mMetadata.clear();
- removeCallbacks(mUpdateSeekBars);
- }
-
- @Override
- protected Parcelable onSaveInstanceState() {
- SavedState ss = new SavedState(super.onSaveInstanceState());
- ss.artist = mMetadata.artist;
- ss.trackTitle = mMetadata.trackTitle;
- ss.albumTitle = mMetadata.albumTitle;
- ss.duration = mMetadata.duration;
- ss.bitmap = mMetadata.bitmap;
- return ss;
- }
-
- @Override
- protected void onRestoreInstanceState(Parcelable state) {
- if (!(state instanceof SavedState)) {
- super.onRestoreInstanceState(state);
- return;
- }
- SavedState ss = (SavedState) state;
- super.onRestoreInstanceState(ss.getSuperState());
- mMetadata.artist = ss.artist;
- mMetadata.trackTitle = ss.trackTitle;
- mMetadata.albumTitle = ss.albumTitle;
- mMetadata.duration = ss.duration;
- mMetadata.bitmap = ss.bitmap;
- populateMetadata();
- }
-
- void setBadgeIcon(Drawable bmp) {
- mBadge.setImageDrawable(bmp);
-
- final ColorMatrix cm = new ColorMatrix();
- cm.setSaturation(0);
- mBadge.setColorFilter(new ColorMatrixColorFilter(cm));
- mBadge.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN));
- mBadge.setImageAlpha(0xef);
- }
-
- class Metadata {
- private String artist;
- private String trackTitle;
- private String albumTitle;
- private Bitmap bitmap;
- private long duration;
-
- public void clear() {
- artist = null;
- trackTitle = null;
- albumTitle = null;
- bitmap = null;
- duration = -1;
- }
-
- public String toString() {
- return "Metadata[artist=" + artist + " trackTitle=" + trackTitle +
- " albumTitle=" + albumTitle + " duration=" + duration + "]";
- }
- }
-
- void clearMetadata() {
- mPopulateMetadataWhenAttached = null;
- mMetadata.clear();
- populateMetadata();
- }
-
- void updateMetadata(RemoteController.MetadataEditor data) {
- if (isAttachedToWindow()) {
- mMetadata.artist = data.getString(MediaMetadataRetriever.METADATA_KEY_ALBUMARTIST,
- mMetadata.artist);
- mMetadata.trackTitle = data.getString(MediaMetadataRetriever.METADATA_KEY_TITLE,
- mMetadata.trackTitle);
- mMetadata.albumTitle = data.getString(MediaMetadataRetriever.METADATA_KEY_ALBUM,
- mMetadata.albumTitle);
- mMetadata.duration = data.getLong(MediaMetadataRetriever.METADATA_KEY_DURATION, -1);
- mMetadata.bitmap = data.getBitmap(MediaMetadataEditor.BITMAP_KEY_ARTWORK,
- mMetadata.bitmap);
- populateMetadata();
- } else {
- mPopulateMetadataWhenAttached = data;
- }
- }
-
- /**
- * Populates the given metadata into the view
- */
- private void populateMetadata() {
- if (ANIMATE_TRANSITIONS && isLaidOut() && mMetadataContainer.getVisibility() == VISIBLE) {
- TransitionManager.beginDelayedTransition(mMetadataContainer, mMetadataChangeTransition);
- }
-
- final String remoteClientPackage = mRemoteController.getRemoteControlClientPackageName();
- Drawable badgeIcon = null;
- try {
- badgeIcon = getContext().getPackageManager().getApplicationIcon(remoteClientPackage);
- } catch (PackageManager.NameNotFoundException e) {
- Log.e(TAG, "Couldn't get remote control client package icon", e);
- }
- setBadgeIcon(badgeIcon);
- mTrackTitle.setText(!TextUtils.isEmpty(mMetadata.trackTitle)
- ? mMetadata.trackTitle : null);
-
- final StringBuilder sb = new StringBuilder();
- if (!TextUtils.isEmpty(mMetadata.artist)) {
- if (sb.length() != 0) {
- sb.append(" - ");
- }
- sb.append(mMetadata.artist);
- }
- if (!TextUtils.isEmpty(mMetadata.albumTitle)) {
- if (sb.length() != 0) {
- sb.append(" - ");
- }
- sb.append(mMetadata.albumTitle);
- }
-
- final String trackArtistAlbum = sb.toString();
- mTrackArtistAlbum.setText(!TextUtils.isEmpty(trackArtistAlbum) ?
- trackArtistAlbum : null);
-
- if (mMetadata.duration >= 0) {
- setSeekBarsEnabled(true);
- setSeekBarDuration(mMetadata.duration);
-
- final String skeleton;
-
- if (mMetadata.duration >= 86400000) {
- skeleton = "DDD kk mm ss";
- } else if (mMetadata.duration >= 3600000) {
- skeleton = "kk mm ss";
- } else {
- skeleton = "mm ss";
- }
- mFormat = new SimpleDateFormat(DateFormat.getBestDateTimePattern(
- getContext().getResources().getConfiguration().locale,
- skeleton));
- mFormat.setTimeZone(TimeZone.getTimeZone("GMT+0"));
- } else {
- setSeekBarsEnabled(false);
- }
-
- KeyguardUpdateMonitor.getInstance(getContext()).dispatchSetBackground(mMetadata.bitmap);
- final int flags = mTransportControlFlags;
- setVisibilityBasedOnFlag(mBtnPrev, flags, RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS);
- setVisibilityBasedOnFlag(mBtnNext, flags, RemoteControlClient.FLAG_KEY_MEDIA_NEXT);
- setVisibilityBasedOnFlag(mBtnPlay, flags,
- RemoteControlClient.FLAG_KEY_MEDIA_PLAY
- | RemoteControlClient.FLAG_KEY_MEDIA_PAUSE
- | RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE
- | RemoteControlClient.FLAG_KEY_MEDIA_STOP);
-
- updatePlayPauseState(mCurrentPlayState);
- }
-
- void updateSeekDisplay() {
- if (mMetadata != null && mRemoteController != null && mFormat != null) {
- mTempDate.setTime(mRemoteController.getEstimatedMediaPosition());
- mTransientSeekTimeElapsed.setText(mFormat.format(mTempDate));
- mTempDate.setTime(mMetadata.duration);
- mTransientSeekTimeTotal.setText(mFormat.format(mTempDate));
-
- if (DEBUG) Log.d(TAG, "updateSeekDisplay timeElapsed=" + mTempDate +
- " duration=" + mMetadata.duration);
- }
- }
-
- boolean tryToggleSeekBar() {
- if (ANIMATE_TRANSITIONS) {
- TransitionManager.beginDelayedTransition(mInfoContainer);
- }
- if (mTransientSeek.getVisibility() == VISIBLE) {
- mTransientSeek.setVisibility(INVISIBLE);
- mMetadataContainer.setVisibility(VISIBLE);
- cancelResetToMetadata();
- removeCallbacks(mUpdateSeekBars); // don't update if scrubber isn't visible
- } else {
- mTransientSeek.setVisibility(VISIBLE);
- mMetadataContainer.setVisibility(INVISIBLE);
- delayResetToMetadata();
- if (playbackPositionShouldMove(mCurrentPlayState)) {
- mUpdateSeekBars.run();
- } else {
- mUpdateSeekBars.updateOnce();
- }
- }
- mTransportControlCallback.userActivity();
- return true;
- }
-
- void resetToMetadata() {
- if (ANIMATE_TRANSITIONS) {
- TransitionManager.beginDelayedTransition(mInfoContainer);
- }
- if (mTransientSeek.getVisibility() == VISIBLE) {
- mTransientSeek.setVisibility(INVISIBLE);
- mMetadataContainer.setVisibility(VISIBLE);
- }
- // TODO Also hide ratings, if applicable
- }
-
- void delayResetToMetadata() {
- removeCallbacks(mResetToMetadata);
- postDelayed(mResetToMetadata, RESET_TO_METADATA_DELAY);
- }
-
- void cancelResetToMetadata() {
- removeCallbacks(mResetToMetadata);
- }
-
- void setSeekBarDuration(long duration) {
- mTransientSeekBar.setMax((int) duration);
- }
-
- void scrubTo(int progress) {
- mRemoteController.seekTo(progress);
- mTransportControlCallback.userActivity();
- }
-
- private static void setVisibilityBasedOnFlag(View view, int flags, int flag) {
- if ((flags & flag) != 0) {
- view.setVisibility(View.VISIBLE);
- } else {
- view.setVisibility(View.INVISIBLE);
- }
- }
-
- private void updatePlayPauseState(int state) {
- if (DEBUG) Log.v(TAG,
- "updatePlayPauseState(), old=" + mCurrentPlayState + ", state=" + state);
- if (state == mCurrentPlayState) {
- return;
- }
- final int imageResId;
- final int imageDescId;
- switch (state) {
- case RemoteControlClient.PLAYSTATE_ERROR:
- imageResId = R.drawable.stat_sys_warning;
- // TODO use more specific image description string for warning, but here the "play"
- // message is still valid because this button triggers a play command.
- imageDescId = R.string.keyguard_transport_play_description;
- break;
-
- case RemoteControlClient.PLAYSTATE_PLAYING:
- imageResId = R.drawable.ic_media_pause;
- imageDescId = R.string.keyguard_transport_pause_description;
- break;
-
- case RemoteControlClient.PLAYSTATE_BUFFERING:
- imageResId = R.drawable.ic_media_stop;
- imageDescId = R.string.keyguard_transport_stop_description;
- break;
-
- case RemoteControlClient.PLAYSTATE_PAUSED:
- default:
- imageResId = R.drawable.ic_media_play;
- imageDescId = R.string.keyguard_transport_play_description;
- break;
- }
-
- boolean clientSupportsSeek = mMetadata != null && mMetadata.duration > 0;
- setSeekBarsEnabled(clientSupportsSeek);
-
- mBtnPlay.setImageResource(imageResId);
- mBtnPlay.setContentDescription(getResources().getString(imageDescId));
- mCurrentPlayState = state;
- }
-
- boolean updateSeekBars() {
- final int position = (int) mRemoteController.getEstimatedMediaPosition();
- if (DEBUG) Log.v(TAG, "Estimated time:" + position);
- if (position >= 0) {
- mTransientSeekBar.setProgress(position);
- return true;
- }
- Log.w(TAG, "Updating seek bars; received invalid estimated media position (" +
- position + "). Disabling seek.");
- setSeekBarsEnabled(false);
- return false;
- }
-
- static class SavedState extends BaseSavedState {
- boolean clientPresent;
- String artist;
- String trackTitle;
- String albumTitle;
- long duration;
- Bitmap bitmap;
-
- SavedState(Parcelable superState) {
- super(superState);
- }
-
- private SavedState(Parcel in) {
- super(in);
- clientPresent = in.readInt() != 0;
- artist = in.readString();
- trackTitle = in.readString();
- albumTitle = in.readString();
- duration = in.readLong();
- bitmap = Bitmap.CREATOR.createFromParcel(in);
- }
-
- @Override
- public void writeToParcel(Parcel out, int flags) {
- super.writeToParcel(out, flags);
- out.writeInt(clientPresent ? 1 : 0);
- out.writeString(artist);
- out.writeString(trackTitle);
- out.writeString(albumTitle);
- out.writeLong(duration);
- bitmap.writeToParcel(out, flags);
- }
-
- public static final Parcelable.Creator<SavedState> CREATOR
- = new Parcelable.Creator<SavedState>() {
- public SavedState createFromParcel(Parcel in) {
- return new SavedState(in);
- }
-
- public SavedState[] newArray(int size) {
- return new SavedState[size];
- }
- };
- }
-
- private void sendMediaButtonClick(int keyCode) {
- // TODO We should think about sending these up/down events accurately with touch up/down
- // on the buttons, but in the near term this will interfere with the long press behavior.
- mRemoteController.sendMediaKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keyCode));
- mRemoteController.sendMediaKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keyCode));
-
- mTransportControlCallback.userActivity();
- }
-
- public boolean providesClock() {
- return false;
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
index c8cfe31..3a15920 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -284,10 +284,15 @@
KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get();
if (cb != null) {
cb.onSimStateChanged(data.subId, data.slotId, data.simState);
- cb.onRefreshCarrierInfo();
}
}
}
+ for (int j = 0; j < mCallbacks.size(); j++) {
+ KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get();
+ if (cb != null) {
+ cb.onRefreshCarrierInfo();
+ }
+ }
}
/** @return List of SubscriptionInfo records, maybe empty but never null */
@@ -700,7 +705,7 @@
context.registerReceiverAsUser(mBroadcastAllReceiver, UserHandle.ALL, allUserFilter,
null, null);
- mSubscriptionManager.registerOnSubscriptionsChangedListener(mSubscriptionListener);
+ mSubscriptionManager.addOnSubscriptionsChangedListener(mSubscriptionListener);
try {
ActivityManagerNative.getDefault().registerUserSwitchObserver(
new IUserSwitchObserver.Stub() {
@@ -1251,7 +1256,7 @@
} catch(IllegalArgumentException ex) {
Log.w(TAG, "Unknown sim state: " + simState);
state = State.UNKNOWN;
- }
+ }
mSimDatas.put(subId, new SimData(state, slotId, subId));
}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardViewBase.java b/packages/Keyguard/src/com/android/keyguard/KeyguardViewBase.java
deleted file mode 100644
index e1e1cfc..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardViewBase.java
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.ActivityOptions;
-import android.app.SearchManager;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.media.AudioManager;
-import android.media.IAudioService;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.telephony.TelephonyManager;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.Slog;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.FrameLayout;
-
-import com.android.internal.widget.LockPatternUtils;
-import com.android.keyguard.KeyguardHostView.OnDismissAction;
-import com.android.keyguard.KeyguardSecurityContainer.SecurityCallback;
-import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
-
-import java.io.File;
-
-/**
- * Base class for keyguard view. {@link #reset} is where you should
- * reset the state of your view. Use the {@link KeyguardViewCallback} via
- * {@link #getCallback()} to send information back (such as poking the wake lock,
- * or finishing the keyguard).
- *
- * Handles intercepting of media keys that still work when the keyguard is
- * showing.
- */
-public abstract class KeyguardViewBase extends FrameLayout implements SecurityCallback {
-
- private AudioManager mAudioManager;
- private TelephonyManager mTelephonyManager = null;
- protected ViewMediatorCallback mViewMediatorCallback;
- protected LockPatternUtils mLockPatternUtils;
- private OnDismissAction mDismissAction;
-
- // Whether the volume keys should be handled by keyguard. If true, then
- // they will be handled here for specific media types such as music, otherwise
- // the audio service will bring up the volume dialog.
- private static final boolean KEYGUARD_MANAGES_VOLUME = false;
- public static final boolean DEBUG = KeyguardConstants.DEBUG;
- private static final String TAG = "KeyguardViewBase";
-
- private KeyguardSecurityContainer mSecurityContainer;
-
- public KeyguardViewBase(Context context) {
- this(context, null);
- }
-
- public KeyguardViewBase(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- protected void dispatchDraw(Canvas canvas) {
- super.dispatchDraw(canvas);
- if (mViewMediatorCallback != null) {
- mViewMediatorCallback.keyguardDoneDrawing();
- }
- }
-
- /**
- * Sets an action to run when keyguard finishes.
- *
- * @param action
- */
- public void setOnDismissAction(OnDismissAction action) {
- mDismissAction = action;
- }
-
- @Override
- protected void onFinishInflate() {
- mSecurityContainer =
- (KeyguardSecurityContainer) findViewById(R.id.keyguard_security_container);
- mLockPatternUtils = new LockPatternUtils(mContext);
- mSecurityContainer.setLockPatternUtils(mLockPatternUtils);
- mSecurityContainer.setSecurityCallback(this);
- mSecurityContainer.showPrimarySecurityScreen(false);
- // mSecurityContainer.updateSecurityViews(false /* not bouncing */);
- }
-
- /**
- * Called when the view needs to be shown.
- */
- public void showPrimarySecurityScreen() {
- if (DEBUG) Log.d(TAG, "show()");
- mSecurityContainer.showPrimarySecurityScreen(false);
- }
-
- /**
- * Dismisses the keyguard by going to the next screen or making it gone.
- *
- * @return True if the keyguard is done.
- */
- public boolean dismiss() {
- return dismiss(false);
- }
-
- protected void showBouncer(boolean show) {
- CharSequence what = getContext().getResources().getText(
- show ? R.string.keyguard_accessibility_show_bouncer
- : R.string.keyguard_accessibility_hide_bouncer);
- announceForAccessibility(what);
- announceCurrentSecurityMethod();
- }
-
- public boolean handleBackKey() {
- if (mSecurityContainer.getCurrentSecuritySelection() == SecurityMode.Account) {
- // go back to primary screen
- mSecurityContainer.showPrimarySecurityScreen(false /*turningOff*/);
- return true;
- }
- if (mSecurityContainer.getCurrentSecuritySelection() != SecurityMode.None) {
- mSecurityContainer.dismiss(false);
- return true;
- }
- return false;
- }
-
- protected void announceCurrentSecurityMethod() {
- mSecurityContainer.announceCurrentSecurityMethod();
- }
-
- protected KeyguardSecurityContainer getSecurityContainer() {
- return mSecurityContainer;
- }
-
- @Override
- public boolean dismiss(boolean authenticated) {
- return mSecurityContainer.showNextSecurityScreenOrFinish(authenticated);
- }
-
- /**
- * Authentication has happened and it's time to dismiss keyguard. This function
- * should clean up and inform KeyguardViewMediator.
- */
- @Override
- public void finish() {
- // If the alternate unlock was suppressed, it can now be safely
- // enabled because the user has left keyguard.
- KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true);
-
- // If there's a pending runnable because the user interacted with a widget
- // and we're leaving keyguard, then run it.
- boolean deferKeyguardDone = false;
- if (mDismissAction != null) {
- deferKeyguardDone = mDismissAction.onDismiss();
- mDismissAction = null;
- }
- if (mViewMediatorCallback != null) {
- if (deferKeyguardDone) {
- mViewMediatorCallback.keyguardDonePending();
- } else {
- mViewMediatorCallback.keyguardDone(true);
- }
- }
- }
-
- @Override
- public void onSecurityModeChanged(SecurityMode securityMode, boolean needsInput) {
- if (mViewMediatorCallback != null) {
- mViewMediatorCallback.setNeedsInput(needsInput);
- }
- }
-
- public void userActivity() {
- if (mViewMediatorCallback != null) {
- mViewMediatorCallback.userActivity();
- }
- }
-
- protected void onUserActivityTimeoutChanged() {
- if (mViewMediatorCallback != null) {
- mViewMediatorCallback.onUserActivityTimeoutChanged();
- }
- }
-
- /**
- * Called when the Keyguard is not actively shown anymore on the screen.
- */
- public void onPause() {
- if (DEBUG) Log.d(TAG, String.format("screen off, instance %s at %s",
- Integer.toHexString(hashCode()), SystemClock.uptimeMillis()));
- // Once the screen turns off, we no longer consider this to be first boot and we want the
- // biometric unlock to start next time keyguard is shown.
- KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true);
- mSecurityContainer.showPrimarySecurityScreen(true);
- mSecurityContainer.onPause();
- clearFocus();
- }
-
- /**
- * Called when the Keyguard is actively shown on the screen.
- */
- public void onResume() {
- if (DEBUG) Log.d(TAG, "screen on, instance " + Integer.toHexString(hashCode()));
- mSecurityContainer.onResume(KeyguardSecurityView.SCREEN_ON);
- requestFocus();
- }
-
- /**
- * Starts the animation when the Keyguard gets shown.
- */
- public void startAppearAnimation() {
- mSecurityContainer.startAppearAnimation();
- }
-
- public void startDisappearAnimation(Runnable finishRunnable) {
- if (!mSecurityContainer.startDisappearAnimation(finishRunnable) && finishRunnable != null) {
- finishRunnable.run();
- }
- }
-
- /**
- * Verify that the user can get past the keyguard securely. This is called,
- * for example, when the phone disables the keyguard but then wants to launch
- * something else that requires secure access.
- *
- * The result will be propogated back via {@link KeyguardViewCallback#keyguardDone(boolean)}
- */
- public void verifyUnlock() {
- SecurityMode securityMode = mSecurityContainer.getSecurityMode();
- if (securityMode == KeyguardSecurityModel.SecurityMode.None) {
- if (mViewMediatorCallback != null) {
- mViewMediatorCallback.keyguardDone(true);
- }
- } else if (securityMode != KeyguardSecurityModel.SecurityMode.Pattern
- && securityMode != KeyguardSecurityModel.SecurityMode.PIN
- && securityMode != KeyguardSecurityModel.SecurityMode.Password) {
- // can only verify unlock when in pattern/password mode
- if (mViewMediatorCallback != null) {
- mViewMediatorCallback.keyguardDone(false);
- }
- } else {
- // otherwise, go to the unlock screen, see if they can verify it
- mSecurityContainer.verifyUnlock();
- }
- }
-
- /**
- * Called before this view is being removed.
- */
- abstract public void cleanUp();
-
- /**
- * Gets the desired user activity timeout in milliseconds, or -1 if the
- * default should be used.
- */
- abstract public long getUserActivityTimeout();
-
- @Override
- public boolean dispatchKeyEvent(KeyEvent event) {
- if (interceptMediaKey(event)) {
- return true;
- }
- return super.dispatchKeyEvent(event);
- }
-
- /**
- * Allows the media keys to work when the keyguard is showing.
- * The media keys should be of no interest to the actual keyguard view(s),
- * so intercepting them here should not be of any harm.
- * @param event The key event
- * @return whether the event was consumed as a media key.
- */
- public boolean interceptMediaKey(KeyEvent event) {
- final int keyCode = event.getKeyCode();
- if (event.getAction() == KeyEvent.ACTION_DOWN) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_MEDIA_PLAY:
- case KeyEvent.KEYCODE_MEDIA_PAUSE:
- case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
- /* Suppress PLAY/PAUSE toggle when phone is ringing or
- * in-call to avoid music playback */
- if (mTelephonyManager == null) {
- mTelephonyManager = (TelephonyManager) getContext().getSystemService(
- Context.TELEPHONY_SERVICE);
- }
- if (mTelephonyManager != null &&
- mTelephonyManager.getCallState() != TelephonyManager.CALL_STATE_IDLE) {
- return true; // suppress key event
- }
- case KeyEvent.KEYCODE_MUTE:
- case KeyEvent.KEYCODE_HEADSETHOOK:
- case KeyEvent.KEYCODE_MEDIA_STOP:
- case KeyEvent.KEYCODE_MEDIA_NEXT:
- case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
- case KeyEvent.KEYCODE_MEDIA_REWIND:
- case KeyEvent.KEYCODE_MEDIA_RECORD:
- case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
- case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK: {
- handleMediaKeyEvent(event);
- return true;
- }
-
- case KeyEvent.KEYCODE_VOLUME_UP:
- case KeyEvent.KEYCODE_VOLUME_DOWN:
- case KeyEvent.KEYCODE_VOLUME_MUTE: {
- if (KEYGUARD_MANAGES_VOLUME) {
- synchronized (this) {
- if (mAudioManager == null) {
- mAudioManager = (AudioManager) getContext().getSystemService(
- Context.AUDIO_SERVICE);
- }
- }
- // Volume buttons should only function for music (local or remote).
- // TODO: Actually handle MUTE.
- mAudioManager.adjustSuggestedStreamVolume(
- keyCode == KeyEvent.KEYCODE_VOLUME_UP
- ? AudioManager.ADJUST_RAISE
- : AudioManager.ADJUST_LOWER /* direction */,
- AudioManager.STREAM_MUSIC /* stream */, 0 /* flags */);
- // Don't execute default volume behavior
- return true;
- } else {
- return false;
- }
- }
- }
- } else if (event.getAction() == KeyEvent.ACTION_UP) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_MUTE:
- case KeyEvent.KEYCODE_HEADSETHOOK:
- case KeyEvent.KEYCODE_MEDIA_PLAY:
- case KeyEvent.KEYCODE_MEDIA_PAUSE:
- case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
- case KeyEvent.KEYCODE_MEDIA_STOP:
- case KeyEvent.KEYCODE_MEDIA_NEXT:
- case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
- case KeyEvent.KEYCODE_MEDIA_REWIND:
- case KeyEvent.KEYCODE_MEDIA_RECORD:
- case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
- case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK: {
- handleMediaKeyEvent(event);
- return true;
- }
- }
- }
- return false;
- }
-
- private void handleMediaKeyEvent(KeyEvent keyEvent) {
- synchronized (this) {
- if (mAudioManager == null) {
- mAudioManager = (AudioManager) getContext().getSystemService(
- Context.AUDIO_SERVICE);
- }
- }
- mAudioManager.dispatchMediaKeyEvent(keyEvent);
- }
-
- @Override
- public void dispatchSystemUiVisibilityChanged(int visibility) {
- super.dispatchSystemUiVisibilityChanged(visibility);
-
- if (!(mContext instanceof Activity)) {
- setSystemUiVisibility(STATUS_BAR_DISABLE_BACK);
- }
- }
-
- /**
- * In general, we enable unlocking the insecure keyguard with the menu key. However, there are
- * some cases where we wish to disable it, notably when the menu button placement or technology
- * is prone to false positives.
- *
- * @return true if the menu key should be enabled
- */
- private static final String ENABLE_MENU_KEY_FILE = "/data/local/enable_menu_key";
- private boolean shouldEnableMenuKey() {
- final Resources res = getResources();
- final boolean configDisabled = res.getBoolean(R.bool.config_disableMenuKeyInLockScreen);
- final boolean isTestHarness = ActivityManager.isRunningInTestHarness();
- final boolean fileOverride = (new File(ENABLE_MENU_KEY_FILE)).exists();
- return !configDisabled || isTestHarness || fileOverride;
- }
-
- public boolean handleMenuKey() {
- // The following enables the MENU key to work for testing automation
- if (shouldEnableMenuKey()) {
- dismiss();
- return true;
- }
- return false;
- }
-
- public void setViewMediatorCallback(ViewMediatorCallback viewMediatorCallback) {
- mViewMediatorCallback = viewMediatorCallback;
- // Update ViewMediator with the current input method requirements
- mViewMediatorCallback.setNeedsInput(mSecurityContainer.needsInput());
- }
-
- protected KeyguardActivityLauncher getActivityLauncher() {
- return mActivityLauncher;
- }
-
- private final KeyguardActivityLauncher mActivityLauncher = new KeyguardActivityLauncher() {
- @Override
- Context getContext() {
- return mContext;
- }
-
- @Override
- void setOnDismissAction(OnDismissAction action) {
- KeyguardViewBase.this.setOnDismissAction(action);
- }
-
- @Override
- LockPatternUtils getLockPatternUtils() {
- return mLockPatternUtils;
- }
-
- @Override
- void requestDismissKeyguard() {
- KeyguardViewBase.this.dismiss(false);
- }
- };
-
- public void showAssistant() {
- final Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
- .getAssistIntent(mContext, true, UserHandle.USER_CURRENT);
-
- if (intent == null) return;
-
- final ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext,
- R.anim.keyguard_action_assist_enter, R.anim.keyguard_action_assist_exit,
- getHandler(), null);
-
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mActivityLauncher.launchActivityWithAnimation(intent, false, opts.toBundle(), null, null);
- }
-
- public void launchCamera() {
- mActivityLauncher.launchCamera(getHandler(), null);
- }
-
- public void setLockPatternUtils(LockPatternUtils utils) {
- mLockPatternUtils = utils;
- mSecurityContainer.setLockPatternUtils(utils);
- }
-
- public SecurityMode getSecurityMode() {
- return mSecurityContainer.getSecurityMode();
- }
-
- public SecurityMode getCurrentSecurityMode() {
- return mSecurityContainer.getCurrentSecurityMode();
- }
-
- protected abstract void onUserSwitching(boolean switching);
-
- protected abstract void onCreateOptions(Bundle options);
-
- protected abstract void onExternalMotionEvent(MotionEvent event);
-
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardViewStateManager.java b/packages/Keyguard/src/com/android/keyguard/KeyguardViewStateManager.java
deleted file mode 100644
index e47edf3..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardViewStateManager.java
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.keyguard;
-
-import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
-import android.animation.AnimatorListenerAdapter;
-import android.os.Handler;
-import android.os.Looper;
-import android.view.View;
-
-public class KeyguardViewStateManager implements
- SlidingChallengeLayout.OnChallengeScrolledListener,
- ChallengeLayout.OnBouncerStateChangedListener {
-
- private static final String TAG = "KeyguardViewStateManager";
- private KeyguardWidgetPager mKeyguardWidgetPager;
- private ChallengeLayout mChallengeLayout;
- private KeyguardHostView mKeyguardHostView;
- private int[] mTmpPoint = new int[2];
- private int[] mTmpLoc = new int[2];
-
- private KeyguardSecurityView mKeyguardSecurityContainer;
- private static final int SCREEN_ON_HINT_DURATION = 1000;
- private static final int SCREEN_ON_RING_HINT_DELAY = 300;
- private static final boolean SHOW_INITIAL_PAGE_HINTS = false;
- Handler mMainQueue = new Handler(Looper.myLooper());
-
- int mLastScrollState = SlidingChallengeLayout.SCROLL_STATE_IDLE;
-
- // Paged view state
- private int mPageListeningToSlider = -1;
- private int mCurrentPage = -1;
- private int mPageIndexOnPageBeginMoving = -1;
-
- int mChallengeTop = 0;
-
- private final AnimatorListener mPauseListener = new AnimatorListenerAdapter() {
- public void onAnimationEnd(Animator animation) {
- mKeyguardSecurityContainer.onPause();
- }
- };
-
- private final AnimatorListener mResumeListener = new AnimatorListenerAdapter() {
- public void onAnimationEnd(Animator animation) {
- if (((View)mKeyguardSecurityContainer).isShown()) {
- mKeyguardSecurityContainer.onResume(0);
- }
- }
- };
-
- public KeyguardViewStateManager(KeyguardHostView hostView) {
- mKeyguardHostView = hostView;
- }
-
- public void setPagedView(KeyguardWidgetPager pagedView) {
- mKeyguardWidgetPager = pagedView;
- updateEdgeSwiping();
- }
-
- public void setChallengeLayout(ChallengeLayout layout) {
- mChallengeLayout = layout;
- updateEdgeSwiping();
- }
-
- private void updateEdgeSwiping() {
- if (mChallengeLayout != null && mKeyguardWidgetPager != null) {
- if (mChallengeLayout.isChallengeOverlapping()) {
- mKeyguardWidgetPager.setOnlyAllowEdgeSwipes(true);
- } else {
- mKeyguardWidgetPager.setOnlyAllowEdgeSwipes(false);
- }
- }
- }
-
- public boolean isChallengeShowing() {
- if (mChallengeLayout != null) {
- return mChallengeLayout.isChallengeShowing();
- }
- return false;
- }
-
- public boolean isChallengeOverlapping() {
- if (mChallengeLayout != null) {
- return mChallengeLayout.isChallengeOverlapping();
- }
- return false;
- }
-
- public void setSecurityViewContainer(KeyguardSecurityView container) {
- mKeyguardSecurityContainer = container;
- }
-
- public void showBouncer(boolean show) {
- mChallengeLayout.showBouncer();
- }
-
- public boolean isBouncing() {
- return mChallengeLayout.isBouncing();
- }
-
- public void fadeOutSecurity(int duration) {
- ((View) mKeyguardSecurityContainer).animate().alpha(0f).setDuration(duration)
- .setListener(mPauseListener);
- }
-
- public void fadeInSecurity(int duration) {
- ((View) mKeyguardSecurityContainer).animate().alpha(1f).setDuration(duration)
- .setListener(mResumeListener);
- }
-
- public void onPageBeginMoving() {
- if (mChallengeLayout.isChallengeOverlapping() &&
- mChallengeLayout instanceof SlidingChallengeLayout) {
- SlidingChallengeLayout scl = (SlidingChallengeLayout) mChallengeLayout;
- scl.fadeOutChallenge();
- mPageIndexOnPageBeginMoving = mKeyguardWidgetPager.getCurrentPage();
- }
- // We use mAppWidgetToShow to show a particular widget after you add it--
- // once the user swipes a page we clear that behavior
- if (mKeyguardHostView != null) {
- mKeyguardHostView.clearAppWidgetToShow();
- mKeyguardHostView.setOnDismissAction(null);
- }
- if (mHideHintsRunnable != null) {
- mMainQueue.removeCallbacks(mHideHintsRunnable);
- mHideHintsRunnable = null;
- }
- }
-
- public void onPageEndMoving() {
- mPageIndexOnPageBeginMoving = -1;
- }
-
- public void onPageSwitching(View newPage, int newPageIndex) {
- if (mKeyguardWidgetPager != null && mChallengeLayout instanceof SlidingChallengeLayout) {
- boolean isCameraPage = newPage instanceof CameraWidgetFrame;
- if (isCameraPage) {
- CameraWidgetFrame camera = (CameraWidgetFrame) newPage;
- camera.setUseFastTransition(mKeyguardWidgetPager.isWarping());
- }
- SlidingChallengeLayout scl = (SlidingChallengeLayout) mChallengeLayout;
- scl.setChallengeInteractive(!isCameraPage);
- final int currentFlags = mKeyguardWidgetPager.getSystemUiVisibility();
- final int newFlags = isCameraPage ? (currentFlags | View.STATUS_BAR_DISABLE_SEARCH)
- : (currentFlags & ~View.STATUS_BAR_DISABLE_SEARCH);
- mKeyguardWidgetPager.setSystemUiVisibility(newFlags);
- }
-
- // If the page we're settling to is the same as we started on, and the action of
- // moving the page hid the security, we restore it immediately.
- if (mPageIndexOnPageBeginMoving == mKeyguardWidgetPager.getNextPage() &&
- mChallengeLayout instanceof SlidingChallengeLayout) {
- SlidingChallengeLayout scl = (SlidingChallengeLayout) mChallengeLayout;
- scl.fadeInChallenge();
- mKeyguardWidgetPager.setWidgetToResetOnPageFadeOut(-1);
- }
- mPageIndexOnPageBeginMoving = -1;
- }
-
- public void onPageSwitched(View newPage, int newPageIndex) {
- // Reset the previous page size and ensure the current page is sized appropriately.
- // We only modify the page state if it is not currently under control by the slider.
- // This prevents conflicts.
-
- // If the page hasn't switched, don't bother with any of this
- if (mCurrentPage == newPageIndex) return;
-
- if (mKeyguardWidgetPager != null && mChallengeLayout != null) {
- KeyguardWidgetFrame prevPage = mKeyguardWidgetPager.getWidgetPageAt(mCurrentPage);
- if (prevPage != null && mCurrentPage != mPageListeningToSlider && mCurrentPage
- != mKeyguardWidgetPager.getWidgetToResetOnPageFadeOut()) {
- prevPage.resetSize();
- }
-
- KeyguardWidgetFrame newCurPage = mKeyguardWidgetPager.getWidgetPageAt(newPageIndex);
- boolean challengeOverlapping = mChallengeLayout.isChallengeOverlapping();
- if (challengeOverlapping && !newCurPage.isSmall()
- && mPageListeningToSlider != newPageIndex) {
- newCurPage.shrinkWidget(true);
- }
- }
-
- mCurrentPage = newPageIndex;
- }
-
- public void onPageBeginWarp() {
- fadeOutSecurity(SlidingChallengeLayout.CHALLENGE_FADE_OUT_DURATION);
- View frame = mKeyguardWidgetPager.getPageAt(mKeyguardWidgetPager.getPageWarpIndex());
- ((KeyguardWidgetFrame)frame).showFrame(this);
- }
-
- public void onPageEndWarp() {
- fadeInSecurity(SlidingChallengeLayout.CHALLENGE_FADE_IN_DURATION);
- View frame = mKeyguardWidgetPager.getPageAt(mKeyguardWidgetPager.getPageWarpIndex());
- ((KeyguardWidgetFrame)frame).hideFrame(this);
- }
-
- private int getChallengeTopRelativeToFrame(KeyguardWidgetFrame frame, int top) {
- mTmpPoint[0] = 0;
- mTmpPoint[1] = top;
- mapPoint((View) mChallengeLayout, frame, mTmpPoint);
- return mTmpPoint[1];
- }
-
- /**
- * Simple method to map a point from one view's coordinates to another's. Note: this method
- * doesn't account for transforms, so if the views will be transformed, this should not be used.
- *
- * @param fromView The view to which the point is relative
- * @param toView The view into which the point should be mapped
- * @param pt The point
- */
- private void mapPoint(View fromView, View toView, int pt[]) {
- fromView.getLocationInWindow(mTmpLoc);
-
- int x = mTmpLoc[0];
- int y = mTmpLoc[1];
-
- toView.getLocationInWindow(mTmpLoc);
- int vX = mTmpLoc[0];
- int vY = mTmpLoc[1];
-
- pt[0] += x - vX;
- pt[1] += y - vY;
- }
-
- private void userActivity() {
- if (mKeyguardHostView != null) {
- mKeyguardHostView.onUserActivityTimeoutChanged();
- mKeyguardHostView.userActivity();
- }
- }
-
- @Override
- public void onScrollStateChanged(int scrollState) {
- if (mKeyguardWidgetPager == null || mChallengeLayout == null) return;
-
- boolean challengeOverlapping = mChallengeLayout.isChallengeOverlapping();
-
- if (scrollState == SlidingChallengeLayout.SCROLL_STATE_IDLE) {
- KeyguardWidgetFrame frame = mKeyguardWidgetPager.getWidgetPageAt(mPageListeningToSlider);
- if (frame == null) return;
-
- if (!challengeOverlapping) {
- if (!mKeyguardWidgetPager.isPageMoving()) {
- frame.resetSize();
- userActivity();
- } else {
- mKeyguardWidgetPager.setWidgetToResetOnPageFadeOut(mPageListeningToSlider);
- }
- }
- if (frame.isSmall()) {
- // This is to make sure that if the scroller animation gets cut off midway
- // that the frame doesn't stay in a partial down position.
- frame.setFrameHeight(frame.getSmallFrameHeight());
- }
- if (scrollState != SlidingChallengeLayout.SCROLL_STATE_FADING) {
- frame.hideFrame(this);
- }
- updateEdgeSwiping();
-
- if (mChallengeLayout.isChallengeShowing()) {
- mKeyguardSecurityContainer.onResume(KeyguardSecurityView.VIEW_REVEALED);
- } else {
- mKeyguardSecurityContainer.onPause();
- }
- mPageListeningToSlider = -1;
- } else if (mLastScrollState == SlidingChallengeLayout.SCROLL_STATE_IDLE) {
- // Whether dragging or settling, if the last state was idle, we use this signal
- // to update the current page who will receive events from the sliding challenge.
- // We resize the frame as appropriate.
- mPageListeningToSlider = mKeyguardWidgetPager.getNextPage();
- KeyguardWidgetFrame frame = mKeyguardWidgetPager.getWidgetPageAt(mPageListeningToSlider);
- if (frame == null) return;
-
- // Skip showing the frame and shrinking the widget if we are
- if (!mChallengeLayout.isBouncing()) {
- if (scrollState != SlidingChallengeLayout.SCROLL_STATE_FADING) {
- frame.showFrame(this);
- }
-
- // As soon as the security begins sliding, the widget becomes small (if it wasn't
- // small to begin with).
- if (!frame.isSmall()) {
- // We need to fetch the final page, in case the pages are in motion.
- mPageListeningToSlider = mKeyguardWidgetPager.getNextPage();
- frame.shrinkWidget(false);
- }
- } else {
- if (!frame.isSmall()) {
- // We need to fetch the final page, in case the pages are in motion.
- mPageListeningToSlider = mKeyguardWidgetPager.getNextPage();
- }
- }
-
- // View is on the move. Pause the security view until it completes.
- mKeyguardSecurityContainer.onPause();
- }
- mLastScrollState = scrollState;
- }
-
- @Override
- public void onScrollPositionChanged(float scrollPosition, int challengeTop) {
- mChallengeTop = challengeTop;
- KeyguardWidgetFrame frame = mKeyguardWidgetPager.getWidgetPageAt(mPageListeningToSlider);
- if (frame != null && mLastScrollState != SlidingChallengeLayout.SCROLL_STATE_FADING) {
- frame.adjustFrame(getChallengeTopRelativeToFrame(frame, mChallengeTop));
- }
- }
-
- private Runnable mHideHintsRunnable = new Runnable() {
- @Override
- public void run() {
- if (mKeyguardWidgetPager != null) {
- mKeyguardWidgetPager.hideOutlinesAndSidePages();
- }
- }
- };
-
- public void showUsabilityHints() {
- mMainQueue.postDelayed( new Runnable() {
- @Override
- public void run() {
- mKeyguardSecurityContainer.showUsabilityHint();
- }
- } , SCREEN_ON_RING_HINT_DELAY);
- if (SHOW_INITIAL_PAGE_HINTS) {
- mKeyguardWidgetPager.showInitialPageHints();
- }
- if (mHideHintsRunnable != null) {
- mMainQueue.postDelayed(mHideHintsRunnable, SCREEN_ON_HINT_DURATION);
- }
- }
-
- // ChallengeLayout.OnBouncerStateChangedListener
- @Override
- public void onBouncerStateChanged(boolean bouncerActive) {
- if (bouncerActive) {
- mKeyguardWidgetPager.zoomOutToBouncer();
- } else {
- mKeyguardWidgetPager.zoomInFromBouncer();
- if (mKeyguardHostView != null) {
- mKeyguardHostView.setOnDismissAction(null);
- }
- }
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetCarousel.java b/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetCarousel.java
deleted file mode 100644
index 98b31b7..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetCarousel.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.keyguard;
-
-import android.animation.Animator;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.animation.PropertyValuesHolder;
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.Interpolator;
-
-import java.util.ArrayList;
-
-public class KeyguardWidgetCarousel extends KeyguardWidgetPager {
-
- private float mAdjacentPagesAngle;
- private static float MAX_SCROLL_PROGRESS = 1.3f;
- private static float CAMERA_DISTANCE = 10000;
- protected AnimatorSet mChildrenTransformsAnimator;
- float[] mTmpTransform = new float[3];
-
- public KeyguardWidgetCarousel(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public KeyguardWidgetCarousel(Context context) {
- this(context, null, 0);
- }
-
- public KeyguardWidgetCarousel(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- mAdjacentPagesAngle = context.getResources().getInteger(R.integer.kg_carousel_angle);
- }
-
- protected float getMaxScrollProgress() {
- return MAX_SCROLL_PROGRESS;
- }
-
- public float getAlphaForPage(int screenCenter, int index, boolean showSidePages) {
- View child = getChildAt(index);
- if (child == null) return 0f;
-
- boolean inVisibleRange = index >= getNextPage() - 1 && index <= getNextPage() + 1;
- float scrollProgress = getScrollProgress(screenCenter, child, index);
-
- if (isOverScrollChild(index, scrollProgress)) {
- return 1.0f;
- } else if ((showSidePages && inVisibleRange) || index == getNextPage()) {
- scrollProgress = getBoundedScrollProgress(screenCenter, child, index);
- float alpha = 1.0f - 1.0f * Math.abs(scrollProgress / MAX_SCROLL_PROGRESS);
- return alpha;
- } else {
- return 0f;
- }
- }
-
- public float getOutlineAlphaForPage(int screenCenter, int index, boolean showSidePages) {
- boolean inVisibleRange = index >= getNextPage() - 1 && index <= getNextPage() + 1;
- if (inVisibleRange) {
- return super.getOutlineAlphaForPage(screenCenter, index, showSidePages);
- } else {
- return 0f;
- }
- }
-
- private void updatePageAlphaValues(int screenCenter) {
- if (mChildrenOutlineFadeAnimation != null) {
- mChildrenOutlineFadeAnimation.cancel();
- mChildrenOutlineFadeAnimation = null;
- }
- boolean showSidePages = mShowingInitialHints || isPageMoving();
- if (!isReordering(false)) {
- for (int i = 0; i < getChildCount(); i++) {
- KeyguardWidgetFrame child = getWidgetPageAt(i);
- if (child != null) {
- float outlineAlpha = getOutlineAlphaForPage(screenCenter, i, showSidePages);
- float contentAlpha = getAlphaForPage(screenCenter, i,showSidePages);
- child.setBackgroundAlpha(outlineAlpha);
- child.setContentAlpha(contentAlpha);
- }
- }
- }
- }
-
- public void showInitialPageHints() {
- mShowingInitialHints = true;
- int count = getChildCount();
- for (int i = 0; i < count; i++) {
- boolean inVisibleRange = i >= getNextPage() - 1 && i <= getNextPage() + 1;
- KeyguardWidgetFrame child = getWidgetPageAt(i);
- if (inVisibleRange) {
- child.setBackgroundAlpha(KeyguardWidgetFrame.OUTLINE_ALPHA_MULTIPLIER);
- child.setContentAlpha(1f);
- } else {
- child.setBackgroundAlpha(0f);
- child.setContentAlpha(0f);
- }
- }
- }
-
- @Override
- protected void screenScrolled(int screenCenter) {
- mScreenCenter = screenCenter;
- updatePageAlphaValues(screenCenter);
- if (isReordering(false)) return;
- for (int i = 0; i < getChildCount(); i++) {
- KeyguardWidgetFrame v = getWidgetPageAt(i);
- float scrollProgress = getScrollProgress(screenCenter, v, i);
- float boundedProgress = getBoundedScrollProgress(screenCenter, v, i);
- if (v == mDragView || v == null) continue;
- v.setCameraDistance(CAMERA_DISTANCE);
-
- if (isOverScrollChild(i, scrollProgress)) {
- v.setRotationY(- OVERSCROLL_MAX_ROTATION * scrollProgress);
- v.setOverScrollAmount(Math.abs(scrollProgress), scrollProgress < 0);
- } else {
- int width = v.getMeasuredWidth();
- float pivotX = (width / 2f) + boundedProgress * (width / 2f);
- float pivotY = v.getMeasuredHeight() / 2;
- float rotationY = - mAdjacentPagesAngle * boundedProgress;
- v.setPivotX(pivotX);
- v.setPivotY(pivotY);
- v.setRotationY(rotationY);
- v.setOverScrollAmount(0f, false);
- }
- float alpha = v.getAlpha();
- // If the view has 0 alpha, we set it to be invisible so as to prevent
- // it from accepting touches
- if (alpha == 0) {
- v.setVisibility(INVISIBLE);
- } else if (v.getVisibility() != VISIBLE) {
- v.setVisibility(VISIBLE);
- }
- }
- }
-
- void animatePagesToNeutral() {
- if (mChildrenTransformsAnimator != null) {
- mChildrenTransformsAnimator.cancel();
- mChildrenTransformsAnimator = null;
- }
-
- int count = getChildCount();
- PropertyValuesHolder alpha;
- PropertyValuesHolder outlineAlpha;
- PropertyValuesHolder rotationY;
- ArrayList<Animator> anims = new ArrayList<Animator>();
-
- for (int i = 0; i < count; i++) {
- KeyguardWidgetFrame child = getWidgetPageAt(i);
- boolean inVisibleRange = (i >= mCurrentPage - 1 && i <= mCurrentPage + 1);
- if (!inVisibleRange) {
- child.setRotationY(0f);
- }
- alpha = PropertyValuesHolder.ofFloat("contentAlpha", 1.0f);
- outlineAlpha = PropertyValuesHolder.ofFloat("backgroundAlpha",
- KeyguardWidgetFrame.OUTLINE_ALPHA_MULTIPLIER);
- rotationY = PropertyValuesHolder.ofFloat("rotationY", 0f);
- ObjectAnimator a = ObjectAnimator.ofPropertyValuesHolder(child, alpha, outlineAlpha, rotationY);
- child.setVisibility(VISIBLE);
- if (!inVisibleRange) {
- a.setInterpolator(mSlowFadeInterpolator);
- }
- anims.add(a);
- }
-
- int duration = REORDERING_ZOOM_IN_OUT_DURATION;
- mChildrenTransformsAnimator = new AnimatorSet();
- mChildrenTransformsAnimator.playTogether(anims);
-
- mChildrenTransformsAnimator.setDuration(duration);
- mChildrenTransformsAnimator.start();
- }
-
- private void getTransformForPage(int screenCenter, int index, float[] transform) {
- View child = getChildAt(index);
- float boundedProgress = getBoundedScrollProgress(screenCenter, child, index);
- float rotationY = - mAdjacentPagesAngle * boundedProgress;
- int width = child.getMeasuredWidth();
- float pivotX = (width / 2f) + boundedProgress * (width / 2f);
- float pivotY = child.getMeasuredHeight() / 2;
-
- transform[0] = pivotX;
- transform[1] = pivotY;
- transform[2] = rotationY;
- }
-
- Interpolator mFastFadeInterpolator = new Interpolator() {
- Interpolator mInternal = new DecelerateInterpolator(1.5f);
- float mFactor = 2.5f;
- @Override
- public float getInterpolation(float input) {
- return mInternal.getInterpolation(Math.min(mFactor * input, 1f));
- }
- };
-
- Interpolator mSlowFadeInterpolator = new Interpolator() {
- Interpolator mInternal = new AccelerateInterpolator(1.5f);
- float mFactor = 1.3f;
- @Override
- public float getInterpolation(float input) {
- input -= (1 - 1 / mFactor);
- input = mFactor * Math.max(input, 0f);
- return mInternal.getInterpolation(input);
- }
- };
-
- void animatePagesToCarousel() {
- if (mChildrenTransformsAnimator != null) {
- mChildrenTransformsAnimator.cancel();
- mChildrenTransformsAnimator = null;
- }
-
- int count = getChildCount();
- PropertyValuesHolder alpha;
- PropertyValuesHolder outlineAlpha;
- PropertyValuesHolder rotationY;
- PropertyValuesHolder pivotX;
- PropertyValuesHolder pivotY;
- ArrayList<Animator> anims = new ArrayList<Animator>();
-
- for (int i = 0; i < count; i++) {
- KeyguardWidgetFrame child = getWidgetPageAt(i);
- float finalAlpha = getAlphaForPage(mScreenCenter, i, true);
- float finalOutlineAlpha = getOutlineAlphaForPage(mScreenCenter, i, true);
- getTransformForPage(mScreenCenter, i, mTmpTransform);
-
- boolean inVisibleRange = (i >= mCurrentPage - 1 && i <= mCurrentPage + 1);
-
- ObjectAnimator a;
- alpha = PropertyValuesHolder.ofFloat("contentAlpha", finalAlpha);
- outlineAlpha = PropertyValuesHolder.ofFloat("backgroundAlpha", finalOutlineAlpha);
- pivotX = PropertyValuesHolder.ofFloat("pivotX", mTmpTransform[0]);
- pivotY = PropertyValuesHolder.ofFloat("pivotY", mTmpTransform[1]);
- rotationY = PropertyValuesHolder.ofFloat("rotationY", mTmpTransform[2]);
-
- if (inVisibleRange) {
- // for the central pages we animate into a rotated state
- a = ObjectAnimator.ofPropertyValuesHolder(child, alpha, outlineAlpha,
- pivotX, pivotY, rotationY);
- } else {
- a = ObjectAnimator.ofPropertyValuesHolder(child, alpha, outlineAlpha);
- a.setInterpolator(mFastFadeInterpolator);
- }
- anims.add(a);
- }
-
- int duration = REORDERING_ZOOM_IN_OUT_DURATION;
- mChildrenTransformsAnimator = new AnimatorSet();
- mChildrenTransformsAnimator.playTogether(anims);
-
- mChildrenTransformsAnimator.setDuration(duration);
- mChildrenTransformsAnimator.start();
- }
-
- protected void reorderStarting() {
- mViewStateManager.fadeOutSecurity(REORDERING_ZOOM_IN_OUT_DURATION);
- animatePagesToNeutral();
- }
-
- protected boolean zoomIn(final Runnable onCompleteRunnable) {
- animatePagesToCarousel();
- return super.zoomIn(onCompleteRunnable);
- }
-
- @Override
- protected void onEndReordering() {
- super.onEndReordering();
- mViewStateManager.fadeInSecurity(REORDERING_ZOOM_IN_OUT_DURATION);
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetFrame.java b/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetFrame.java
deleted file mode 100644
index 8ee9b61..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetFrame.java
+++ /dev/null
@@ -1,519 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-import android.animation.Animator;
-import android.animation.ObjectAnimator;
-import android.animation.PropertyValuesHolder;
-import android.appwidget.AppWidgetHostView;
-import android.appwidget.AppWidgetManager;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.LinearGradient;
-import android.graphics.Paint;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.Rect;
-import android.graphics.Shader;
-import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.FrameLayout;
-
-public class KeyguardWidgetFrame extends FrameLayout {
- private final static PorterDuffXfermode sAddBlendMode =
- new PorterDuffXfermode(PorterDuff.Mode.ADD);
-
- static final float OUTLINE_ALPHA_MULTIPLIER = 0.6f;
- static final int HOVER_OVER_DELETE_DROP_TARGET_OVERLAY_COLOR = 0x99FF0000;
-
- // Temporarily disable this for the time being until we know why the gfx is messing up
- static final boolean ENABLE_HOVER_OVER_DELETE_DROP_TARGET_OVERLAY = true;
-
- private int mGradientColor;
- private LinearGradient mForegroundGradient;
- private LinearGradient mLeftToRightGradient;
- private LinearGradient mRightToLeftGradient;
- private Paint mGradientPaint = new Paint();
- boolean mLeftToRight = true;
-
- private float mOverScrollAmount = 0f;
- private final Rect mForegroundRect = new Rect();
- private int mForegroundAlpha = 0;
- private CheckLongPressHelper mLongPressHelper;
- private Animator mFrameFade;
- private boolean mIsSmall = false;
- private Handler mWorkerHandler;
-
- private float mBackgroundAlpha;
- private float mContentAlpha;
- private float mBackgroundAlphaMultiplier = 1.0f;
- private Drawable mBackgroundDrawable;
- private Rect mBackgroundRect = new Rect();
-
- // These variables are all needed in order to size things properly before we're actually
- // measured.
- private int mSmallWidgetHeight;
- private int mSmallFrameHeight;
- private boolean mWidgetLockedSmall = false;
- private int mMaxChallengeTop = -1;
- private int mFrameStrokeAdjustment;
- private boolean mPerformAppWidgetSizeUpdateOnBootComplete;
-
- // This will hold the width value before we've actually been measured
- private int mFrameHeight;
-
- private boolean mIsHoveringOverDeleteDropTarget;
-
- // Multiple callers may try and adjust the alpha of the frame. When a caller shows
- // the outlines, we give that caller control, and nobody else can fade them out.
- // This prevents animation conflicts.
- private Object mBgAlphaController;
-
- public KeyguardWidgetFrame(Context context) {
- this(context, null, 0);
- }
-
- public KeyguardWidgetFrame(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public KeyguardWidgetFrame(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- mLongPressHelper = new CheckLongPressHelper(this);
-
- Resources res = context.getResources();
- // TODO: this padding should really correspond to the padding embedded in the background
- // drawable (ie. outlines).
- float density = res.getDisplayMetrics().density;
- int padding = (int) (res.getDisplayMetrics().density * 8);
- setPadding(padding, padding, padding, padding);
-
- mFrameStrokeAdjustment = 2 + (int) (2 * density);
-
- // This will be overriden on phones based on the current security mode, however on tablets
- // we need to specify a height.
- mSmallWidgetHeight =
- res.getDimensionPixelSize(R.dimen.kg_small_widget_height);
- mBackgroundDrawable = res.getDrawable(R.drawable.kg_widget_bg_padded);
- mGradientColor = res.getColor(R.color.kg_widget_pager_gradient);
- mGradientPaint.setXfermode(sAddBlendMode);
- }
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- cancelLongPress();
- KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallbacks);
-
- }
-
- @Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
- KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallbacks);
- }
-
- private KeyguardUpdateMonitorCallback mUpdateMonitorCallbacks =
- new KeyguardUpdateMonitorCallback() {
- @Override
- public void onBootCompleted() {
- if (mPerformAppWidgetSizeUpdateOnBootComplete) {
- performAppWidgetSizeCallbacksIfNecessary();
- mPerformAppWidgetSizeUpdateOnBootComplete = false;
- }
- }
- };
-
- void setIsHoveringOverDeleteDropTarget(boolean isHovering) {
- if (ENABLE_HOVER_OVER_DELETE_DROP_TARGET_OVERLAY) {
- if (mIsHoveringOverDeleteDropTarget != isHovering) {
- mIsHoveringOverDeleteDropTarget = isHovering;
- int resId = isHovering ? R.string.keyguard_accessibility_delete_widget_start
- : R.string.keyguard_accessibility_delete_widget_end;
- String text = getContext().getResources().getString(resId, getContentDescription());
- announceForAccessibility(text);
- invalidate();
- }
- }
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- // Watch for longpress events at this level to make sure
- // users can always pick up this widget
- switch (ev.getAction()) {
- case MotionEvent.ACTION_DOWN:
- mLongPressHelper.postCheckForLongPress(ev);
- break;
- case MotionEvent.ACTION_MOVE:
- mLongPressHelper.onMove(ev);
- break;
- case MotionEvent.ACTION_POINTER_DOWN:
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_CANCEL:
- mLongPressHelper.cancelLongPress();
- break;
- }
-
- // Otherwise continue letting touch events fall through to children
- return false;
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- // Watch for longpress events at this level to make sure
- // users can always pick up this widget
- switch (ev.getAction()) {
- case MotionEvent.ACTION_MOVE:
- mLongPressHelper.onMove(ev);
- break;
- case MotionEvent.ACTION_POINTER_DOWN:
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_CANCEL:
- mLongPressHelper.cancelLongPress();
- break;
- }
-
- // We return true here to ensure that we will get cancel / up signal
- // even if none of our children have requested touch.
- return true;
- }
-
- @Override
- public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
- super.requestDisallowInterceptTouchEvent(disallowIntercept);
- cancelLongPress();
- }
-
- @Override
- public void cancelLongPress() {
- super.cancelLongPress();
- mLongPressHelper.cancelLongPress();
- }
-
-
- private void drawGradientOverlay(Canvas c) {
- mGradientPaint.setShader(mForegroundGradient);
- mGradientPaint.setAlpha(mForegroundAlpha);
- c.drawRect(mForegroundRect, mGradientPaint);
- }
-
- private void drawHoveringOverDeleteOverlay(Canvas c) {
- if (mIsHoveringOverDeleteDropTarget) {
- c.drawColor(HOVER_OVER_DELETE_DROP_TARGET_OVERLAY_COLOR);
- }
- }
-
- protected void drawBg(Canvas canvas) {
- if (mBackgroundAlpha > 0.0f) {
- Drawable bg = mBackgroundDrawable;
-
- bg.setAlpha((int) (mBackgroundAlpha * mBackgroundAlphaMultiplier * 255));
- bg.setBounds(mBackgroundRect);
- bg.draw(canvas);
- }
- }
-
- @Override
- protected void dispatchDraw(Canvas canvas) {
- if (ENABLE_HOVER_OVER_DELETE_DROP_TARGET_OVERLAY) {
- canvas.save();
- }
- drawBg(canvas);
- super.dispatchDraw(canvas);
- drawGradientOverlay(canvas);
- if (ENABLE_HOVER_OVER_DELETE_DROP_TARGET_OVERLAY) {
- drawHoveringOverDeleteOverlay(canvas);
- canvas.restore();
- }
- }
-
- /**
- * Because this view has fading outlines, it is essential that we enable hardware
- * layers on the content (child) so that updating the alpha of the outlines doesn't
- * result in the content layer being recreated.
- */
- public void enableHardwareLayersForContent() {
- View widget = getContent();
- if (widget != null && widget.isHardwareAccelerated()) {
- widget.setLayerType(LAYER_TYPE_HARDWARE, null);
- }
- }
-
- /**
- * Because this view has fading outlines, it is essential that we enable hardware
- * layers on the content (child) so that updating the alpha of the outlines doesn't
- * result in the content layer being recreated.
- */
- public void disableHardwareLayersForContent() {
- View widget = getContent();
- if (widget != null) {
- widget.setLayerType(LAYER_TYPE_NONE, null);
- }
- }
-
- public View getContent() {
- return getChildAt(0);
- }
-
- public int getContentAppWidgetId() {
- View content = getContent();
- if (content instanceof AppWidgetHostView) {
- return ((AppWidgetHostView) content).getAppWidgetId();
- } else if (content instanceof KeyguardStatusView) {
- return ((KeyguardStatusView) content).getAppWidgetId();
- } else {
- return AppWidgetManager.INVALID_APPWIDGET_ID;
- }
- }
-
- public float getBackgroundAlpha() {
- return mBackgroundAlpha;
- }
-
- public void setBackgroundAlphaMultiplier(float multiplier) {
- if (Float.compare(mBackgroundAlphaMultiplier, multiplier) != 0) {
- mBackgroundAlphaMultiplier = multiplier;
- invalidate();
- }
- }
-
- public float getBackgroundAlphaMultiplier() {
- return mBackgroundAlphaMultiplier;
- }
-
- public void setBackgroundAlpha(float alpha) {
- if (Float.compare(mBackgroundAlpha, alpha) != 0) {
- mBackgroundAlpha = alpha;
- invalidate();
- }
- }
-
- public float getContentAlpha() {
- return mContentAlpha;
- }
-
- public void setContentAlpha(float alpha) {
- mContentAlpha = alpha;
- View content = getContent();
- if (content != null) {
- content.setAlpha(alpha);
- }
- }
-
- /**
- * Depending on whether the security is up, the widget size needs to change
- *
- * @param height The height of the widget, -1 for full height
- */
- private void setWidgetHeight(int height) {
- boolean needLayout = false;
- View widget = getContent();
- if (widget != null) {
- LayoutParams lp = (LayoutParams) widget.getLayoutParams();
- if (lp.height != height) {
- needLayout = true;
- lp.height = height;
- }
- }
- if (needLayout) {
- requestLayout();
- }
- }
-
- public void setMaxChallengeTop(int top) {
- boolean dirty = mMaxChallengeTop != top;
- mMaxChallengeTop = top;
- mSmallWidgetHeight = top - getPaddingTop();
- mSmallFrameHeight = top + getPaddingBottom();
- if (dirty && mIsSmall) {
- setWidgetHeight(mSmallWidgetHeight);
- setFrameHeight(mSmallFrameHeight);
- } else if (dirty && mWidgetLockedSmall) {
- setWidgetHeight(mSmallWidgetHeight);
- }
- }
-
- public boolean isSmall() {
- return mIsSmall;
- }
-
- public void adjustFrame(int challengeTop) {
- int frameHeight = challengeTop + getPaddingBottom();
- setFrameHeight(frameHeight);
- }
-
- public void shrinkWidget(boolean alsoShrinkFrame) {
- mIsSmall = true;
- setWidgetHeight(mSmallWidgetHeight);
-
- if (alsoShrinkFrame) {
- setFrameHeight(mSmallFrameHeight);
- }
- }
-
- public int getSmallFrameHeight() {
- return mSmallFrameHeight;
- }
-
- public void setWidgetLockedSmall(boolean locked) {
- if (locked) {
- setWidgetHeight(mSmallWidgetHeight);
- }
- mWidgetLockedSmall = locked;
- }
-
- public void resetSize() {
- mIsSmall = false;
- if (!mWidgetLockedSmall) {
- setWidgetHeight(LayoutParams.MATCH_PARENT);
- }
- setFrameHeight(getMeasuredHeight());
- }
-
- public void setFrameHeight(int height) {
- mFrameHeight = height;
- mBackgroundRect.set(0, 0, getMeasuredWidth(), Math.min(mFrameHeight, getMeasuredHeight()));
- mForegroundRect.set(mFrameStrokeAdjustment, mFrameStrokeAdjustment,getMeasuredWidth() -
- mFrameStrokeAdjustment, Math.min(getMeasuredHeight(), mFrameHeight) -
- mFrameStrokeAdjustment);
- updateGradient();
- invalidate();
- }
-
- public void hideFrame(Object caller) {
- fadeFrame(caller, false, 0f, KeyguardWidgetPager.CHILDREN_OUTLINE_FADE_OUT_DURATION);
- }
-
- public void showFrame(Object caller) {
- fadeFrame(caller, true, OUTLINE_ALPHA_MULTIPLIER,
- KeyguardWidgetPager.CHILDREN_OUTLINE_FADE_IN_DURATION);
- }
-
- public void fadeFrame(Object caller, boolean takeControl, float alpha, int duration) {
- if (takeControl) {
- mBgAlphaController = caller;
- }
-
- if (mBgAlphaController != caller && mBgAlphaController != null) {
- return;
- }
-
- if (mFrameFade != null) {
- mFrameFade.cancel();
- mFrameFade = null;
- }
- PropertyValuesHolder bgAlpha = PropertyValuesHolder.ofFloat("backgroundAlpha", alpha);
- mFrameFade = ObjectAnimator.ofPropertyValuesHolder(this, bgAlpha);
- mFrameFade.setDuration(duration);
- mFrameFade.start();
- }
-
- private void updateGradient() {
- float x0 = mLeftToRight ? 0 : mForegroundRect.width();
- float x1 = mLeftToRight ? mForegroundRect.width(): 0;
- mLeftToRightGradient = new LinearGradient(x0, 0f, x1, 0f,
- mGradientColor, 0, Shader.TileMode.CLAMP);
- mRightToLeftGradient = new LinearGradient(x1, 0f, x0, 0f,
- mGradientColor, 0, Shader.TileMode.CLAMP);
- }
-
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- super.onSizeChanged(w, h, oldw, oldh);
-
- if (!mIsSmall) {
- mFrameHeight = h;
- }
-
- // mFrameStrokeAdjustment is a cludge to prevent the overlay from drawing outside the
- // rounded rect background.
- mForegroundRect.set(mFrameStrokeAdjustment, mFrameStrokeAdjustment,
- w - mFrameStrokeAdjustment, Math.min(h, mFrameHeight) - mFrameStrokeAdjustment);
-
- mBackgroundRect.set(0, 0, getMeasuredWidth(), Math.min(h, mFrameHeight));
- updateGradient();
- invalidate();
- }
-
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- performAppWidgetSizeCallbacksIfNecessary();
- }
-
- private void performAppWidgetSizeCallbacksIfNecessary() {
- View content = getContent();
- if (!(content instanceof AppWidgetHostView)) return;
-
- if (!KeyguardUpdateMonitor.getInstance(mContext).hasBootCompleted()) {
- mPerformAppWidgetSizeUpdateOnBootComplete = true;
- return;
- }
-
- // TODO: there's no reason to force the AppWidgetHostView to catch duplicate size calls.
- // We can do that even more cheaply here. It's not an issue right now since we're in the
- // system process and hence no binder calls.
- AppWidgetHostView awhv = (AppWidgetHostView) content;
- float density = getResources().getDisplayMetrics().density;
-
- int width = (int) (content.getMeasuredWidth() / density);
- int height = (int) (content.getMeasuredHeight() / density);
- awhv.updateAppWidgetSize(null, width, height, width, height, true);
- }
-
- void setOverScrollAmount(float r, boolean left) {
- if (Float.compare(mOverScrollAmount, r) != 0) {
- mOverScrollAmount = r;
- mForegroundGradient = left ? mLeftToRightGradient : mRightToLeftGradient;
- mForegroundAlpha = (int) Math.round((0.5f * r * 255));
-
- // We bump up the alpha of the outline to hide the fact that the overlay is drawing
- // over the rounded part of the frame.
- float bgAlpha = Math.min(OUTLINE_ALPHA_MULTIPLIER + r * (1 - OUTLINE_ALPHA_MULTIPLIER),
- 1f);
- setBackgroundAlpha(bgAlpha);
- invalidate();
- }
- }
-
- public void onActive(boolean isActive) {
- // hook for subclasses
- }
-
- public boolean onUserInteraction(MotionEvent event) {
- // hook for subclasses
- return false;
- }
-
- public void onBouncerShowing(boolean showing) {
- // hook for subclasses
- }
-
- public void setWorkerHandler(Handler workerHandler) {
- mWorkerHandler = workerHandler;
- }
-
- public Handler getWorkerHandler() {
- return mWorkerHandler;
- }
-
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetPager.java b/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetPager.java
deleted file mode 100644
index 6120127..0000000
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetPager.java
+++ /dev/null
@@ -1,967 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.keyguard;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.animation.PropertyValuesHolder;
-import android.animation.TimeInterpolator;
-import android.appwidget.AppWidgetHostView;
-import android.appwidget.AppWidgetManager;
-import android.appwidget.AppWidgetProviderInfo;
-import android.content.Context;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.text.format.DateFormat;
-import android.util.AttributeSet;
-import android.util.Slog;
-import android.view.Gravity;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnLongClickListener;
-import android.view.ViewGroup;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
-import android.view.animation.DecelerateInterpolator;
-import android.widget.FrameLayout;
-import android.widget.TextClock;
-
-import com.android.internal.widget.LockPatternUtils;
-
-import java.util.ArrayList;
-import java.util.TimeZone;
-
-public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwitchListener,
- OnLongClickListener, ChallengeLayout.OnBouncerStateChangedListener {
-
- ZInterpolator mZInterpolator = new ZInterpolator(0.5f);
- private static float CAMERA_DISTANCE = 10000;
- protected static float OVERSCROLL_MAX_ROTATION = 30;
- private static final boolean PERFORM_OVERSCROLL_ROTATION = true;
-
- private static final int FLAG_HAS_LOCAL_HOUR = 0x1;
- private static final int FLAG_HAS_LOCAL_MINUTE = 0x2;
-
- protected KeyguardViewStateManager mViewStateManager;
- private LockPatternUtils mLockPatternUtils;
-
- // Related to the fading in / out background outlines
- public static final int CHILDREN_OUTLINE_FADE_OUT_DURATION = 375;
- public static final int CHILDREN_OUTLINE_FADE_IN_DURATION = 100;
- protected AnimatorSet mChildrenOutlineFadeAnimation;
- protected int mScreenCenter;
- private boolean mHasMeasure = false;
- boolean showHintsAfterLayout = false;
-
- private static final long CUSTOM_WIDGET_USER_ACTIVITY_TIMEOUT = 30000;
- private static final String TAG = "KeyguardWidgetPager";
- private boolean mCenterSmallWidgetsVertically;
-
- private int mPage = 0;
- private Callbacks mCallbacks;
-
- private int mWidgetToResetAfterFadeOut;
- protected boolean mShowingInitialHints = false;
-
- // A temporary handle to the Add-Widget view
- private View mAddWidgetView;
- private int mLastWidthMeasureSpec;
- private int mLastHeightMeasureSpec;
-
- // Bouncer
- private int mBouncerZoomInOutDuration = 250;
- private float BOUNCER_SCALE_FACTOR = 0.67f;
-
- // Background worker thread: used here for persistence, also made available to widget frames
- private final HandlerThread mBackgroundWorkerThread;
- private final Handler mBackgroundWorkerHandler;
- private boolean mCameraEventInProgress;
-
- public KeyguardWidgetPager(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public KeyguardWidgetPager(Context context) {
- this(null, null, 0);
- }
-
- public KeyguardWidgetPager(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- if (getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
- setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
- }
-
- setPageSwitchListener(this);
-
- mBackgroundWorkerThread = new HandlerThread("KeyguardWidgetPager Worker");
- mBackgroundWorkerThread.start();
- mBackgroundWorkerHandler = new Handler(mBackgroundWorkerThread.getLooper());
- }
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
-
- // Clean up the worker thread
- mBackgroundWorkerThread.quit();
- }
-
- public void setViewStateManager(KeyguardViewStateManager viewStateManager) {
- mViewStateManager = viewStateManager;
- }
-
- public void setLockPatternUtils(LockPatternUtils l) {
- mLockPatternUtils = l;
- }
-
- @Override
- public void onPageSwitching(View newPage, int newPageIndex) {
- if (mViewStateManager != null) {
- mViewStateManager.onPageSwitching(newPage, newPageIndex);
- }
- }
-
- @Override
- public void onPageSwitched(View newPage, int newPageIndex) {
- boolean showingClock = false;
- if (newPage instanceof ViewGroup) {
- ViewGroup vg = (ViewGroup) newPage;
- if (vg.getChildAt(0) instanceof KeyguardStatusView) {
- showingClock = true;
- }
- }
-
- if (newPage != null &&
- findClockInHierarchy(newPage) == (FLAG_HAS_LOCAL_HOUR | FLAG_HAS_LOCAL_MINUTE)) {
- showingClock = true;
- }
-
- // Disable the status bar clock if we're showing the default status widget
- if (showingClock) {
- setSystemUiVisibility(getSystemUiVisibility() | View.STATUS_BAR_DISABLE_CLOCK);
- } else {
- setSystemUiVisibility(getSystemUiVisibility() & ~View.STATUS_BAR_DISABLE_CLOCK);
- }
-
- // Extend the display timeout if the user switches pages
- if (mPage != newPageIndex) {
- int oldPageIndex = mPage;
- mPage = newPageIndex;
- userActivity();
- KeyguardWidgetFrame oldWidgetPage = getWidgetPageAt(oldPageIndex);
- if (oldWidgetPage != null) {
- oldWidgetPage.onActive(false);
- }
- KeyguardWidgetFrame newWidgetPage = getWidgetPageAt(newPageIndex);
- if (newWidgetPage != null) {
- newWidgetPage.onActive(true);
- newWidgetPage.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
- newWidgetPage.requestAccessibilityFocus();
- }
- if (mParent != null && AccessibilityManager.getInstance(mContext).isEnabled()) {
- AccessibilityEvent event = AccessibilityEvent.obtain(
- AccessibilityEvent.TYPE_VIEW_SCROLLED);
- onInitializeAccessibilityEvent(event);
- onPopulateAccessibilityEvent(event);
- mParent.requestSendAccessibilityEvent(this, event);
- }
- }
- if (mViewStateManager != null) {
- mViewStateManager.onPageSwitched(newPage, newPageIndex);
- }
- }
-
- @Override
- public void onPageBeginWarp() {
- showOutlinesAndSidePages();
- mViewStateManager.onPageBeginWarp();
- }
-
- @Override
- public void onPageEndWarp() {
- // if we're moving to the warp page, then immediately hide the other widgets.
- int duration = getPageWarpIndex() == getNextPage() ? 0 : -1;
- animateOutlinesAndSidePages(false, duration);
- mViewStateManager.onPageEndWarp();
- }
-
- @Override
- public void sendAccessibilityEvent(int eventType) {
- if (eventType != AccessibilityEvent.TYPE_VIEW_SCROLLED || isPageMoving()) {
- super.sendAccessibilityEvent(eventType);
- }
- }
-
- private void updateWidgetFramesImportantForAccessibility() {
- final int pageCount = getPageCount();
- for (int i = 0; i < pageCount; i++) {
- KeyguardWidgetFrame frame = getWidgetPageAt(i);
- updateWidgetFrameImportantForAccessibility(frame);
- }
- }
-
- private void updateWidgetFrameImportantForAccessibility(KeyguardWidgetFrame frame) {
- if (frame.getContentAlpha() <= 0) {
- frame.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
- } else {
- frame.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
- }
- }
-
- private void userActivity() {
- if (mCallbacks != null) {
- mCallbacks.onUserActivityTimeoutChanged();
- mCallbacks.userActivity();
- }
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- return captureUserInteraction(ev) || super.onTouchEvent(ev);
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- return captureUserInteraction(ev) || super.onInterceptTouchEvent(ev);
- }
-
- private boolean captureUserInteraction(MotionEvent ev) {
- KeyguardWidgetFrame currentWidgetPage = getWidgetPageAt(getCurrentPage());
- return currentWidgetPage != null && currentWidgetPage.onUserInteraction(ev);
- }
-
- public void showPagingFeedback() {
- // Nothing yet.
- }
-
- public long getUserActivityTimeout() {
- View page = getPageAt(mPage);
- if (page instanceof ViewGroup) {
- ViewGroup vg = (ViewGroup) page;
- View view = vg.getChildAt(0);
- if (!(view instanceof KeyguardStatusView)
- && !(view instanceof KeyguardMultiUserSelectorView)) {
- return CUSTOM_WIDGET_USER_ACTIVITY_TIMEOUT;
- }
- }
- return -1;
- }
-
- public void setCallbacks(Callbacks callbacks) {
- mCallbacks = callbacks;
- }
-
- public interface Callbacks {
- public void userActivity();
- public void onUserActivityTimeoutChanged();
- public void onAddView(View v);
- public void onRemoveView(View v, boolean deletePermanently);
- public void onRemoveViewAnimationCompleted();
- }
-
- public void addWidget(View widget) {
- addWidget(widget, -1);
- }
-
- public void onRemoveView(View v, final boolean deletePermanently) {
- final int appWidgetId = ((KeyguardWidgetFrame) v).getContentAppWidgetId();
- if (mCallbacks != null) {
- mCallbacks.onRemoveView(v, deletePermanently);
- }
- mBackgroundWorkerHandler.post(new Runnable() {
- @Override
- public void run() {
- mLockPatternUtils.removeAppWidget(appWidgetId);
- }
- });
- }
-
- @Override
- public void onRemoveViewAnimationCompleted() {
- if (mCallbacks != null) {
- mCallbacks.onRemoveViewAnimationCompleted();
- }
- }
-
- public void onAddView(View v, final int index) {
- final int appWidgetId = ((KeyguardWidgetFrame) v).getContentAppWidgetId();
- final int[] pagesRange = new int[mTempVisiblePagesRange.length];
- getVisiblePages(pagesRange);
- boundByReorderablePages(true, pagesRange);
- if (mCallbacks != null) {
- mCallbacks.onAddView(v);
- }
- // Subtract from the index to take into account pages before the reorderable
- // pages (e.g. the "add widget" page)
- mBackgroundWorkerHandler.post(new Runnable() {
- @Override
- public void run() {
- mLockPatternUtils.addAppWidget(appWidgetId, index - pagesRange[0]);
- }
- });
- }
-
- /*
- * We wrap widgets in a special frame which handles drawing the over scroll foreground.
- */
- public void addWidget(View widget, int pageIndex) {
- KeyguardWidgetFrame frame;
- // All views contained herein should be wrapped in a KeyguardWidgetFrame
- if (!(widget instanceof KeyguardWidgetFrame)) {
- frame = new KeyguardWidgetFrame(getContext());
- FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
- LayoutParams.MATCH_PARENT);
- lp.gravity = Gravity.TOP;
-
- // The framework adds a default padding to AppWidgetHostView. We don't need this padding
- // for the Keyguard, so we override it to be 0.
- widget.setPadding(0, 0, 0, 0);
- frame.addView(widget, lp);
-
- // We set whether or not this widget supports vertical resizing.
- if (widget instanceof AppWidgetHostView) {
- AppWidgetHostView awhv = (AppWidgetHostView) widget;
- AppWidgetProviderInfo info = awhv.getAppWidgetInfo();
- if ((info.resizeMode & AppWidgetProviderInfo.RESIZE_VERTICAL) != 0) {
- frame.setWidgetLockedSmall(false);
- } else {
- // Lock the widget to be small.
- frame.setWidgetLockedSmall(true);
- if (mCenterSmallWidgetsVertically) {
- lp.gravity = Gravity.CENTER;
- }
- }
- }
- } else {
- frame = (KeyguardWidgetFrame) widget;
- }
-
- ViewGroup.LayoutParams pageLp = new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
- frame.setOnLongClickListener(this);
- frame.setWorkerHandler(mBackgroundWorkerHandler);
-
- if (pageIndex == -1) {
- addView(frame, pageLp);
- } else {
- addView(frame, pageIndex, pageLp);
- }
-
- // Update the frame content description.
- View content = (widget == frame) ? frame.getContent() : widget;
- if (content != null) {
- String contentDescription = mContext.getString(
- R.string.keyguard_accessibility_widget,
- content.getContentDescription());
- frame.setContentDescription(contentDescription);
- }
- updateWidgetFrameImportantForAccessibility(frame);
- }
-
- /**
- * Use addWidget() instead.
- * @deprecated
- */
- @Override
- public void addView(View child, int index) {
- enforceKeyguardWidgetFrame(child);
- super.addView(child, index);
- }
-
- /**
- * Use addWidget() instead.
- * @deprecated
- */
- @Override
- public void addView(View child, int width, int height) {
- enforceKeyguardWidgetFrame(child);
- super.addView(child, width, height);
- }
-
- /**
- * Use addWidget() instead.
- * @deprecated
- */
- @Override
- public void addView(View child, LayoutParams params) {
- enforceKeyguardWidgetFrame(child);
- super.addView(child, params);
- }
-
- /**
- * Use addWidget() instead.
- * @deprecated
- */
- @Override
- public void addView(View child, int index, LayoutParams params) {
- enforceKeyguardWidgetFrame(child);
- super.addView(child, index, params);
- }
-
- private void enforceKeyguardWidgetFrame(View child) {
- if (!(child instanceof KeyguardWidgetFrame)) {
- throw new IllegalArgumentException(
- "KeyguardWidgetPager children must be KeyguardWidgetFrames");
- }
- }
-
- public KeyguardWidgetFrame getWidgetPageAt(int index) {
- // This is always a valid cast as we've guarded the ability to
- return (KeyguardWidgetFrame) getChildAt(index);
- }
-
- protected void onUnhandledTap(MotionEvent ev) {
- showPagingFeedback();
- }
-
- @Override
- protected void onPageBeginMoving() {
- if (mViewStateManager != null) {
- mViewStateManager.onPageBeginMoving();
- }
- if (!isReordering(false)) {
- showOutlinesAndSidePages();
- }
- userActivity();
- }
-
- @Override
- protected void onPageEndMoving() {
- if (mViewStateManager != null) {
- mViewStateManager.onPageEndMoving();
- }
-
- // In the reordering case, the pages will be faded appropriately on completion
- // of the zoom in animation.
- if (!isReordering(false)) {
- hideOutlinesAndSidePages();
- }
- }
-
- protected void enablePageContentLayers() {
- int children = getChildCount();
- for (int i = 0; i < children; i++) {
- getWidgetPageAt(i).enableHardwareLayersForContent();
- }
- }
-
- protected void disablePageContentLayers() {
- int children = getChildCount();
- for (int i = 0; i < children; i++) {
- getWidgetPageAt(i).disableHardwareLayersForContent();
- }
- }
-
- /*
- * This interpolator emulates the rate at which the perceived scale of an object changes
- * as its distance from a camera increases. When this interpolator is applied to a scale
- * animation on a view, it evokes the sense that the object is shrinking due to moving away
- * from the camera.
- */
- static class ZInterpolator implements TimeInterpolator {
- private float focalLength;
-
- public ZInterpolator(float foc) {
- focalLength = foc;
- }
-
- public float getInterpolation(float input) {
- return (1.0f - focalLength / (focalLength + input)) /
- (1.0f - focalLength / (focalLength + 1.0f));
- }
- }
-
- @Override
- protected void overScroll(float amount) {
- acceleratedOverScroll(amount);
- }
-
- float backgroundAlphaInterpolator(float r) {
- return Math.min(1f, r);
- }
-
- private void updatePageAlphaValues(int screenCenter) {
- }
-
- public float getAlphaForPage(int screenCenter, int index, boolean showSidePages) {
- if (isWarping()) {
- return index == getPageWarpIndex() ? 1.0f : 0.0f;
- }
- if (showSidePages) {
- return 1f;
- } else {
- return index == mCurrentPage ? 1.0f : 0f;
- }
- }
-
- public float getOutlineAlphaForPage(int screenCenter, int index, boolean showSidePages) {
- if (showSidePages) {
- return getAlphaForPage(screenCenter, index, showSidePages)
- * KeyguardWidgetFrame.OUTLINE_ALPHA_MULTIPLIER;
- } else {
- return 0f;
- }
- }
-
- protected boolean isOverScrollChild(int index, float scrollProgress) {
- boolean isInOverscroll = mOverScrollX < 0 || mOverScrollX > mMaxScrollX;
- return (isInOverscroll && (index == 0 && scrollProgress < 0 ||
- index == getChildCount() - 1 && scrollProgress > 0));
- }
-
- @Override
- protected void screenScrolled(int screenCenter) {
- mScreenCenter = screenCenter;
- updatePageAlphaValues(screenCenter);
- for (int i = 0; i < getChildCount(); i++) {
- KeyguardWidgetFrame v = getWidgetPageAt(i);
- if (v == mDragView) continue;
- if (v != null) {
- float scrollProgress = getScrollProgress(screenCenter, v, i);
-
- v.setCameraDistance(mDensity * CAMERA_DISTANCE);
-
- if (isOverScrollChild(i, scrollProgress) && PERFORM_OVERSCROLL_ROTATION) {
- float pivotX = v.getMeasuredWidth() / 2;
- float pivotY = v.getMeasuredHeight() / 2;
- v.setPivotX(pivotX);
- v.setPivotY(pivotY);
- v.setRotationY(- OVERSCROLL_MAX_ROTATION * scrollProgress);
- v.setOverScrollAmount(Math.abs(scrollProgress), scrollProgress < 0);
- } else {
- v.setRotationY(0f);
- v.setOverScrollAmount(0, false);
- }
-
- float alpha = v.getAlpha();
- // If the view has 0 alpha, we set it to be invisible so as to prevent
- // it from accepting touches
- if (alpha == 0) {
- v.setVisibility(INVISIBLE);
- } else if (v.getVisibility() != VISIBLE) {
- v.setVisibility(VISIBLE);
- }
- }
- }
- }
-
- public boolean isWidgetPage(int pageIndex) {
- if (pageIndex < 0 || pageIndex >= getChildCount()) {
- return false;
- }
- View v = getChildAt(pageIndex);
- if (v != null && v instanceof KeyguardWidgetFrame) {
- KeyguardWidgetFrame kwf = (KeyguardWidgetFrame) v;
- return kwf.getContentAppWidgetId() != AppWidgetManager.INVALID_APPWIDGET_ID;
- }
- return false;
- }
-
- /**
- * Returns the bounded set of pages that are re-orderable. The range is fully inclusive.
- */
- @Override
- void boundByReorderablePages(boolean isReordering, int[] range) {
- if (isReordering) {
- // Remove non-widget pages from the range
- while (range[1] >= range[0] && !isWidgetPage(range[1])) {
- range[1]--;
- }
- while (range[0] <= range[1] && !isWidgetPage(range[0])) {
- range[0]++;
- }
- }
- }
-
- protected void reorderStarting() {
- showOutlinesAndSidePages();
- }
-
- @Override
- protected void onStartReordering() {
- super.onStartReordering();
- enablePageContentLayers();
- reorderStarting();
- }
-
- @Override
- protected void onEndReordering() {
- super.onEndReordering();
- hideOutlinesAndSidePages();
- }
-
- void showOutlinesAndSidePages() {
- animateOutlinesAndSidePages(true);
- }
-
- void hideOutlinesAndSidePages() {
- animateOutlinesAndSidePages(false);
- }
-
- void updateChildrenContentAlpha(float sidePageAlpha) {
- int count = getChildCount();
- for (int i = 0; i < count; i++) {
- KeyguardWidgetFrame child = getWidgetPageAt(i);
- if (i != mCurrentPage) {
- child.setBackgroundAlpha(sidePageAlpha);
- child.setContentAlpha(0f);
- } else {
- child.setBackgroundAlpha(0f);
- child.setContentAlpha(1f);
- }
- }
- }
-
- public void showInitialPageHints() {
- mShowingInitialHints = true;
- updateChildrenContentAlpha(KeyguardWidgetFrame.OUTLINE_ALPHA_MULTIPLIER);
- }
-
- @Override
- void setCurrentPage(int currentPage) {
- super.setCurrentPage(currentPage);
- updateChildrenContentAlpha(0.0f);
- updateWidgetFramesImportantForAccessibility();
- }
-
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
- mHasMeasure = false;
- }
-
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- mLastWidthMeasureSpec = widthMeasureSpec;
- mLastHeightMeasureSpec = heightMeasureSpec;
-
- int maxChallengeTop = -1;
- View parent = (View) getParent();
- boolean challengeShowing = false;
- // Widget pages need to know where the top of the sliding challenge is so that they
- // now how big the widget should be when the challenge is up. We compute it here and
- // then propagate it to each of our children.
- if (parent.getParent() instanceof SlidingChallengeLayout) {
- SlidingChallengeLayout scl = (SlidingChallengeLayout) parent.getParent();
- int top = scl.getMaxChallengeTop();
-
- // This is a bit evil, but we need to map a coordinate relative to the SCL into a
- // coordinate relative to our children, hence we subtract the top padding.s
- maxChallengeTop = top - getPaddingTop();
- challengeShowing = scl.isChallengeShowing();
-
- int count = getChildCount();
- for (int i = 0; i < count; i++) {
- KeyguardWidgetFrame frame = getWidgetPageAt(i);
- frame.setMaxChallengeTop(maxChallengeTop);
- // On the very first measure pass, if the challenge is showing, we need to make sure
- // that the widget on the current page is small.
- if (challengeShowing && i == mCurrentPage && !mHasMeasure) {
- frame.shrinkWidget(true);
- }
- }
- }
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- mHasMeasure = true;
- }
-
- void animateOutlinesAndSidePages(final boolean show) {
- animateOutlinesAndSidePages(show, -1);
- }
-
- public void setWidgetToResetOnPageFadeOut(int widget) {
- mWidgetToResetAfterFadeOut = widget;
- }
-
- public int getWidgetToResetOnPageFadeOut() {
- return mWidgetToResetAfterFadeOut;
- }
-
- void animateOutlinesAndSidePages(final boolean show, int duration) {
- if (mChildrenOutlineFadeAnimation != null) {
- mChildrenOutlineFadeAnimation.cancel();
- mChildrenOutlineFadeAnimation = null;
- }
- int count = getChildCount();
- PropertyValuesHolder alpha;
- ArrayList<Animator> anims = new ArrayList<Animator>();
-
- if (duration == -1) {
- duration = show ? CHILDREN_OUTLINE_FADE_IN_DURATION :
- CHILDREN_OUTLINE_FADE_OUT_DURATION;
- }
-
- int curPage = getNextPage();
- for (int i = 0; i < count; i++) {
- float finalContentAlpha;
- if (show) {
- finalContentAlpha = getAlphaForPage(mScreenCenter, i, true);
- } else if (!show && i == curPage) {
- finalContentAlpha = 1f;
- } else {
- finalContentAlpha = 0f;
- }
- KeyguardWidgetFrame child = getWidgetPageAt(i);
-
- alpha = PropertyValuesHolder.ofFloat("contentAlpha", finalContentAlpha);
- ObjectAnimator a = ObjectAnimator.ofPropertyValuesHolder(child, alpha);
- anims.add(a);
-
- float finalOutlineAlpha = show ? getOutlineAlphaForPage(mScreenCenter, i, true) : 0f;
- child.fadeFrame(this, show, finalOutlineAlpha, duration);
- }
-
- mChildrenOutlineFadeAnimation = new AnimatorSet();
- mChildrenOutlineFadeAnimation.playTogether(anims);
-
- mChildrenOutlineFadeAnimation.setDuration(duration);
- mChildrenOutlineFadeAnimation.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- if (show) {
- enablePageContentLayers();
- }
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- if (!show) {
- disablePageContentLayers();
- KeyguardWidgetFrame frame = getWidgetPageAt(mWidgetToResetAfterFadeOut);
- if (frame != null && !(frame == getWidgetPageAt(mCurrentPage) &&
- mViewStateManager.isChallengeOverlapping())) {
- frame.resetSize();
- }
- mWidgetToResetAfterFadeOut = -1;
- mShowingInitialHints = false;
- }
- updateWidgetFramesImportantForAccessibility();
- }
- });
- mChildrenOutlineFadeAnimation.start();
- }
-
- @Override
- public boolean onLongClick(View v) {
- // Disallow long pressing to reorder if the challenge is showing
- boolean isChallengeOverlapping = mViewStateManager.isChallengeShowing() &&
- mViewStateManager.isChallengeOverlapping();
- if (!isChallengeOverlapping && startReordering()) {
- return true;
- }
- return false;
- }
-
- public void removeWidget(View view) {
- if (view instanceof KeyguardWidgetFrame) {
- removeView(view);
- } else {
- // Assume view was wrapped by a KeyguardWidgetFrame in KeyguardWidgetPager#addWidget().
- // This supports legacy hard-coded "widgets" like KeyguardTransportControlView.
- int pos = getWidgetPageIndex(view);
- if (pos != -1) {
- KeyguardWidgetFrame frame = (KeyguardWidgetFrame) getChildAt(pos);
- frame.removeView(view);
- removeView(frame);
- } else {
- Slog.w(TAG, "removeWidget() can't find:" + view);
- }
- }
- }
-
- public int getWidgetPageIndex(View view) {
- if (view instanceof KeyguardWidgetFrame) {
- return indexOfChild(view);
- } else {
- // View was wrapped by a KeyguardWidgetFrame by KeyguardWidgetPager#addWidget()
- return indexOfChild((KeyguardWidgetFrame)view.getParent());
- }
- }
-
- @Override
- protected void setPageHoveringOverDeleteDropTarget(int viewIndex, boolean isHovering) {
- KeyguardWidgetFrame child = getWidgetPageAt(viewIndex);
- child.setIsHoveringOverDeleteDropTarget(isHovering);
- }
-
- // ChallengeLayout.OnBouncerStateChangedListener
- @Override
- public void onBouncerStateChanged(boolean bouncerActive) {
- if (bouncerActive) {
- zoomOutToBouncer();
- } else {
- zoomInFromBouncer();
- }
- }
-
- void setBouncerAnimationDuration(int duration) {
- mBouncerZoomInOutDuration = duration;
- }
-
- // Zoom in after the bouncer is dismissed
- void zoomInFromBouncer() {
- if (mZoomInOutAnim != null && mZoomInOutAnim.isRunning()) {
- mZoomInOutAnim.cancel();
- }
- final View currentPage = getPageAt(getCurrentPage());
- if (currentPage.getScaleX() < 1f || currentPage.getScaleY() < 1f) {
- mZoomInOutAnim = new AnimatorSet();
- mZoomInOutAnim.playTogether(
- ObjectAnimator.ofFloat(currentPage, "scaleX", 1f),
- ObjectAnimator.ofFloat(currentPage , "scaleY", 1f));
- mZoomInOutAnim.setDuration(mBouncerZoomInOutDuration);
- mZoomInOutAnim.setInterpolator(new DecelerateInterpolator(1.5f));
- mZoomInOutAnim.start();
- }
- if (currentPage instanceof KeyguardWidgetFrame) {
- ((KeyguardWidgetFrame)currentPage).onBouncerShowing(false);
- }
- }
-
- // Zoom out after the bouncer is initiated
- void zoomOutToBouncer() {
- if (mZoomInOutAnim != null && mZoomInOutAnim.isRunning()) {
- mZoomInOutAnim.cancel();
- }
- int curPage = getCurrentPage();
- View currentPage = getPageAt(curPage);
- if (shouldSetTopAlignedPivotForWidget(curPage)) {
- currentPage.setPivotY(0);
- // Note: we are working around the issue that setting the x-pivot to the same value as it
- // was does not actually work.
- currentPage.setPivotX(0);
- currentPage.setPivotX(currentPage.getMeasuredWidth() / 2);
- }
- if (!(currentPage.getScaleX() < 1f || currentPage.getScaleY() < 1f)) {
- mZoomInOutAnim = new AnimatorSet();
- mZoomInOutAnim.playTogether(
- ObjectAnimator.ofFloat(currentPage, "scaleX", BOUNCER_SCALE_FACTOR),
- ObjectAnimator.ofFloat(currentPage, "scaleY", BOUNCER_SCALE_FACTOR));
- mZoomInOutAnim.setDuration(mBouncerZoomInOutDuration);
- mZoomInOutAnim.setInterpolator(new DecelerateInterpolator(1.5f));
- mZoomInOutAnim.start();
- }
- if (currentPage instanceof KeyguardWidgetFrame) {
- ((KeyguardWidgetFrame)currentPage).onBouncerShowing(true);
- }
- }
-
- void setAddWidgetEnabled(boolean enabled) {
- if (mAddWidgetView != null && enabled) {
- addView(mAddWidgetView, 0);
- // We need to force measure the PagedView so that the calls to update the scroll
- // position below work
- measure(mLastWidthMeasureSpec, mLastHeightMeasureSpec);
- // Bump up the current page to account for the addition of the new page
- setCurrentPage(mCurrentPage + 1);
- mAddWidgetView = null;
- } else if (mAddWidgetView == null && !enabled) {
- View addWidget = findViewById(R.id.keyguard_add_widget);
- if (addWidget != null) {
- mAddWidgetView = addWidget;
- removeView(addWidget);
- }
- }
- }
-
- boolean isAddPage(int pageIndex) {
- View v = getChildAt(pageIndex);
- return v != null && v.getId() == R.id.keyguard_add_widget;
- }
-
- boolean isCameraPage(int pageIndex) {
- View v = getChildAt(pageIndex);
- return v != null && v instanceof CameraWidgetFrame;
- }
-
- @Override
- protected boolean shouldSetTopAlignedPivotForWidget(int childIndex) {
- return !isCameraPage(childIndex) && super.shouldSetTopAlignedPivotForWidget(childIndex);
- }
-
- /**
- * Search given {@link View} hierarchy for {@link TextClock} instances that
- * show various time components. Returns combination of
- * {@link #FLAG_HAS_LOCAL_HOUR} and {@link #FLAG_HAS_LOCAL_MINUTE}.
- */
- private static int findClockInHierarchy(View view) {
- if (view instanceof TextClock) {
- return getClockFlags((TextClock) view);
- } else if (view instanceof ViewGroup) {
- int flags = 0;
- final ViewGroup group = (ViewGroup) view;
- final int size = group.getChildCount();
- for (int i = 0; i < size; i++) {
- flags |= findClockInHierarchy(group.getChildAt(i));
- }
- return flags;
- } else {
- return 0;
- }
- }
-
- /**
- * Return combination of {@link #FLAG_HAS_LOCAL_HOUR} and
- * {@link #FLAG_HAS_LOCAL_MINUTE} describing the time represented described
- * by the given {@link TextClock}.
- */
- private static int getClockFlags(TextClock clock) {
- int flags = 0;
-
- final String timeZone = clock.getTimeZone();
- if (timeZone != null && !TimeZone.getDefault().equals(TimeZone.getTimeZone(timeZone))) {
- // Ignore clocks showing another timezone
- return 0;
- }
-
- final CharSequence format = clock.getFormat();
- final char hour = clock.is24HourModeEnabled() ? DateFormat.HOUR_OF_DAY
- : DateFormat.HOUR;
-
- if (DateFormat.hasDesignator(format, hour)) {
- flags |= FLAG_HAS_LOCAL_HOUR;
- }
- if (DateFormat.hasDesignator(format, DateFormat.MINUTE)) {
- flags |= FLAG_HAS_LOCAL_MINUTE;
- }
-
- return flags;
- }
-
- public void handleExternalCameraEvent(MotionEvent event) {
- beginCameraEvent();
- int cameraPage = getPageCount() - 1;
- boolean endWarp = false;
- if (isCameraPage(cameraPage) || mCameraEventInProgress) {
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- // Once we start dispatching camera events, we must continue to do so
- // to keep event dispatch happy.
- mCameraEventInProgress = true;
- userActivity();
- break;
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_CANCEL:
- mCameraEventInProgress = false;
- break;
- }
- dispatchTouchEvent(event);
- }
- endCameraEvent();
- }
-
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java b/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java
deleted file mode 100644
index 340a4d5..0000000
--- a/packages/Keyguard/src/com/android/keyguard/MultiPaneChallengeLayout.java
+++ /dev/null
@@ -1,575 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.LinearLayout;
-
-public class MultiPaneChallengeLayout extends ViewGroup implements ChallengeLayout {
- private static final String TAG = "MultiPaneChallengeLayout";
-
- final int mOrientation;
- private boolean mIsBouncing;
-
- public static final int HORIZONTAL = LinearLayout.HORIZONTAL;
- public static final int VERTICAL = LinearLayout.VERTICAL;
- public static final int ANIMATE_BOUNCE_DURATION = 350;
-
- private KeyguardSecurityContainer mChallengeView;
- private View mUserSwitcherView;
- private View mScrimView;
- private OnBouncerStateChangedListener mBouncerListener;
-
- private final Rect mTempRect = new Rect();
- private final Rect mZeroPadding = new Rect();
- private final Rect mInsets = new Rect();
-
- private final DisplayMetrics mDisplayMetrics;
-
- private final OnClickListener mScrimClickListener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- hideBouncer();
- }
- };
-
- public MultiPaneChallengeLayout(Context context) {
- this(context, null);
- }
-
- public MultiPaneChallengeLayout(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public MultiPaneChallengeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
-
- final TypedArray a = context.obtainStyledAttributes(attrs,
- R.styleable.MultiPaneChallengeLayout, defStyleAttr, 0);
- mOrientation = a.getInt(R.styleable.MultiPaneChallengeLayout_android_orientation,
- HORIZONTAL);
- a.recycle();
-
- final Resources res = getResources();
- mDisplayMetrics = res.getDisplayMetrics();
-
- setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
- }
-
- public void setInsets(Rect insets) {
- mInsets.set(insets);
- }
-
- @Override
- public boolean isChallengeShowing() {
- return true;
- }
-
- @Override
- public boolean isChallengeOverlapping() {
- return false;
- }
-
- @Override
- public void showChallenge(boolean b) {
- }
-
- @Override
- public int getBouncerAnimationDuration() {
- return ANIMATE_BOUNCE_DURATION;
- }
-
- @Override
- public void showBouncer() {
- if (mIsBouncing) return;
- mIsBouncing = true;
- if (mScrimView != null) {
- if (mChallengeView != null) {
- mChallengeView.showBouncer(ANIMATE_BOUNCE_DURATION);
- }
-
- Animator anim = ObjectAnimator.ofFloat(mScrimView, "alpha", 1f);
- anim.setDuration(ANIMATE_BOUNCE_DURATION);
- anim.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- mScrimView.setVisibility(VISIBLE);
- }
- });
- anim.start();
- }
- if (mBouncerListener != null) {
- mBouncerListener.onBouncerStateChanged(true);
- }
- }
-
- @Override
- public void hideBouncer() {
- if (!mIsBouncing) return;
- mIsBouncing = false;
- if (mScrimView != null) {
- if (mChallengeView != null) {
- mChallengeView.hideBouncer(ANIMATE_BOUNCE_DURATION);
- }
-
- Animator anim = ObjectAnimator.ofFloat(mScrimView, "alpha", 0f);
- anim.setDuration(ANIMATE_BOUNCE_DURATION);
- anim.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mScrimView.setVisibility(INVISIBLE);
- }
- });
- anim.start();
- }
- if (mBouncerListener != null) {
- mBouncerListener.onBouncerStateChanged(false);
- }
- }
-
- @Override
- public boolean isBouncing() {
- return mIsBouncing;
- }
-
- @Override
- public void setOnBouncerStateChangedListener(OnBouncerStateChangedListener listener) {
- mBouncerListener = listener;
- }
-
- @Override
- public void requestChildFocus(View child, View focused) {
- if (mIsBouncing && child != mChallengeView) {
- // Clear out of the bouncer if the user tries to move focus outside of
- // the security challenge view.
- hideBouncer();
- }
- super.requestChildFocus(child, focused);
- }
-
- void setScrimView(View scrim) {
- if (mScrimView != null) {
- mScrimView.setOnClickListener(null);
- }
- mScrimView = scrim;
- if (mScrimView != null) {
- mScrimView.setAlpha(mIsBouncing ? 1.0f : 0.0f);
- mScrimView.setVisibility(mIsBouncing ? VISIBLE : INVISIBLE);
- mScrimView.setFocusable(true);
- mScrimView.setOnClickListener(mScrimClickListener);
- }
- }
-
- private int getVirtualHeight(LayoutParams lp, int height, int heightUsed) {
- int virtualHeight = height;
- final View root = getRootView();
- if (root != null) {
- // This calculation is super dodgy and relies on several assumptions.
- // Specifically that the root of the window will be padded in for insets
- // and that the window is LAYOUT_IN_SCREEN.
- virtualHeight = mDisplayMetrics.heightPixels - root.getPaddingTop() - mInsets.top;
- }
- if (lp.childType == LayoutParams.CHILD_TYPE_USER_SWITCHER) {
- // Always measure the user switcher as if there were no IME insets
- // on the window.
- return virtualHeight - heightUsed;
- } else if (lp.childType == LayoutParams.CHILD_TYPE_PAGE_DELETE_DROP_TARGET) {
- return height;
- }
- return Math.min(virtualHeight - heightUsed, height);
- }
-
- @Override
- protected void onMeasure(final int widthSpec, final int heightSpec) {
- if (MeasureSpec.getMode(widthSpec) != MeasureSpec.EXACTLY ||
- MeasureSpec.getMode(heightSpec) != MeasureSpec.EXACTLY) {
- throw new IllegalArgumentException(
- "MultiPaneChallengeLayout must be measured with an exact size");
- }
-
- final int width = MeasureSpec.getSize(widthSpec);
- final int height = MeasureSpec.getSize(heightSpec);
- setMeasuredDimension(width, height);
-
- final int insetHeight = height - mInsets.top - mInsets.bottom;
- final int insetHeightSpec = MeasureSpec.makeMeasureSpec(insetHeight, MeasureSpec.EXACTLY);
-
- int widthUsed = 0;
- int heightUsed = 0;
-
- // First pass. Find the challenge view and measure the user switcher,
- // which consumes space in the layout.
- mChallengeView = null;
- mUserSwitcherView = null;
- final int count = getChildCount();
- for (int i = 0; i < count; i++) {
- final View child = getChildAt(i);
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
- if (lp.childType == LayoutParams.CHILD_TYPE_CHALLENGE) {
- if (mChallengeView != null) {
- throw new IllegalStateException(
- "There may only be one child of type challenge");
- }
- if (!(child instanceof KeyguardSecurityContainer)) {
- throw new IllegalArgumentException(
- "Challenge must be a KeyguardSecurityContainer");
- }
- mChallengeView = (KeyguardSecurityContainer) child;
- } else if (lp.childType == LayoutParams.CHILD_TYPE_USER_SWITCHER) {
- if (mUserSwitcherView != null) {
- throw new IllegalStateException(
- "There may only be one child of type userSwitcher");
- }
- mUserSwitcherView = child;
-
- if (child.getVisibility() == GONE) continue;
-
- int adjustedWidthSpec = widthSpec;
- int adjustedHeightSpec = insetHeightSpec;
- if (lp.maxWidth >= 0) {
- adjustedWidthSpec = MeasureSpec.makeMeasureSpec(
- Math.min(lp.maxWidth, width), MeasureSpec.EXACTLY);
- }
- if (lp.maxHeight >= 0) {
- adjustedHeightSpec = MeasureSpec.makeMeasureSpec(
- Math.min(lp.maxHeight, insetHeight), MeasureSpec.EXACTLY);
- }
- // measureChildWithMargins will resolve layout direction for the LayoutParams
- measureChildWithMargins(child, adjustedWidthSpec, 0, adjustedHeightSpec, 0);
-
- // Only subtract out space from one dimension. Favor vertical.
- // Offset by 1.5x to add some balance along the other edge.
- if (Gravity.isVertical(lp.gravity)) {
- heightUsed += child.getMeasuredHeight() * 1.5f;
- } else if (Gravity.isHorizontal(lp.gravity)) {
- widthUsed += child.getMeasuredWidth() * 1.5f;
- }
- } else if (lp.childType == LayoutParams.CHILD_TYPE_SCRIM) {
- setScrimView(child);
- child.measure(widthSpec, heightSpec);
- }
- }
-
- // Second pass. Measure everything that's left.
- for (int i = 0; i < count; i++) {
- final View child = getChildAt(i);
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
- if (lp.childType == LayoutParams.CHILD_TYPE_USER_SWITCHER ||
- lp.childType == LayoutParams.CHILD_TYPE_SCRIM ||
- child.getVisibility() == GONE) {
- // Don't need to measure GONE children, and the user switcher was already measured.
- continue;
- }
-
- final int virtualHeight = getVirtualHeight(lp, insetHeight, heightUsed);
-
- int adjustedWidthSpec;
- int adjustedHeightSpec;
- if (lp.centerWithinArea > 0) {
- if (mOrientation == HORIZONTAL) {
- adjustedWidthSpec = MeasureSpec.makeMeasureSpec(
- (int) ((width - widthUsed) * lp.centerWithinArea + 0.5f),
- MeasureSpec.EXACTLY);
- adjustedHeightSpec = MeasureSpec.makeMeasureSpec(
- virtualHeight, MeasureSpec.EXACTLY);
- } else {
- adjustedWidthSpec = MeasureSpec.makeMeasureSpec(
- width - widthUsed, MeasureSpec.EXACTLY);
- adjustedHeightSpec = MeasureSpec.makeMeasureSpec(
- (int) (virtualHeight * lp.centerWithinArea + 0.5f),
- MeasureSpec.EXACTLY);
- }
- } else {
- adjustedWidthSpec = MeasureSpec.makeMeasureSpec(
- width - widthUsed, MeasureSpec.EXACTLY);
- adjustedHeightSpec = MeasureSpec.makeMeasureSpec(
- virtualHeight, MeasureSpec.EXACTLY);
- }
- if (lp.maxWidth >= 0) {
- adjustedWidthSpec = MeasureSpec.makeMeasureSpec(
- Math.min(lp.maxWidth, MeasureSpec.getSize(adjustedWidthSpec)),
- MeasureSpec.EXACTLY);
- }
- if (lp.maxHeight >= 0) {
- adjustedHeightSpec = MeasureSpec.makeMeasureSpec(
- Math.min(lp.maxHeight, MeasureSpec.getSize(adjustedHeightSpec)),
- MeasureSpec.EXACTLY);
- }
-
- measureChildWithMargins(child, adjustedWidthSpec, 0, adjustedHeightSpec, 0);
- }
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- final Rect padding = mTempRect;
- padding.left = getPaddingLeft();
- padding.top = getPaddingTop();
- padding.right = getPaddingRight();
- padding.bottom = getPaddingBottom();
- final int width = r - l;
- final int height = b - t;
- final int insetHeight = height - mInsets.top - mInsets.bottom;
-
- // Reserve extra space in layout for the user switcher by modifying
- // local padding during this layout pass
- if (mUserSwitcherView != null && mUserSwitcherView.getVisibility() != GONE) {
- layoutWithGravity(width, insetHeight, mUserSwitcherView, padding, true);
- }
-
- final int count = getChildCount();
- for (int i = 0; i < count; i++) {
- final View child = getChildAt(i);
- LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
- // We did the user switcher above if we have one.
- if (child == mUserSwitcherView || child.getVisibility() == GONE) continue;
-
- if (child == mScrimView) {
- child.layout(0, 0, width, height);
- continue;
- } else if (lp.childType == LayoutParams.CHILD_TYPE_PAGE_DELETE_DROP_TARGET) {
- layoutWithGravity(width, insetHeight, child, mZeroPadding, false);
- continue;
- }
-
- layoutWithGravity(width, insetHeight, child, padding, false);
- }
- }
-
- private void layoutWithGravity(int width, int height, View child, Rect padding,
- boolean adjustPadding) {
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
- final int heightUsed = padding.top + padding.bottom - getPaddingTop() - getPaddingBottom();
- height = getVirtualHeight(lp, height, heightUsed);
-
- final int gravity = Gravity.getAbsoluteGravity(lp.gravity, getLayoutDirection());
-
- final boolean fixedLayoutSize = lp.centerWithinArea > 0;
- final boolean fixedLayoutHorizontal = fixedLayoutSize && mOrientation == HORIZONTAL;
- final boolean fixedLayoutVertical = fixedLayoutSize && mOrientation == VERTICAL;
-
- final int adjustedWidth;
- final int adjustedHeight;
- if (fixedLayoutHorizontal) {
- final int paddedWidth = width - padding.left - padding.right;
- adjustedWidth = (int) (paddedWidth * lp.centerWithinArea + 0.5f);
- adjustedHeight = height;
- } else if (fixedLayoutVertical) {
- final int paddedHeight = height - getPaddingTop() - getPaddingBottom();
- adjustedWidth = width;
- adjustedHeight = (int) (paddedHeight * lp.centerWithinArea + 0.5f);
- } else {
- adjustedWidth = width;
- adjustedHeight = height;
- }
-
- final boolean isVertical = Gravity.isVertical(gravity);
- final boolean isHorizontal = Gravity.isHorizontal(gravity);
- final int childWidth = child.getMeasuredWidth();
- final int childHeight = child.getMeasuredHeight();
-
- int left = padding.left;
- int top = padding.top;
- int right = left + childWidth;
- int bottom = top + childHeight;
- switch (gravity & Gravity.VERTICAL_GRAVITY_MASK) {
- case Gravity.TOP:
- top = fixedLayoutVertical ?
- padding.top + (adjustedHeight - childHeight) / 2 : padding.top;
- bottom = top + childHeight;
- if (adjustPadding && isVertical) {
- padding.top = bottom;
- padding.bottom += childHeight / 2;
- }
- break;
- case Gravity.BOTTOM:
- bottom = fixedLayoutVertical
- ? padding.top + height - (adjustedHeight - childHeight) / 2
- : padding.top + height;
- top = bottom - childHeight;
- if (adjustPadding && isVertical) {
- padding.bottom = height - top;
- padding.top += childHeight / 2;
- }
- break;
- case Gravity.CENTER_VERTICAL:
- top = padding.top + (height - childHeight) / 2;
- bottom = top + childHeight;
- break;
- }
- switch (gravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
- case Gravity.LEFT:
- left = fixedLayoutHorizontal ?
- padding.left + (adjustedWidth - childWidth) / 2 : padding.left;
- right = left + childWidth;
- if (adjustPadding && isHorizontal && !isVertical) {
- padding.left = right;
- padding.right += childWidth / 2;
- }
- break;
- case Gravity.RIGHT:
- right = fixedLayoutHorizontal
- ? width - padding.right - (adjustedWidth - childWidth) / 2
- : width - padding.right;
- left = right - childWidth;
- if (adjustPadding && isHorizontal && !isVertical) {
- padding.right = width - left;
- padding.left += childWidth / 2;
- }
- break;
- case Gravity.CENTER_HORIZONTAL:
- final int paddedWidth = width - padding.left - padding.right;
- left = (paddedWidth - childWidth) / 2;
- right = left + childWidth;
- break;
- }
- top += mInsets.top;
- bottom += mInsets.top;
- child.layout(left, top, right, bottom);
- }
-
- @Override
- public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
- return new LayoutParams(getContext(), attrs, this);
- }
-
- @Override
- protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
- return p instanceof LayoutParams ? new LayoutParams((LayoutParams) p) :
- p instanceof MarginLayoutParams ? new LayoutParams((MarginLayoutParams) p) :
- new LayoutParams(p);
- }
-
- @Override
- protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
- return new LayoutParams();
- }
-
- @Override
- protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
- return p instanceof LayoutParams;
- }
-
- public static class LayoutParams extends MarginLayoutParams {
-
- public float centerWithinArea = 0;
-
- public int childType = 0;
-
- public static final int CHILD_TYPE_NONE = 0;
- public static final int CHILD_TYPE_WIDGET = 1;
- public static final int CHILD_TYPE_CHALLENGE = 2;
- public static final int CHILD_TYPE_USER_SWITCHER = 3;
- public static final int CHILD_TYPE_SCRIM = 4;
- public static final int CHILD_TYPE_PAGE_DELETE_DROP_TARGET = 7;
-
- public int gravity = Gravity.NO_GRAVITY;
-
- public int maxWidth = -1;
- public int maxHeight = -1;
-
- public LayoutParams() {
- this(WRAP_CONTENT, WRAP_CONTENT);
- }
-
- LayoutParams(Context c, AttributeSet attrs, MultiPaneChallengeLayout parent) {
- super(c, attrs);
-
- final TypedArray a = c.obtainStyledAttributes(attrs,
- R.styleable.MultiPaneChallengeLayout_Layout);
-
- centerWithinArea = a.getFloat(
- R.styleable.MultiPaneChallengeLayout_Layout_layout_centerWithinArea, 0);
- childType = a.getInt(R.styleable.MultiPaneChallengeLayout_Layout_layout_childType,
- CHILD_TYPE_NONE);
- gravity = a.getInt(R.styleable.MultiPaneChallengeLayout_Layout_layout_gravity,
- Gravity.NO_GRAVITY);
- maxWidth = a.getDimensionPixelSize(
- R.styleable.MultiPaneChallengeLayout_Layout_layout_maxWidth, -1);
- maxHeight = a.getDimensionPixelSize(
- R.styleable.MultiPaneChallengeLayout_Layout_layout_maxHeight, -1);
-
- // Default gravity settings based on type and parent orientation
- if (gravity == Gravity.NO_GRAVITY) {
- if (parent.mOrientation == HORIZONTAL) {
- switch (childType) {
- case CHILD_TYPE_WIDGET:
- gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;
- break;
- case CHILD_TYPE_CHALLENGE:
- gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL;
- break;
- case CHILD_TYPE_USER_SWITCHER:
- gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
- break;
- }
- } else {
- switch (childType) {
- case CHILD_TYPE_WIDGET:
- gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
- break;
- case CHILD_TYPE_CHALLENGE:
- gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
- break;
- case CHILD_TYPE_USER_SWITCHER:
- gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
- break;
- }
- }
- }
-
- a.recycle();
- }
-
- public LayoutParams(int width, int height) {
- super(width, height);
- }
-
- public LayoutParams(ViewGroup.LayoutParams source) {
- super(source);
- }
-
- public LayoutParams(MarginLayoutParams source) {
- super(source);
- }
-
- public LayoutParams(LayoutParams source) {
- this((MarginLayoutParams) source);
-
- centerWithinArea = source.centerWithinArea;
- childType = source.childType;
- gravity = source.gravity;
- maxWidth = source.maxWidth;
- maxHeight = source.maxHeight;
- }
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/MultiUserAvatarCache.java b/packages/Keyguard/src/com/android/keyguard/MultiUserAvatarCache.java
deleted file mode 100644
index 7128211..0000000
--- a/packages/Keyguard/src/com/android/keyguard/MultiUserAvatarCache.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-import android.graphics.drawable.Drawable;
-
-import java.util.HashMap;
-
-public class MultiUserAvatarCache {
-
- private static MultiUserAvatarCache sInstance;
-
- private final HashMap<Integer, Drawable> mCache;
-
- private MultiUserAvatarCache() {
- mCache = new HashMap<Integer, Drawable>();
- }
-
- public static MultiUserAvatarCache getInstance() {
- if (sInstance == null) {
- sInstance = new MultiUserAvatarCache();
- }
- return sInstance;
- }
-
- public void clear(int userId) {
- mCache.remove(userId);
- }
-
- public Drawable get(int userId) {
- return mCache.get(userId);
- }
-
- public void put(int userId, Drawable image) {
- mCache.put(userId, image);
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/PagedView.java b/packages/Keyguard/src/com/android/keyguard/PagedView.java
deleted file mode 100644
index b42a085..0000000
--- a/packages/Keyguard/src/com/android/keyguard/PagedView.java
+++ /dev/null
@@ -1,2845 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.animation.TimeInterpolator;
-import android.animation.ValueAnimator;
-import android.animation.ValueAnimator.AnimatorUpdateListener;
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Matrix;
-import android.graphics.PointF;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.view.*;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.AccessibilityNodeInfo;
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.AnimationUtils;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.Interpolator;
-import android.view.animation.LinearInterpolator;
-import android.widget.Scroller;
-
-import java.util.ArrayList;
-
-/**
- * An abstraction of the original Workspace which supports browsing through a
- * sequential list of "pages"
- */
-public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarchyChangeListener {
- private static final int WARP_SNAP_DURATION = 160;
- private static final String TAG = "WidgetPagedView";
- private static final boolean DEBUG = KeyguardConstants.DEBUG;
- private static final boolean DEBUG_WARP = false;
- protected static final int INVALID_PAGE = -1;
- private static final int WARP_PEEK_ANIMATION_DURATION = 150;
- private static final float WARP_ANIMATE_AMOUNT = -75.0f; // in dip
-
- // the min drag distance for a fling to register, to prevent random page shifts
- private static final int MIN_LENGTH_FOR_FLING = 25;
-
- protected static final int PAGE_SNAP_ANIMATION_DURATION = 750;
- protected static final int SLOW_PAGE_SNAP_ANIMATION_DURATION = 950;
- protected static final float NANOTIME_DIV = 1000000000.0f;
-
- private static final float OVERSCROLL_ACCELERATE_FACTOR = 2;
- private static final float OVERSCROLL_DAMP_FACTOR = 0.14f;
-
- private static final float RETURN_TO_ORIGINAL_PAGE_THRESHOLD = 0.33f;
- // The page is moved more than halfway, automatically move to the next page on touch up.
- private static final float SIGNIFICANT_MOVE_THRESHOLD = 0.5f;
-
- // The following constants need to be scaled based on density. The scaled versions will be
- // assigned to the corresponding member variables below.
- private static final int FLING_THRESHOLD_VELOCITY = 1500;
- private static final int MIN_SNAP_VELOCITY = 1500;
- private static final int MIN_FLING_VELOCITY = 500;
-
- // We are disabling touch interaction of the widget region for factory ROM.
- private static final boolean DISABLE_TOUCH_INTERACTION = false;
- private static final boolean DISABLE_TOUCH_SIDE_PAGES = true;
- private static final boolean DISABLE_FLING_TO_DELETE = false;
-
- static final int AUTOMATIC_PAGE_SPACING = -1;
-
- protected int mFlingThresholdVelocity;
- protected int mMinFlingVelocity;
- protected int mMinSnapVelocity;
-
- protected float mDensity;
- protected float mSmoothingTime;
- protected float mTouchX;
-
- protected boolean mFirstLayout = true;
-
- protected int mCurrentPage;
- protected int mChildCountOnLastMeasure;
-
- protected int mNextPage = INVALID_PAGE;
- protected int mMaxScrollX;
- protected Scroller mScroller;
- private VelocityTracker mVelocityTracker;
-
- private float mParentDownMotionX;
- private float mParentDownMotionY;
- private float mDownMotionX;
- private float mDownMotionY;
- private float mDownScrollX;
- protected float mLastMotionX;
- protected float mLastMotionXRemainder;
- protected float mLastMotionY;
- protected float mTotalMotionX;
- private int mLastScreenCenter = -1;
- private int[] mChildOffsets;
- private int[] mChildRelativeOffsets;
- private int[] mChildOffsetsWithLayoutScale;
- private String mDeleteString; // Accessibility announcement when widget is deleted
-
- protected final static int TOUCH_STATE_REST = 0;
- protected final static int TOUCH_STATE_SCROLLING = 1;
- protected final static int TOUCH_STATE_PREV_PAGE = 2;
- protected final static int TOUCH_STATE_NEXT_PAGE = 3;
- protected final static int TOUCH_STATE_REORDERING = 4;
- protected final static int TOUCH_STATE_READY = 5; // when finger is down
-
- protected final static float ALPHA_QUANTIZE_LEVEL = 0.0001f;
- protected final static float TOUCH_SLOP_SCALE = 1.0f;
-
- protected int mTouchState = TOUCH_STATE_REST;
- protected boolean mForceScreenScrolled = false;
-
- protected OnLongClickListener mLongClickListener;
-
- protected int mTouchSlop;
- private int mPagingTouchSlop;
- private int mMaximumVelocity;
- private int mMinimumWidth;
- protected int mPageSpacing;
- protected int mCellCountX = 0;
- protected int mCellCountY = 0;
- protected boolean mAllowOverScroll = true;
- protected int mUnboundedScrollX;
- protected int[] mTempVisiblePagesRange = new int[2];
- protected boolean mForceDrawAllChildrenNextFrame;
-
- // mOverScrollX is equal to getScrollX() when we're within the normal scroll range. Otherwise
- // it is equal to the scaled overscroll position. We use a separate value so as to prevent
- // the screens from continuing to translate beyond the normal bounds.
- protected int mOverScrollX;
-
- // parameter that adjusts the layout to be optimized for pages with that scale factor
- protected float mLayoutScale = 1.0f;
-
- protected static final int INVALID_POINTER = -1;
-
- protected int mActivePointerId = INVALID_POINTER;
-
- private PageSwitchListener mPageSwitchListener;
-
- protected ArrayList<Boolean> mDirtyPageContent;
-
- // If true, syncPages and syncPageItems will be called to refresh pages
- protected boolean mContentIsRefreshable = true;
-
- // If true, modify alpha of neighboring pages as user scrolls left/right
- protected boolean mFadeInAdjacentScreens = false;
-
- // It true, use a different slop parameter (pagingTouchSlop = 2 * touchSlop) for deciding
- // to switch to a new page
- protected boolean mUsePagingTouchSlop = true;
-
- // If true, the subclass should directly update scrollX itself in its computeScroll method
- // (SmoothPagedView does this)
- protected boolean mDeferScrollUpdate = false;
-
- protected boolean mIsPageMoving = false;
-
- // All syncs and layout passes are deferred until data is ready.
- protected boolean mIsDataReady = true;
-
- // Scrolling indicator
- private ValueAnimator mScrollIndicatorAnimator;
- private View mScrollIndicator;
- private int mScrollIndicatorPaddingLeft;
- private int mScrollIndicatorPaddingRight;
- private boolean mShouldShowScrollIndicator = false;
- private boolean mShouldShowScrollIndicatorImmediately = false;
- protected static final int sScrollIndicatorFadeInDuration = 150;
- protected static final int sScrollIndicatorFadeOutDuration = 650;
- protected static final int sScrollIndicatorFlashDuration = 650;
-
- // The viewport whether the pages are to be contained (the actual view may be larger than the
- // viewport)
- private Rect mViewport = new Rect();
-
- // Reordering
- // We use the min scale to determine how much to expand the actually PagedView measured
- // dimensions such that when we are zoomed out, the view is not clipped
- private int REORDERING_DROP_REPOSITION_DURATION = 200;
- protected int REORDERING_REORDER_REPOSITION_DURATION = 300;
- protected int REORDERING_ZOOM_IN_OUT_DURATION = 250;
- private int REORDERING_SIDE_PAGE_HOVER_TIMEOUT = 300;
- private float REORDERING_SIDE_PAGE_BUFFER_PERCENTAGE = 0.1f;
- private long REORDERING_DELETE_DROP_TARGET_FADE_DURATION = 150;
- private float mMinScale = 1f;
- protected View mDragView;
- protected AnimatorSet mZoomInOutAnim;
- private Runnable mSidePageHoverRunnable;
- private int mSidePageHoverIndex = -1;
- // This variable's scope is only for the duration of startReordering() and endReordering()
- private boolean mReorderingStarted = false;
- // This variable's scope is for the duration of startReordering() and after the zoomIn()
- // animation after endReordering()
- private boolean mIsReordering;
- // The runnable that settles the page after snapToPage and animateDragViewToOriginalPosition
- private int NUM_ANIMATIONS_RUNNING_BEFORE_ZOOM_OUT = 2;
- private int mPostReorderingPreZoomInRemainingAnimationCount;
- private Runnable mPostReorderingPreZoomInRunnable;
-
- // Edge swiping
- private boolean mOnlyAllowEdgeSwipes = false;
- private boolean mDownEventOnEdge = false;
- private int mEdgeSwipeRegionSize = 0;
-
- // Convenience/caching
- private Matrix mTmpInvMatrix = new Matrix();
- private float[] mTmpPoint = new float[2];
- private Rect mTmpRect = new Rect();
- private Rect mAltTmpRect = new Rect();
-
- // Fling to delete
- private int FLING_TO_DELETE_FADE_OUT_DURATION = 350;
- private float FLING_TO_DELETE_FRICTION = 0.035f;
- // The degrees specifies how much deviation from the up vector to still consider a fling "up"
- private float FLING_TO_DELETE_MAX_FLING_DEGREES = 65f;
- protected int mFlingToDeleteThresholdVelocity = -1400;
- // Drag to delete
- private boolean mDeferringForDelete = false;
- private int DELETE_SLIDE_IN_SIDE_PAGE_DURATION = 250;
- private int DRAG_TO_DELETE_FADE_OUT_DURATION = 350;
-
- // Drop to delete
- private View mDeleteDropTarget;
-
- // Bouncer
- private boolean mTopAlignPageWhenShrinkingForBouncer = false;
-
- // Page warping
- private int mPageSwapIndex = -1; // the page we swapped out if needed
- private int mPageWarpIndex = -1; // the page we intend to warp
-
- private boolean mWarpPageExposed;
- private ViewPropertyAnimator mWarpAnimation;
-
- private boolean mIsCameraEvent;
- private float mWarpPeekAmount;
- private boolean mOnPageEndWarpCalled;
- private boolean mOnPageBeginWarpCalled;
-
- public interface PageSwitchListener {
- void onPageSwitching(View newPage, int newPageIndex);
- void onPageSwitched(View newPage, int newPageIndex);
- }
-
- public PagedView(Context context) {
- this(context, null);
- }
-
- public PagedView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public PagedView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- TypedArray a = context.obtainStyledAttributes(attrs,
- R.styleable.PagedView, defStyle, 0);
- setPageSpacing(a.getDimensionPixelSize(R.styleable.PagedView_pageSpacing, 0));
- mScrollIndicatorPaddingLeft =
- a.getDimensionPixelSize(R.styleable.PagedView_scrollIndicatorPaddingLeft, 0);
- mScrollIndicatorPaddingRight =
- a.getDimensionPixelSize(R.styleable.PagedView_scrollIndicatorPaddingRight, 0);
- a.recycle();
-
- Resources r = getResources();
- mEdgeSwipeRegionSize = r.getDimensionPixelSize(R.dimen.kg_edge_swipe_region_size);
- mTopAlignPageWhenShrinkingForBouncer =
- r.getBoolean(R.bool.kg_top_align_page_shrink_on_bouncer_visible);
-
- setHapticFeedbackEnabled(false);
- init();
- }
-
- /**
- * Initializes various states for this workspace.
- */
- protected void init() {
- mDirtyPageContent = new ArrayList<Boolean>();
- mDirtyPageContent.ensureCapacity(32);
- mScroller = new Scroller(getContext(), new ScrollInterpolator());
- mCurrentPage = 0;
-
- final ViewConfiguration configuration = ViewConfiguration.get(getContext());
- mTouchSlop = configuration.getScaledTouchSlop();
- mPagingTouchSlop = configuration.getScaledPagingTouchSlop();
- mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
- mDensity = getResources().getDisplayMetrics().density;
- mWarpPeekAmount = mDensity * WARP_ANIMATE_AMOUNT;
-
- // Scale the fling-to-delete threshold by the density
- mFlingToDeleteThresholdVelocity = (int) (mFlingToDeleteThresholdVelocity * mDensity);
-
- mFlingThresholdVelocity = (int) (FLING_THRESHOLD_VELOCITY * mDensity);
- mMinFlingVelocity = (int) (MIN_FLING_VELOCITY * mDensity);
- mMinSnapVelocity = (int) (MIN_SNAP_VELOCITY * mDensity);
- setOnHierarchyChangeListener(this);
- }
-
- void setDeleteDropTarget(View v) {
- mDeleteDropTarget = v;
- }
-
- // Convenience methods to map points from self to parent and vice versa
- float[] mapPointFromViewToParent(View v, float x, float y) {
- mTmpPoint[0] = x;
- mTmpPoint[1] = y;
- v.getMatrix().mapPoints(mTmpPoint);
- mTmpPoint[0] += v.getLeft();
- mTmpPoint[1] += v.getTop();
- return mTmpPoint;
- }
- float[] mapPointFromParentToView(View v, float x, float y) {
- mTmpPoint[0] = x - v.getLeft();
- mTmpPoint[1] = y - v.getTop();
- v.getMatrix().invert(mTmpInvMatrix);
- mTmpInvMatrix.mapPoints(mTmpPoint);
- return mTmpPoint;
- }
-
- void updateDragViewTranslationDuringDrag() {
- float x = mLastMotionX - mDownMotionX + getScrollX() - mDownScrollX;
- float y = mLastMotionY - mDownMotionY;
- mDragView.setTranslationX(x);
- mDragView.setTranslationY(y);
-
- if (DEBUG) Log.d(TAG, "PagedView.updateDragViewTranslationDuringDrag(): " + x + ", " + y);
- }
-
- public void setMinScale(float f) {
- mMinScale = f;
- requestLayout();
- }
-
- @Override
- public void setScaleX(float scaleX) {
- super.setScaleX(scaleX);
- if (isReordering(true)) {
- float[] p = mapPointFromParentToView(this, mParentDownMotionX, mParentDownMotionY);
- mLastMotionX = p[0];
- mLastMotionY = p[1];
- updateDragViewTranslationDuringDrag();
- }
- }
-
- // Convenience methods to get the actual width/height of the PagedView (since it is measured
- // to be larger to account for the minimum possible scale)
- int getViewportWidth() {
- return mViewport.width();
- }
- int getViewportHeight() {
- return mViewport.height();
- }
-
- // Convenience methods to get the offset ASSUMING that we are centering the pages in the
- // PagedView both horizontally and vertically
- int getViewportOffsetX() {
- return (getMeasuredWidth() - getViewportWidth()) / 2;
- }
- int getViewportOffsetY() {
- return (getMeasuredHeight() - getViewportHeight()) / 2;
- }
-
- public void setPageSwitchListener(PageSwitchListener pageSwitchListener) {
- mPageSwitchListener = pageSwitchListener;
- if (mPageSwitchListener != null) {
- mPageSwitchListener.onPageSwitched(getPageAt(mCurrentPage), mCurrentPage);
- }
- }
-
- /**
- * Called by subclasses to mark that data is ready, and that we can begin loading and laying
- * out pages.
- */
- protected void setDataIsReady() {
- mIsDataReady = true;
- }
-
- protected boolean isDataReady() {
- return mIsDataReady;
- }
-
- /**
- * Returns the index of the currently displayed page.
- *
- * @return The index of the currently displayed page.
- */
- int getCurrentPage() {
- return mCurrentPage;
- }
-
- int getNextPage() {
- return (mNextPage != INVALID_PAGE) ? mNextPage : mCurrentPage;
- }
-
- int getPageCount() {
- return getChildCount();
- }
-
- View getPageAt(int index) {
- return getChildAt(index);
- }
-
- protected int indexToPage(int index) {
- return index;
- }
-
- /**
- * Updates the scroll of the current page immediately to its final scroll position. We use this
- * in CustomizePagedView to allow tabs to share the same PagedView while resetting the scroll of
- * the previous tab page.
- */
- protected void updateCurrentPageScroll() {
- int offset = getChildOffset(mCurrentPage);
- int relOffset = getRelativeChildOffset(mCurrentPage);
- int newX = offset - relOffset;
- scrollTo(newX, 0);
- mScroller.setFinalX(newX);
- mScroller.forceFinished(true);
- }
-
- /**
- * Sets the current page.
- */
- void setCurrentPage(int currentPage) {
- notifyPageSwitching(currentPage);
- if (!mScroller.isFinished()) {
- mScroller.abortAnimation();
- }
- // don't introduce any checks like mCurrentPage == currentPage here-- if we change the
- // the default
- if (getChildCount() == 0) {
- return;
- }
-
- mForceScreenScrolled = true;
- mCurrentPage = Math.max(0, Math.min(currentPage, getPageCount() - 1));
- updateCurrentPageScroll();
- updateScrollingIndicator();
- notifyPageSwitched();
- invalidate();
- }
-
- public void setOnlyAllowEdgeSwipes(boolean enable) {
- mOnlyAllowEdgeSwipes = enable;
- }
-
- protected void notifyPageSwitching(int whichPage) {
- if (mPageSwitchListener != null) {
- mPageSwitchListener.onPageSwitching(getPageAt(whichPage), whichPage);
- }
- }
-
- protected void notifyPageSwitched() {
- if (mPageSwitchListener != null) {
- mPageSwitchListener.onPageSwitched(getPageAt(mCurrentPage), mCurrentPage);
- }
- }
-
- protected void pageBeginMoving() {
- if (DEBUG_WARP) Log.v(TAG, "pageBeginMoving(" + mIsPageMoving + ")");
- if (!mIsPageMoving) {
- mIsPageMoving = true;
- if (isWarping()) {
- dispatchOnPageBeginWarp();
- }
- onPageBeginMoving();
- }
- }
-
- private void dispatchOnPageBeginWarp() {
- if (!mOnPageBeginWarpCalled) {
- onPageBeginWarp();
- mOnPageBeginWarpCalled = true;
- }
- mOnPageEndWarpCalled = false;
- }
-
- private void dispatchOnPageEndWarp() {
- if (!mOnPageEndWarpCalled) {
- onPageEndWarp();
- mOnPageEndWarpCalled = true;
- }
- mOnPageBeginWarpCalled = false;
- }
-
- protected void pageEndMoving() {
- if (DEBUG_WARP) Log.v(TAG, "pageEndMoving(" + mIsPageMoving + ")");
- if (mIsPageMoving) {
- mIsPageMoving = false;
- if (isWarping()) {
- dispatchOnPageEndWarp();
- mWarpPageExposed = false;
- }
- onPageEndMoving();
- }
- }
-
- protected boolean isPageMoving() {
- return mIsPageMoving;
- }
-
- // a method that subclasses can override to add behavior
- protected void onPageBeginMoving() {
- }
-
- // a method that subclasses can override to add behavior
- protected void onPageEndMoving() {
- }
-
- /**
- * Registers the specified listener on each page contained in this workspace.
- *
- * @param l The listener used to respond to long clicks.
- */
- @Override
- public void setOnLongClickListener(OnLongClickListener l) {
- mLongClickListener = l;
- final int count = getPageCount();
- for (int i = 0; i < count; i++) {
- getPageAt(i).setOnLongClickListener(l);
- }
- }
-
- @Override
- public void scrollBy(int x, int y) {
- scrollTo(mUnboundedScrollX + x, getScrollY() + y);
- }
-
- @Override
- public void scrollTo(int x, int y) {
- mUnboundedScrollX = x;
-
- if (x < 0) {
- super.scrollTo(0, y);
- if (mAllowOverScroll) {
- overScroll(x);
- }
- } else if (x > mMaxScrollX) {
- super.scrollTo(mMaxScrollX, y);
- if (mAllowOverScroll) {
- overScroll(x - mMaxScrollX);
- }
- } else {
- mOverScrollX = x;
- super.scrollTo(x, y);
- }
-
- mTouchX = x;
- mSmoothingTime = System.nanoTime() / NANOTIME_DIV;
-
- // Update the last motion events when scrolling
- if (isReordering(true)) {
- float[] p = mapPointFromParentToView(this, mParentDownMotionX, mParentDownMotionY);
- mLastMotionX = p[0];
- mLastMotionY = p[1];
- updateDragViewTranslationDuringDrag();
- }
- }
-
- // we moved this functionality to a helper function so SmoothPagedView can reuse it
- protected boolean computeScrollHelper() {
- if (mScroller.computeScrollOffset()) {
- // Don't bother scrolling if the page does not need to be moved
- if (getScrollX() != mScroller.getCurrX()
- || getScrollY() != mScroller.getCurrY()
- || mOverScrollX != mScroller.getCurrX()) {
- scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
- }
- invalidate();
- return true;
- } else if (mNextPage != INVALID_PAGE) {
- mCurrentPage = Math.max(0, Math.min(mNextPage, getPageCount() - 1));
- mNextPage = INVALID_PAGE;
- notifyPageSwitched();
-
- // We don't want to trigger a page end moving unless the page has settled
- // and the user has stopped scrolling
- if (mTouchState == TOUCH_STATE_REST) {
- pageEndMoving();
- }
-
- onPostReorderingAnimationCompleted();
- return true;
- }
- return false;
- }
-
- @Override
- public void computeScroll() {
- computeScrollHelper();
- }
-
- protected boolean shouldSetTopAlignedPivotForWidget(int childIndex) {
- return mTopAlignPageWhenShrinkingForBouncer;
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- if (!mIsDataReady || getChildCount() == 0) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- return;
- }
-
- // We measure the dimensions of the PagedView to be larger than the pages so that when we
- // zoom out (and scale down), the view is still contained in the parent
- View parent = (View) getParent();
- int widthMode = MeasureSpec.getMode(widthMeasureSpec);
- int widthSize = MeasureSpec.getSize(widthMeasureSpec);
- int heightMode = MeasureSpec.getMode(heightMeasureSpec);
- int heightSize = MeasureSpec.getSize(heightMeasureSpec);
- // NOTE: We multiply by 1.5f to account for the fact that depending on the offset of the
- // viewport, we can be at most one and a half screens offset once we scale down
- DisplayMetrics dm = getResources().getDisplayMetrics();
- int maxSize = Math.max(dm.widthPixels, dm.heightPixels);
- int parentWidthSize = (int) (1.5f * maxSize);
- int parentHeightSize = maxSize;
- int scaledWidthSize = (int) (parentWidthSize / mMinScale);
- int scaledHeightSize = (int) (parentHeightSize / mMinScale);
- mViewport.set(0, 0, widthSize, heightSize);
-
- if (widthMode == MeasureSpec.UNSPECIFIED || heightMode == MeasureSpec.UNSPECIFIED) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- return;
- }
-
- // Return early if we aren't given a proper dimension
- if (widthSize <= 0 || heightSize <= 0) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- return;
- }
-
- /* Allow the height to be set as WRAP_CONTENT. This allows the particular case
- * of the All apps view on XLarge displays to not take up more space then it needs. Width
- * is still not allowed to be set as WRAP_CONTENT since many parts of the code expect
- * each page to have the same width.
- */
- final int verticalPadding = getPaddingTop() + getPaddingBottom();
- final int horizontalPadding = getPaddingLeft() + getPaddingRight();
-
- // The children are given the same width and height as the workspace
- // unless they were set to WRAP_CONTENT
- if (DEBUG) Log.d(TAG, "PagedView.onMeasure(): " + widthSize + ", " + heightSize);
- if (DEBUG) Log.d(TAG, "PagedView.scaledSize: " + scaledWidthSize + ", " + scaledHeightSize);
- if (DEBUG) Log.d(TAG, "PagedView.parentSize: " + parentWidthSize + ", " + parentHeightSize);
- if (DEBUG) Log.d(TAG, "PagedView.horizontalPadding: " + horizontalPadding);
- if (DEBUG) Log.d(TAG, "PagedView.verticalPadding: " + verticalPadding);
- final int childCount = getChildCount();
- for (int i = 0; i < childCount; i++) {
- // disallowing padding in paged view (just pass 0)
- final View child = getPageAt(i);
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
- int childWidthMode;
- if (lp.width == LayoutParams.WRAP_CONTENT) {
- childWidthMode = MeasureSpec.AT_MOST;
- } else {
- childWidthMode = MeasureSpec.EXACTLY;
- }
-
- int childHeightMode;
- if (lp.height == LayoutParams.WRAP_CONTENT) {
- childHeightMode = MeasureSpec.AT_MOST;
- } else {
- childHeightMode = MeasureSpec.EXACTLY;
- }
-
- final int childWidthMeasureSpec =
- MeasureSpec.makeMeasureSpec(widthSize - horizontalPadding, childWidthMode);
- final int childHeightMeasureSpec =
- MeasureSpec.makeMeasureSpec(heightSize - verticalPadding, childHeightMode);
-
- child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
- }
- setMeasuredDimension(scaledWidthSize, scaledHeightSize);
-
- // We can't call getChildOffset/getRelativeChildOffset until we set the measured dimensions.
- // We also wait until we set the measured dimensions before flushing the cache as well, to
- // ensure that the cache is filled with good values.
- invalidateCachedOffsets();
-
- if (mChildCountOnLastMeasure != getChildCount() && !mDeferringForDelete) {
- setCurrentPage(mCurrentPage);
- }
- mChildCountOnLastMeasure = getChildCount();
-
- if (childCount > 0) {
- if (DEBUG) Log.d(TAG, "getRelativeChildOffset(): " + getViewportWidth() + ", "
- + getChildWidth(0));
-
- // Calculate the variable page spacing if necessary
- if (mPageSpacing == AUTOMATIC_PAGE_SPACING) {
- // The gap between pages in the PagedView should be equal to the gap from the page
- // to the edge of the screen (so it is not visible in the current screen). To
- // account for unequal padding on each side of the paged view, we take the maximum
- // of the left/right gap and use that as the gap between each page.
- int offset = getRelativeChildOffset(0);
- int spacing = Math.max(offset, widthSize - offset -
- getChildAt(0).getMeasuredWidth());
- setPageSpacing(spacing);
- }
- }
-
- updateScrollingIndicatorPosition();
-
- if (childCount > 0) {
- mMaxScrollX = getChildOffset(childCount - 1) - getRelativeChildOffset(childCount - 1);
- } else {
- mMaxScrollX = 0;
- }
- }
-
- public void setPageSpacing(int pageSpacing) {
- mPageSpacing = pageSpacing;
- invalidateCachedOffsets();
- }
-
- @Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- if (!mIsDataReady || getChildCount() == 0) {
- return;
- }
-
- if (DEBUG) Log.d(TAG, "PagedView.onLayout()");
- final int childCount = getChildCount();
-
- int offsetX = getViewportOffsetX();
- int offsetY = getViewportOffsetY();
-
- // Update the viewport offsets
- mViewport.offset(offsetX, offsetY);
-
- int childLeft = offsetX + getRelativeChildOffset(0);
- for (int i = 0; i < childCount; i++) {
- final View child = getPageAt(i);
- int childTop = offsetY + getPaddingTop();
- if (child.getVisibility() != View.GONE) {
- final int childWidth = getScaledMeasuredWidth(child);
- final int childHeight = child.getMeasuredHeight();
-
- if (DEBUG) Log.d(TAG, "\tlayout-child" + i + ": " + childLeft + ", " + childTop);
- child.layout(childLeft, childTop,
- childLeft + child.getMeasuredWidth(), childTop + childHeight);
- childLeft += childWidth + mPageSpacing;
- }
- }
-
- if (mFirstLayout && mCurrentPage >= 0 && mCurrentPage < getChildCount()) {
- setHorizontalScrollBarEnabled(false);
- updateCurrentPageScroll();
- setHorizontalScrollBarEnabled(true);
- mFirstLayout = false;
- }
- }
-
- protected void screenScrolled(int screenCenter) {
- }
-
- @Override
- public void onChildViewAdded(View parent, View child) {
- // This ensures that when children are added, they get the correct transforms / alphas
- // in accordance with any scroll effects.
- mForceScreenScrolled = true;
- invalidate();
- invalidateCachedOffsets();
- }
-
- @Override
- public void onChildViewRemoved(View parent, View child) {
- mForceScreenScrolled = true;
- invalidate();
- invalidateCachedOffsets();
- }
-
- protected void invalidateCachedOffsets() {
- int count = getChildCount();
- if (count == 0) {
- mChildOffsets = null;
- mChildRelativeOffsets = null;
- mChildOffsetsWithLayoutScale = null;
- return;
- }
-
- mChildOffsets = new int[count];
- mChildRelativeOffsets = new int[count];
- mChildOffsetsWithLayoutScale = new int[count];
- for (int i = 0; i < count; i++) {
- mChildOffsets[i] = -1;
- mChildRelativeOffsets[i] = -1;
- mChildOffsetsWithLayoutScale[i] = -1;
- }
- }
-
- protected int getChildOffset(int index) {
- if (index < 0 || index > getChildCount() - 1) return 0;
-
- int[] childOffsets = Float.compare(mLayoutScale, 1f) == 0 ?
- mChildOffsets : mChildOffsetsWithLayoutScale;
-
- if (childOffsets != null && childOffsets[index] != -1) {
- return childOffsets[index];
- } else {
- if (getChildCount() == 0)
- return 0;
-
- int offset = getRelativeChildOffset(0);
- for (int i = 0; i < index; ++i) {
- offset += getScaledMeasuredWidth(getPageAt(i)) + mPageSpacing;
- }
- if (childOffsets != null) {
- childOffsets[index] = offset;
- }
- return offset;
- }
- }
-
- protected int getRelativeChildOffset(int index) {
- if (index < 0 || index > getChildCount() - 1) return 0;
-
- if (mChildRelativeOffsets != null && mChildRelativeOffsets[index] != -1) {
- return mChildRelativeOffsets[index];
- } else {
- final int padding = getPaddingLeft() + getPaddingRight();
- final int offset = getPaddingLeft() +
- (getViewportWidth() - padding - getChildWidth(index)) / 2;
- if (mChildRelativeOffsets != null) {
- mChildRelativeOffsets[index] = offset;
- }
- return offset;
- }
- }
-
- protected int getScaledMeasuredWidth(View child) {
- // This functions are called enough times that it actually makes a difference in the
- // profiler -- so just inline the max() here
- final int measuredWidth = child.getMeasuredWidth();
- final int minWidth = mMinimumWidth;
- final int maxWidth = (minWidth > measuredWidth) ? minWidth : measuredWidth;
- return (int) (maxWidth * mLayoutScale + 0.5f);
- }
-
- void boundByReorderablePages(boolean isReordering, int[] range) {
- // Do nothing
- }
-
- // TODO: Fix this
- protected void getVisiblePages(int[] range) {
- range[0] = 0;
- range[1] = getPageCount() - 1;
-
- /*
- final int pageCount = getChildCount();
-
- if (pageCount > 0) {
- final int screenWidth = getViewportWidth();
- int leftScreen = 0;
- int rightScreen = 0;
- int offsetX = getViewportOffsetX() + getScrollX();
- View currPage = getPageAt(leftScreen);
- while (leftScreen < pageCount - 1 &&
- currPage.getX() + currPage.getWidth() -
- currPage.getPaddingRight() < offsetX) {
- leftScreen++;
- currPage = getPageAt(leftScreen);
- }
- rightScreen = leftScreen;
- currPage = getPageAt(rightScreen + 1);
- while (rightScreen < pageCount - 1 &&
- currPage.getX() - currPage.getPaddingLeft() < offsetX + screenWidth) {
- rightScreen++;
- currPage = getPageAt(rightScreen + 1);
- }
-
- // TEMP: this is a hacky way to ensure that animations to new pages are not clipped
- // because we don't draw them while scrolling?
- range[0] = Math.max(0, leftScreen - 1);
- range[1] = Math.min(rightScreen + 1, getChildCount() - 1);
- } else {
- range[0] = -1;
- range[1] = -1;
- }
- */
- }
-
- protected boolean shouldDrawChild(View child) {
- return child.getAlpha() > 0;
- }
-
- @Override
- protected void dispatchDraw(Canvas canvas) {
- int halfScreenSize = getViewportWidth() / 2;
- // mOverScrollX is equal to getScrollX() when we're within the normal scroll range.
- // Otherwise it is equal to the scaled overscroll position.
- int screenCenter = mOverScrollX + halfScreenSize;
-
- if (screenCenter != mLastScreenCenter || mForceScreenScrolled) {
- // set mForceScreenScrolled before calling screenScrolled so that screenScrolled can
- // set it for the next frame
- mForceScreenScrolled = false;
- screenScrolled(screenCenter);
- mLastScreenCenter = screenCenter;
- }
-
- // Find out which screens are visible; as an optimization we only call draw on them
- final int pageCount = getChildCount();
- if (pageCount > 0) {
- getVisiblePages(mTempVisiblePagesRange);
- final int leftScreen = mTempVisiblePagesRange[0];
- final int rightScreen = mTempVisiblePagesRange[1];
- if (leftScreen != -1 && rightScreen != -1) {
- final long drawingTime = getDrawingTime();
- // Clip to the bounds
- canvas.save();
- canvas.clipRect(getScrollX(), getScrollY(), getScrollX() + getRight() - getLeft(),
- getScrollY() + getBottom() - getTop());
-
- // Draw all the children, leaving the drag view for last
- for (int i = pageCount - 1; i >= 0; i--) {
- final View v = getPageAt(i);
- if (v == mDragView) continue;
- if (mForceDrawAllChildrenNextFrame ||
- (leftScreen <= i && i <= rightScreen && shouldDrawChild(v))) {
- drawChild(canvas, v, drawingTime);
- }
- }
- // Draw the drag view on top (if there is one)
- if (mDragView != null) {
- drawChild(canvas, mDragView, drawingTime);
- }
-
- mForceDrawAllChildrenNextFrame = false;
- canvas.restore();
- }
- }
- }
-
- @Override
- public boolean requestChildRectangleOnScreen(View child, Rect rectangle, boolean immediate) {
- int page = indexToPage(indexOfChild(child));
- if (page != mCurrentPage || !mScroller.isFinished()) {
- snapToPage(page);
- return true;
- }
- return false;
- }
-
- @Override
- protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
- int focusablePage;
- if (mNextPage != INVALID_PAGE) {
- focusablePage = mNextPage;
- } else {
- focusablePage = mCurrentPage;
- }
- View v = getPageAt(focusablePage);
- if (v != null) {
- return v.requestFocus(direction, previouslyFocusedRect);
- }
- return false;
- }
-
- @Override
- public boolean dispatchUnhandledMove(View focused, int direction) {
- if (direction == View.FOCUS_LEFT) {
- if (getCurrentPage() > 0) {
- snapToPage(getCurrentPage() - 1);
- return true;
- }
- } else if (direction == View.FOCUS_RIGHT) {
- if (getCurrentPage() < getPageCount() - 1) {
- snapToPage(getCurrentPage() + 1);
- return true;
- }
- }
- return super.dispatchUnhandledMove(focused, direction);
- }
-
- @Override
- public void addFocusables(ArrayList<View> views, int direction, int focusableMode) {
- if (mCurrentPage >= 0 && mCurrentPage < getPageCount()) {
- getPageAt(mCurrentPage).addFocusables(views, direction, focusableMode);
- }
- if (direction == View.FOCUS_LEFT) {
- if (mCurrentPage > 0) {
- getPageAt(mCurrentPage - 1).addFocusables(views, direction, focusableMode);
- }
- } else if (direction == View.FOCUS_RIGHT){
- if (mCurrentPage < getPageCount() - 1) {
- getPageAt(mCurrentPage + 1).addFocusables(views, direction, focusableMode);
- }
- }
- }
-
- /**
- * If one of our descendant views decides that it could be focused now, only
- * pass that along if it's on the current page.
- *
- * This happens when live folders requery, and if they're off page, they
- * end up calling requestFocus, which pulls it on page.
- */
- @Override
- public void focusableViewAvailable(View focused) {
- View current = getPageAt(mCurrentPage);
- View v = focused;
- while (true) {
- if (v == current) {
- super.focusableViewAvailable(focused);
- return;
- }
- if (v == this) {
- return;
- }
- ViewParent parent = v.getParent();
- if (parent instanceof View) {
- v = (View)v.getParent();
- } else {
- return;
- }
- }
- }
-
- /**
- * Return true if a tap at (x, y) should trigger a flip to the previous page.
- */
- protected boolean hitsPreviousPage(float x, float y) {
- return (x < getViewportOffsetX() + getRelativeChildOffset(mCurrentPage) - mPageSpacing);
- }
-
- /**
- * Return true if a tap at (x, y) should trigger a flip to the next page.
- */
- protected boolean hitsNextPage(float x, float y) {
- return (x > (getViewportOffsetX() + getViewportWidth() - getRelativeChildOffset(mCurrentPage) + mPageSpacing));
- }
-
- /** Returns whether x and y originated within the buffered viewport */
- private boolean isTouchPointInViewportWithBuffer(int x, int y) {
- mTmpRect.set(mViewport.left - mViewport.width() / 2, mViewport.top,
- mViewport.right + mViewport.width() / 2, mViewport.bottom);
- return mTmpRect.contains(x, y);
- }
-
- /** Returns whether x and y originated within the current page view bounds */
- private boolean isTouchPointInCurrentPage(int x, int y) {
- View v = getPageAt(getCurrentPage());
- if (v != null) {
- mTmpRect.set((v.getLeft() - getScrollX()), 0, (v.getRight() - getScrollX()),
- v.getBottom());
- return mTmpRect.contains(x, y);
- }
- return false;
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- if (DISABLE_TOUCH_INTERACTION) {
- return false;
- }
-
- /*
- * This method JUST determines whether we want to intercept the motion.
- * If we return true, onTouchEvent will be called and we do the actual
- * scrolling there.
- */
- acquireVelocityTrackerAndAddMovement(ev);
-
- // Skip touch handling if there are no pages to swipe
- if (getChildCount() <= 0) return super.onInterceptTouchEvent(ev);
-
- /*
- * Shortcut the most recurring case: the user is in the dragging
- * state and he is moving his finger. We want to intercept this
- * motion.
- */
- final int action = ev.getAction();
- if ((action == MotionEvent.ACTION_MOVE) &&
- (mTouchState == TOUCH_STATE_SCROLLING)) {
- return true;
- }
-
- switch (action & MotionEvent.ACTION_MASK) {
- case MotionEvent.ACTION_MOVE: {
- /*
- * mIsBeingDragged == false, otherwise the shortcut would have caught it. Check
- * whether the user has moved far enough from his original down touch.
- */
- if (mActivePointerId != INVALID_POINTER) {
- if (mIsCameraEvent || determineScrollingStart(ev)) {
- startScrolling(ev);
- }
- break;
- }
- // if mActivePointerId is INVALID_POINTER, then we must have missed an ACTION_DOWN
- // event. in that case, treat the first occurence of a move event as a ACTION_DOWN
- // i.e. fall through to the next case (don't break)
- // (We sometimes miss ACTION_DOWN events in Workspace because it ignores all events
- // while it's small- this was causing a crash before we checked for INVALID_POINTER)
-
- break;
- }
-
- case MotionEvent.ACTION_DOWN: {
- if (mIsCameraEvent) {
- animateWarpPageOnScreen("interceptTouch(): DOWN");
- }
- // Remember where the motion event started
- saveDownState(ev);
-
- /*
- * If being flinged and user touches the screen, initiate drag;
- * otherwise don't. mScroller.isFinished should be false when
- * being flinged.
- */
- final int xDist = Math.abs(mScroller.getFinalX() - mScroller.getCurrX());
- final boolean finishedScrolling = (mScroller.isFinished() || xDist < mTouchSlop);
- if (finishedScrolling) {
- setTouchState(TOUCH_STATE_REST);
- mScroller.abortAnimation();
- } else {
- if (mIsCameraEvent || isTouchPointInViewportWithBuffer(
- (int) mDownMotionX, (int) mDownMotionY)) {
- setTouchState(TOUCH_STATE_SCROLLING);
- } else {
- setTouchState(TOUCH_STATE_REST);
- }
- }
-
- // check if this can be the beginning of a tap on the side of the pages
- // to scroll the current page
- if (!DISABLE_TOUCH_SIDE_PAGES) {
- if (mTouchState != TOUCH_STATE_PREV_PAGE
- && mTouchState != TOUCH_STATE_NEXT_PAGE) {
- if (getChildCount() > 0) {
- float x = ev.getX();
- float y = ev.getY();
- if (hitsPreviousPage(x, y)) {
- setTouchState(TOUCH_STATE_PREV_PAGE);
- } else if (hitsNextPage(x, y)) {
- setTouchState(TOUCH_STATE_NEXT_PAGE);
- }
- }
- }
- }
- break;
- }
-
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_CANCEL:
- resetTouchState();
- // Just intercept the touch event on up if we tap outside the strict viewport
- if (!isTouchPointInCurrentPage((int) mLastMotionX, (int) mLastMotionY)) {
- return true;
- }
- break;
-
- case MotionEvent.ACTION_POINTER_UP:
- onSecondaryPointerUp(ev);
- releaseVelocityTracker();
- break;
- }
-
- /*
- * The only time we want to intercept motion events is if we are in the
- * drag mode.
- */
- return mTouchState != TOUCH_STATE_REST;
- }
-
- private void setTouchState(int touchState) {
- if (mTouchState != touchState) {
- if (DEBUG_WARP) Log.v(TAG, "mTouchState changing to " + touchState);
- onTouchStateChanged(touchState);
- mTouchState = touchState;
- }
- }
-
- void onTouchStateChanged(int newTouchState) {
- if (DEBUG) {
- Log.v(TAG, "onTouchStateChanged(old="+ mTouchState + ", new=" + newTouchState + ")");
- }
- }
-
- /**
- * Save the state when we get {@link MotionEvent#ACTION_DOWN}
- * @param ev
- */
- private void saveDownState(MotionEvent ev) {
- // Remember where the motion event started
- mDownMotionX = mLastMotionX = ev.getX();
- mDownMotionY = mLastMotionY = ev.getY();
- mDownScrollX = getScrollX();
- float[] p = mapPointFromViewToParent(this, mLastMotionX, mLastMotionY);
- mParentDownMotionX = p[0];
- mParentDownMotionY = p[1];
- mLastMotionXRemainder = 0;
- mTotalMotionX = 0;
- mActivePointerId = ev.getPointerId(0);
-
- // Determine if the down event is within the threshold to be an edge swipe
- int leftEdgeBoundary = getViewportOffsetX() + mEdgeSwipeRegionSize;
- int rightEdgeBoundary = getMeasuredWidth() - getViewportOffsetX() - mEdgeSwipeRegionSize;
- if ((mDownMotionX <= leftEdgeBoundary || mDownMotionX >= rightEdgeBoundary)) {
- mDownEventOnEdge = true;
- }
- }
-
- private boolean isHorizontalCameraScroll(MotionEvent ev) {
- // Disallow scrolling if we don't have a valid pointer index
- final int pointerIndex = ev.findPointerIndex(mActivePointerId);
- if (pointerIndex == -1) return false;
-
- // If we're only allowing edge swipes, we break out early if the down event wasn't
- // at the edge.
- if (mOnlyAllowEdgeSwipes && !mDownEventOnEdge) return false;
-
- final float x = ev.getX(pointerIndex);
- final int xDiff = (int) Math.abs(x - mDownMotionX);
-
- final int touchSlop = Math.round(TOUCH_SLOP_SCALE * mTouchSlop);
- boolean xPaged = xDiff > mPagingTouchSlop;
- boolean xMoved = xDiff > touchSlop;
-
- return mIsCameraEvent && (mUsePagingTouchSlop ? xPaged : xMoved);
- }
-
- /*
- * Determines if we should change the touch state to start scrolling after the
- * user moves their touch point too far.
- */
- protected boolean determineScrollingStart(MotionEvent ev) {
- // Disallow scrolling if we don't have a valid pointer index
- final int pointerIndex = ev.findPointerIndex(mActivePointerId);
- if (pointerIndex == -1) return false;
-
- // Disallow scrolling if we started the gesture from outside the viewport
- final float x = ev.getX(pointerIndex);
- final float y = ev.getY(pointerIndex);
- if (!isTouchPointInViewportWithBuffer((int) x, (int) y)) return false;
-
- // If we're only allowing edge swipes, we break out early if the down event wasn't
- // at the edge.
- if (mOnlyAllowEdgeSwipes && !mDownEventOnEdge) return false;
-
- final int xDiff = (int) Math.abs(x - mLastMotionX);
-
- final int touchSlop = Math.round(TOUCH_SLOP_SCALE * mTouchSlop);
- boolean xPaged = xDiff > mPagingTouchSlop;
- boolean xMoved = xDiff > touchSlop;
-
- return mUsePagingTouchSlop ? xPaged : xMoved;
- }
-
- private void startScrolling(MotionEvent ev) {
- // Ignore if we don't have a valid pointer index
- final int pointerIndex = ev.findPointerIndex(mActivePointerId);
- if (pointerIndex == -1) return;
-
- final float x = ev.getX(pointerIndex);
- setTouchState(TOUCH_STATE_SCROLLING);
- mTotalMotionX += Math.abs(mLastMotionX - x);
- mLastMotionX = x;
- mLastMotionXRemainder = 0;
- mTouchX = getViewportOffsetX() + getScrollX();
- mSmoothingTime = System.nanoTime() / NANOTIME_DIV;
- pageBeginMoving();
- }
-
- protected float getMaxScrollProgress() {
- return 1.0f;
- }
-
- protected float getBoundedScrollProgress(int screenCenter, View v, int page) {
- final int halfScreenSize = getViewportWidth() / 2;
-
- screenCenter = Math.min(mScrollX + halfScreenSize, screenCenter);
- screenCenter = Math.max(halfScreenSize, screenCenter);
-
- return getScrollProgress(screenCenter, v, page);
- }
-
- protected float getScrollProgress(int screenCenter, View v, int page) {
- final int halfScreenSize = getViewportWidth() / 2;
-
- int totalDistance = getScaledMeasuredWidth(v) + mPageSpacing;
- int delta = screenCenter - (getChildOffset(page) -
- getRelativeChildOffset(page) + halfScreenSize);
-
- float scrollProgress = delta / (totalDistance * 1.0f);
- scrollProgress = Math.min(scrollProgress, getMaxScrollProgress());
- scrollProgress = Math.max(scrollProgress, - getMaxScrollProgress());
- return scrollProgress;
- }
-
- // This curve determines how the effect of scrolling over the limits of the page dimishes
- // as the user pulls further and further from the bounds
- private float overScrollInfluenceCurve(float f) {
- f -= 1.0f;
- return f * f * f + 1.0f;
- }
-
- protected void acceleratedOverScroll(float amount) {
- int screenSize = getViewportWidth();
-
- // We want to reach the max over scroll effect when the user has
- // over scrolled half the size of the screen
- float f = OVERSCROLL_ACCELERATE_FACTOR * (amount / screenSize);
-
- if (f == 0) return;
-
- // Clamp this factor, f, to -1 < f < 1
- if (Math.abs(f) >= 1) {
- f /= Math.abs(f);
- }
-
- int overScrollAmount = (int) Math.round(f * screenSize);
- if (amount < 0) {
- mOverScrollX = overScrollAmount;
- super.scrollTo(0, getScrollY());
- } else {
- mOverScrollX = mMaxScrollX + overScrollAmount;
- super.scrollTo(mMaxScrollX, getScrollY());
- }
- invalidate();
- }
-
- protected void dampedOverScroll(float amount) {
- int screenSize = getViewportWidth();
-
- float f = (amount / screenSize);
-
- if (f == 0) return;
- f = f / (Math.abs(f)) * (overScrollInfluenceCurve(Math.abs(f)));
-
- // Clamp this factor, f, to -1 < f < 1
- if (Math.abs(f) >= 1) {
- f /= Math.abs(f);
- }
-
- int overScrollAmount = (int) Math.round(OVERSCROLL_DAMP_FACTOR * f * screenSize);
- if (amount < 0) {
- mOverScrollX = overScrollAmount;
- super.scrollTo(0, getScrollY());
- } else {
- mOverScrollX = mMaxScrollX + overScrollAmount;
- super.scrollTo(mMaxScrollX, getScrollY());
- }
- invalidate();
- }
-
- protected void overScroll(float amount) {
- dampedOverScroll(amount);
- }
-
- protected float maxOverScroll() {
- // Using the formula in overScroll, assuming that f = 1.0 (which it should generally not
- // exceed). Used to find out how much extra wallpaper we need for the over scroll effect
- float f = 1.0f;
- f = f / (Math.abs(f)) * (overScrollInfluenceCurve(Math.abs(f)));
- return OVERSCROLL_DAMP_FACTOR * f;
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- if (DISABLE_TOUCH_INTERACTION) {
- return false;
- }
-
- // Skip touch handling if there are no pages to swipe
- if (getChildCount() <= 0) return super.onTouchEvent(ev);
-
- acquireVelocityTrackerAndAddMovement(ev);
-
- final int action = ev.getAction();
-
- switch (action & MotionEvent.ACTION_MASK) {
- case MotionEvent.ACTION_DOWN:
- /*
- * If being flinged and user touches, stop the fling. isFinished
- * will be false if being flinged.
- */
- if (!mScroller.isFinished()) {
- mScroller.abortAnimation();
- }
-
- // Remember where the motion event started
- saveDownState(ev);
-
- if (mTouchState == TOUCH_STATE_SCROLLING) {
- pageBeginMoving();
- } else {
- setTouchState(TOUCH_STATE_READY);
- }
-
- if (mIsCameraEvent) {
- animateWarpPageOnScreen("onTouch(): DOWN");
- }
- break;
-
- case MotionEvent.ACTION_MOVE:
- if (mTouchState == TOUCH_STATE_SCROLLING) {
- // Scroll to follow the motion event
- final int pointerIndex = ev.findPointerIndex(mActivePointerId);
-
- if (pointerIndex == -1) return true;
-
- final float x = ev.getX(pointerIndex);
- final float deltaX = mLastMotionX + mLastMotionXRemainder - x;
-
- mTotalMotionX += Math.abs(deltaX);
-
- // Only scroll and update mLastMotionX if we have moved some discrete amount. We
- // keep the remainder because we are actually testing if we've moved from the last
- // scrolled position (which is discrete).
- if (Math.abs(deltaX) >= 1.0f) {
- mTouchX += deltaX;
- mSmoothingTime = System.nanoTime() / NANOTIME_DIV;
- if (isWarping()) {
- KeyguardWidgetFrame v = (KeyguardWidgetFrame) getPageAt(getPageWarpIndex());
- v.setTranslationX(v.getTranslationX() - deltaX);
- } else if (!mDeferScrollUpdate) {
- scrollBy((int) deltaX, 0);
- if (DEBUG) Log.d(TAG, "onTouchEvent().Scrolling: " + deltaX);
- } else {
- invalidate();
- }
- mLastMotionX = x;
- mLastMotionXRemainder = deltaX - (int) deltaX;
- } else {
- awakenScrollBars();
- }
- } else if (mTouchState == TOUCH_STATE_REORDERING) {
- // Update the last motion position
- mLastMotionX = ev.getX();
- mLastMotionY = ev.getY();
-
- // Update the parent down so that our zoom animations take this new movement into
- // account
- float[] pt = mapPointFromViewToParent(this, mLastMotionX, mLastMotionY);
- mParentDownMotionX = pt[0];
- mParentDownMotionY = pt[1];
- updateDragViewTranslationDuringDrag();
-
- // Find the closest page to the touch point
- final int dragViewIndex = indexOfChild(mDragView);
- int bufferSize = (int) (REORDERING_SIDE_PAGE_BUFFER_PERCENTAGE *
- getViewportWidth());
- int leftBufferEdge = (int) (mapPointFromViewToParent(this, mViewport.left, 0)[0]
- + bufferSize);
- int rightBufferEdge = (int) (mapPointFromViewToParent(this, mViewport.right, 0)[0]
- - bufferSize);
-
- // Change the drag view if we are hovering over the drop target
- boolean isHoveringOverDelete = isHoveringOverDeleteDropTarget(
- (int) mParentDownMotionX, (int) mParentDownMotionY);
- setPageHoveringOverDeleteDropTarget(dragViewIndex, isHoveringOverDelete);
-
- if (DEBUG) Log.d(TAG, "leftBufferEdge: " + leftBufferEdge);
- if (DEBUG) Log.d(TAG, "rightBufferEdge: " + rightBufferEdge);
- if (DEBUG) Log.d(TAG, "mLastMotionX: " + mLastMotionX);
- if (DEBUG) Log.d(TAG, "mLastMotionY: " + mLastMotionY);
- if (DEBUG) Log.d(TAG, "mParentDownMotionX: " + mParentDownMotionX);
- if (DEBUG) Log.d(TAG, "mParentDownMotionY: " + mParentDownMotionY);
-
- float parentX = mParentDownMotionX;
- int pageIndexToSnapTo = -1;
- if (parentX < leftBufferEdge && dragViewIndex > 0) {
- pageIndexToSnapTo = dragViewIndex - 1;
- } else if (parentX > rightBufferEdge && dragViewIndex < getChildCount() - 1) {
- pageIndexToSnapTo = dragViewIndex + 1;
- }
-
- final int pageUnderPointIndex = pageIndexToSnapTo;
- if (pageUnderPointIndex > -1 && !isHoveringOverDelete) {
- mTempVisiblePagesRange[0] = 0;
- mTempVisiblePagesRange[1] = getPageCount() - 1;
- boundByReorderablePages(true, mTempVisiblePagesRange);
- if (mTempVisiblePagesRange[0] <= pageUnderPointIndex &&
- pageUnderPointIndex <= mTempVisiblePagesRange[1] &&
- pageUnderPointIndex != mSidePageHoverIndex && mScroller.isFinished()) {
- mSidePageHoverIndex = pageUnderPointIndex;
- mSidePageHoverRunnable = new Runnable() {
- @Override
- public void run() {
- // Update the down scroll position to account for the fact that the
- // current page is moved
- mDownScrollX = getChildOffset(pageUnderPointIndex)
- - getRelativeChildOffset(pageUnderPointIndex);
-
- // Setup the scroll to the correct page before we swap the views
- snapToPage(pageUnderPointIndex);
-
- // For each of the pages between the paged view and the drag view,
- // animate them from the previous position to the new position in
- // the layout (as a result of the drag view moving in the layout)
- int shiftDelta = (dragViewIndex < pageUnderPointIndex) ? -1 : 1;
- int lowerIndex = (dragViewIndex < pageUnderPointIndex) ?
- dragViewIndex + 1 : pageUnderPointIndex;
- int upperIndex = (dragViewIndex > pageUnderPointIndex) ?
- dragViewIndex - 1 : pageUnderPointIndex;
- for (int i = lowerIndex; i <= upperIndex; ++i) {
- View v = getChildAt(i);
- // dragViewIndex < pageUnderPointIndex, so after we remove the
- // drag view all subsequent views to pageUnderPointIndex will
- // shift down.
- int oldX = getViewportOffsetX() + getChildOffset(i);
- int newX = getViewportOffsetX() + getChildOffset(i + shiftDelta);
-
- // Animate the view translation from its old position to its new
- // position
- AnimatorSet anim = (AnimatorSet) v.getTag();
- if (anim != null) {
- anim.cancel();
- }
-
- v.setTranslationX(oldX - newX);
- anim = new AnimatorSet();
- anim.setDuration(REORDERING_REORDER_REPOSITION_DURATION);
- anim.playTogether(
- ObjectAnimator.ofFloat(v, "translationX", 0f));
- anim.start();
- v.setTag(anim);
- }
-
- removeView(mDragView);
- onRemoveView(mDragView, false);
- addView(mDragView, pageUnderPointIndex);
- onAddView(mDragView, pageUnderPointIndex);
- mSidePageHoverIndex = -1;
- }
- };
- postDelayed(mSidePageHoverRunnable, REORDERING_SIDE_PAGE_HOVER_TIMEOUT);
- }
- } else {
- removeCallbacks(mSidePageHoverRunnable);
- mSidePageHoverIndex = -1;
- }
- } else if (determineScrollingStart(ev)) {
- startScrolling(ev);
- } else if (isHorizontalCameraScroll(ev)) {
- startScrolling(ev);
- // we need to cancel the camera animation
- KeyguardWidgetFrame v = (KeyguardWidgetFrame) getPageAt(getPageWarpIndex());
- v.animate().cancel();
- }
- break;
-
- case MotionEvent.ACTION_UP:
- if (mTouchState == TOUCH_STATE_SCROLLING) {
- final int activePointerId = mActivePointerId;
- final int pointerIndex = ev.findPointerIndex(activePointerId);
-
- if (pointerIndex == -1) return true;
-
- final float x = ev.getX(pointerIndex);
- final VelocityTracker velocityTracker = mVelocityTracker;
- velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
- int velocityX = (int) velocityTracker.getXVelocity(activePointerId);
- final int deltaX = (int) (x - mDownMotionX);
- final int pageWidth = getScaledMeasuredWidth(getPageAt(mCurrentPage));
- boolean isSignificantMove = Math.abs(deltaX) > pageWidth *
- SIGNIFICANT_MOVE_THRESHOLD;
-
- mTotalMotionX += Math.abs(mLastMotionX + mLastMotionXRemainder - x);
-
- boolean isFling = mTotalMotionX > MIN_LENGTH_FOR_FLING &&
- Math.abs(velocityX) > mFlingThresholdVelocity;
-
- // In the case that the page is moved far to one direction and then is flung
- // in the opposite direction, we use a threshold to determine whether we should
- // just return to the starting page, or if we should skip one further.
- boolean returnToOriginalPage = false;
- if (Math.abs(deltaX) > pageWidth * RETURN_TO_ORIGINAL_PAGE_THRESHOLD &&
- Math.signum(velocityX) != Math.signum(deltaX) && isFling) {
- returnToOriginalPage = true;
- }
-
- int finalPage;
- // We give flings precedence over large moves, which is why we short-circuit our
- // test for a large move if a fling has been registered. That is, a large
- // move to the left and fling to the right will register as a fling to the right.
- if (((isSignificantMove && deltaX > 0 && !isFling) ||
- (isFling && velocityX > 0)) && mCurrentPage > 0) {
- finalPage = returnToOriginalPage || isWarping()
- ? mCurrentPage : mCurrentPage - 1;
- snapToPageWithVelocity(finalPage, velocityX);
- } else if (((isSignificantMove && deltaX < 0 && !isFling) ||
- (isFling && velocityX < 0)) &&
- mCurrentPage < getChildCount() - 1) {
- finalPage = returnToOriginalPage ? mCurrentPage :
- isWarping() ? getPageWarpIndex() : mCurrentPage + 1;
- snapToPageWithVelocity(finalPage, velocityX);
- } else {
- snapToDestination();
- }
- } else if (mTouchState == TOUCH_STATE_PREV_PAGE) {
- // at this point we have not moved beyond the touch slop
- // (otherwise mTouchState would be TOUCH_STATE_SCROLLING), so
- // we can just page
- int nextPage = Math.max(0, mCurrentPage - 1);
- if (nextPage != mCurrentPage) {
- snapToPage(nextPage);
- } else {
- snapToDestination();
- }
- } else if (mTouchState == TOUCH_STATE_NEXT_PAGE) {
- // at this point we have not moved beyond the touch slop
- // (otherwise mTouchState would be TOUCH_STATE_SCROLLING), so
- // we can just page
- int nextPage = Math.min(getChildCount() - 1, mCurrentPage + 1);
- if (nextPage != mCurrentPage) {
- snapToPage(nextPage);
- } else {
- snapToDestination();
- }
- } else if (mTouchState == TOUCH_STATE_REORDERING) {
- // Update the last motion position
- mLastMotionX = ev.getX();
- mLastMotionY = ev.getY();
-
- // Update the parent down so that our zoom animations take this new movement into
- // account
- float[] pt = mapPointFromViewToParent(this, mLastMotionX, mLastMotionY);
- mParentDownMotionX = pt[0];
- mParentDownMotionY = pt[1];
- updateDragViewTranslationDuringDrag();
- boolean handledFling = false;
- if (!DISABLE_FLING_TO_DELETE) {
- // Check the velocity and see if we are flinging-to-delete
- PointF flingToDeleteVector = isFlingingToDelete();
- if (flingToDeleteVector != null) {
- onFlingToDelete(flingToDeleteVector);
- handledFling = true;
- }
- }
- if (!handledFling && isHoveringOverDeleteDropTarget((int) mParentDownMotionX,
- (int) mParentDownMotionY)) {
- onDropToDelete();
- }
- } else {
- if (DEBUG_WARP) Log.v(TAG, "calling onUnhandledTap()");
- if (mWarpPageExposed && !isAnimatingWarpPage()) {
- animateWarpPageOffScreen("unhandled tap", true);
- }
- onUnhandledTap(ev);
- }
-
- // Remove the callback to wait for the side page hover timeout
- removeCallbacks(mSidePageHoverRunnable);
- // End any intermediate reordering states
- resetTouchState();
- break;
-
- case MotionEvent.ACTION_CANCEL:
- if (mTouchState == TOUCH_STATE_SCROLLING) {
- snapToDestination();
- }
- resetTouchState();
- break;
-
- case MotionEvent.ACTION_POINTER_UP:
- onSecondaryPointerUp(ev);
- break;
- }
-
- return true;
- }
-
- //public abstract void onFlingToDelete(View v);
- public abstract void onRemoveView(View v, boolean deletePermanently);
- public abstract void onRemoveViewAnimationCompleted();
- public abstract void onAddView(View v, int index);
-
- private void resetTouchState() {
- releaseVelocityTracker();
- endReordering();
- setTouchState(TOUCH_STATE_REST);
- mActivePointerId = INVALID_POINTER;
- mDownEventOnEdge = false;
- }
-
- protected void onUnhandledTap(MotionEvent ev) {}
-
- @Override
- public boolean onGenericMotionEvent(MotionEvent event) {
- if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) {
- switch (event.getAction()) {
- case MotionEvent.ACTION_SCROLL: {
- // Handle mouse (or ext. device) by shifting the page depending on the scroll
- final float vscroll;
- final float hscroll;
- if ((event.getMetaState() & KeyEvent.META_SHIFT_ON) != 0) {
- vscroll = 0;
- hscroll = event.getAxisValue(MotionEvent.AXIS_VSCROLL);
- } else {
- vscroll = -event.getAxisValue(MotionEvent.AXIS_VSCROLL);
- hscroll = event.getAxisValue(MotionEvent.AXIS_HSCROLL);
- }
- if (hscroll != 0 || vscroll != 0) {
- if (hscroll > 0 || vscroll > 0) {
- scrollRight();
- } else {
- scrollLeft();
- }
- return true;
- }
- }
- }
- }
- return super.onGenericMotionEvent(event);
- }
-
- private void acquireVelocityTrackerAndAddMovement(MotionEvent ev) {
- if (mVelocityTracker == null) {
- mVelocityTracker = VelocityTracker.obtain();
- }
- mVelocityTracker.addMovement(ev);
- }
-
- private void releaseVelocityTracker() {
- if (mVelocityTracker != null) {
- mVelocityTracker.recycle();
- mVelocityTracker = null;
- }
- }
-
- private void onSecondaryPointerUp(MotionEvent ev) {
- final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >>
- MotionEvent.ACTION_POINTER_INDEX_SHIFT;
- final int pointerId = ev.getPointerId(pointerIndex);
- if (pointerId == mActivePointerId) {
- // This was our active pointer going up. Choose a new
- // active pointer and adjust accordingly.
- // TODO: Make this decision more intelligent.
- final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
- mLastMotionX = mDownMotionX = ev.getX(newPointerIndex);
- mLastMotionY = ev.getY(newPointerIndex);
- mLastMotionXRemainder = 0;
- mActivePointerId = ev.getPointerId(newPointerIndex);
- if (mVelocityTracker != null) {
- mVelocityTracker.clear();
- }
- }
- }
-
- @Override
- public void requestChildFocus(View child, View focused) {
- super.requestChildFocus(child, focused);
- int page = indexToPage(indexOfChild(child));
- if (page >= 0 && page != getCurrentPage() && !isInTouchMode()) {
- snapToPage(page);
- }
- }
-
- protected int getChildIndexForRelativeOffset(int relativeOffset) {
- final int childCount = getChildCount();
- int left;
- int right;
- for (int i = 0; i < childCount; ++i) {
- left = getRelativeChildOffset(i);
- right = (left + getScaledMeasuredWidth(getPageAt(i)));
- if (left <= relativeOffset && relativeOffset <= right) {
- return i;
- }
- }
- return -1;
- }
-
- protected int getChildWidth(int index) {
- // This functions are called enough times that it actually makes a difference in the
- // profiler -- so just inline the max() here
- final int measuredWidth = getPageAt(index).getMeasuredWidth();
- final int minWidth = mMinimumWidth;
- return (minWidth > measuredWidth) ? minWidth : measuredWidth;
- }
-
- int getPageNearestToPoint(float x) {
- int index = 0;
- for (int i = 0; i < getChildCount(); ++i) {
- if (x < getChildAt(i).getRight() - getScrollX()) {
- return index;
- } else {
- index++;
- }
- }
- return Math.min(index, getChildCount() - 1);
- }
-
- int getPageNearestToCenterOfScreen() {
- int minDistanceFromScreenCenter = Integer.MAX_VALUE;
- int minDistanceFromScreenCenterIndex = -1;
- int screenCenter = getViewportOffsetX() + getScrollX() + (getViewportWidth() / 2);
- final int childCount = getChildCount();
- for (int i = 0; i < childCount; ++i) {
- View layout = (View) getPageAt(i);
- int childWidth = getScaledMeasuredWidth(layout);
- int halfChildWidth = (childWidth / 2);
- int childCenter = getViewportOffsetX() + getChildOffset(i) + halfChildWidth;
- int distanceFromScreenCenter = Math.abs(childCenter - screenCenter);
- if (distanceFromScreenCenter < minDistanceFromScreenCenter) {
- minDistanceFromScreenCenter = distanceFromScreenCenter;
- minDistanceFromScreenCenterIndex = i;
- }
- }
- return minDistanceFromScreenCenterIndex;
- }
-
- protected void snapToDestination() {
- final int newPage = getPageNearestToCenterOfScreen();
- if (isWarping()) {
- cancelWarpAnimation("snapToDestination", mCurrentPage != newPage);
- }
- snapToPage(newPage, getPageSnapDuration());
- }
-
- private int getPageSnapDuration() {
- return isWarping() ? WARP_SNAP_DURATION : PAGE_SNAP_ANIMATION_DURATION;
- }
-
- private static class ScrollInterpolator implements Interpolator {
- public ScrollInterpolator() {
- }
-
- public float getInterpolation(float t) {
- t -= 1.0f;
- return t*t*t*t*t + 1;
- }
- }
-
- // We want the duration of the page snap animation to be influenced by the distance that
- // the screen has to travel, however, we don't want this duration to be effected in a
- // purely linear fashion. Instead, we use this method to moderate the effect that the distance
- // of travel has on the overall snap duration.
- float distanceInfluenceForSnapDuration(float f) {
- f -= 0.5f; // center the values about 0.
- f *= 0.3f * Math.PI / 2.0f;
- return (float) Math.sin(f);
- }
-
- protected void snapToPageWithVelocity(int whichPage, int velocity) {
- whichPage = Math.max(0, Math.min(whichPage, getChildCount() - 1));
- int halfScreenSize = getViewportWidth() / 2;
-
- if (isWarping()) {
- cancelWarpAnimation("snapToPageWithVelocity", mCurrentPage != whichPage);
- }
-
- if (DEBUG) Log.d(TAG, "snapToPage.getChildOffset(): " + getChildOffset(whichPage));
- if (DEBUG) Log.d(TAG, "snapToPageWithVelocity.getRelativeChildOffset(): "
- + getViewportWidth() + ", " + getChildWidth(whichPage));
- final int newX = getChildOffset(whichPage) - getRelativeChildOffset(whichPage);
- int delta = newX - mUnboundedScrollX;
- int duration = 0;
-
- if (Math.abs(velocity) < mMinFlingVelocity) {
- // If the velocity is low enough, then treat this more as an automatic page advance
- // as opposed to an apparent physical response to flinging
- snapToPage(whichPage, getPageSnapDuration());
- return;
- }
-
- // Here we compute a "distance" that will be used in the computation of the overall
- // snap duration. This is a function of the actual distance that needs to be traveled;
- // we keep this value close to half screen size in order to reduce the variance in snap
- // duration as a function of the distance the page needs to travel.
- float distanceRatio = Math.min(1f, 1.0f * Math.abs(delta) / (2 * halfScreenSize));
- float distance = halfScreenSize + halfScreenSize *
- distanceInfluenceForSnapDuration(distanceRatio);
-
- velocity = Math.abs(velocity);
- velocity = Math.max(mMinSnapVelocity, velocity);
-
- // we want the page's snap velocity to approximately match the velocity at which the
- // user flings, so we scale the duration by a value near to the derivative of the scroll
- // interpolator at zero, ie. 5. We use 4 to make it a little slower.
- duration = 4 * Math.round(1000 * Math.abs(distance / velocity));
-
- snapToPage(whichPage, delta, duration);
- }
-
- protected void snapToPage(int whichPage) {
- snapToPage(whichPage, getPageSnapDuration());
- }
- protected void snapToPageImmediately(int whichPage) {
- snapToPage(whichPage, getPageSnapDuration(), true);
- }
-
- protected void snapToPage(int whichPage, int duration) {
- snapToPage(whichPage, duration, false);
- }
- protected void snapToPage(int whichPage, int duration, boolean immediate) {
- whichPage = Math.max(0, Math.min(whichPage, getPageCount() - 1));
-
- if (DEBUG) Log.d(TAG, "snapToPage.getChildOffset(): " + getChildOffset(whichPage));
- if (DEBUG) Log.d(TAG, "snapToPage.getRelativeChildOffset(): " + getViewportWidth() + ", "
- + getChildWidth(whichPage));
- int newX = getChildOffset(whichPage) - getRelativeChildOffset(whichPage);
- final int sX = mUnboundedScrollX;
- final int delta = newX - sX;
- snapToPage(whichPage, delta, duration, immediate);
- }
-
- protected void snapToPage(int whichPage, int delta, int duration) {
- snapToPage(whichPage, delta, duration, false);
- }
-
- protected void snapToPage(int whichPage, int delta, int duration, boolean immediate) {
- if (isWarping() && whichPage == mCurrentPage+1) {
- mNextPage = getPageWarpIndex(); // jump to the warp page
- if (DEBUG_WARP) Log.v(TAG, "snapToPage(" + whichPage + ") : reset mPageSwapIndex");
- } else {
- mNextPage = whichPage;
- }
-
- if(mWarpPageExposed) {
- dispatchOnPageEndWarp();
- mWarpPageExposed = false;
- }
- notifyPageSwitching(whichPage);
-
-
- View focusedChild = getFocusedChild();
- if (focusedChild != null && whichPage != mCurrentPage &&
- focusedChild == getPageAt(mCurrentPage)) {
- focusedChild.clearFocus();
- }
-
- pageBeginMoving();
- awakenScrollBars(duration);
- if (immediate) {
- duration = 0;
- } else if (duration == 0) {
- duration = Math.abs(delta);
- }
-
- if (!mScroller.isFinished()) mScroller.abortAnimation();
- mScroller.startScroll(mUnboundedScrollX, 0, delta, 0, duration);
-
- notifyPageSwitched();
-
- // Trigger a compute() to finish switching pages if necessary
- if (immediate) {
- computeScroll();
- }
-
- mForceScreenScrolled = true;
- invalidate();
- }
-
- protected boolean isWarping() {
- return mWarpPageExposed;
- }
-
- public void scrollLeft() {
- if (mScroller.isFinished()) {
- if (mCurrentPage > 0) snapToPage(mCurrentPage - 1);
- } else {
- if (mNextPage > 0) snapToPage(mNextPage - 1);
- }
- }
-
- public void scrollRight() {
- if (mScroller.isFinished()) {
- if (mCurrentPage < getChildCount() -1) snapToPage(mCurrentPage + 1);
- } else {
- if (mNextPage < getChildCount() -1) snapToPage(mNextPage + 1);
- }
- }
-
- public int getPageForView(View v) {
- int result = -1;
- if (v != null) {
- ViewParent vp = v.getParent();
- int count = getChildCount();
- for (int i = 0; i < count; i++) {
- if (vp == getPageAt(i)) {
- return i;
- }
- }
- }
- return result;
- }
-
- public static class SavedState extends BaseSavedState {
- int currentPage = -1;
-
- SavedState(Parcelable superState) {
- super(superState);
- }
-
- private SavedState(Parcel in) {
- super(in);
- currentPage = in.readInt();
- }
-
- @Override
- public void writeToParcel(Parcel out, int flags) {
- super.writeToParcel(out, flags);
- out.writeInt(currentPage);
- }
-
- public static final Parcelable.Creator<SavedState> CREATOR =
- new Parcelable.Creator<SavedState>() {
- public SavedState createFromParcel(Parcel in) {
- return new SavedState(in);
- }
-
- public SavedState[] newArray(int size) {
- return new SavedState[size];
- }
- };
- }
-
- protected View getScrollingIndicator() {
- return null;
- }
-
- protected boolean isScrollingIndicatorEnabled() {
- return false;
- }
-
- Runnable hideScrollingIndicatorRunnable = new Runnable() {
- @Override
- public void run() {
- hideScrollingIndicator(false);
- }
- };
-
- protected void flashScrollingIndicator(boolean animated) {
- removeCallbacks(hideScrollingIndicatorRunnable);
- showScrollingIndicator(!animated);
- postDelayed(hideScrollingIndicatorRunnable, sScrollIndicatorFlashDuration);
- }
-
- protected void showScrollingIndicator(boolean immediately) {
- mShouldShowScrollIndicator = true;
- mShouldShowScrollIndicatorImmediately = true;
- if (getChildCount() <= 1) return;
- if (!isScrollingIndicatorEnabled()) return;
-
- mShouldShowScrollIndicator = false;
- getScrollingIndicator();
- if (mScrollIndicator != null) {
- // Fade the indicator in
- updateScrollingIndicatorPosition();
- mScrollIndicator.setVisibility(View.VISIBLE);
- cancelScrollingIndicatorAnimations();
- if (immediately) {
- mScrollIndicator.setAlpha(1f);
- } else {
- mScrollIndicatorAnimator = ObjectAnimator.ofFloat(mScrollIndicator, "alpha", 1f);
- mScrollIndicatorAnimator.setDuration(sScrollIndicatorFadeInDuration);
- mScrollIndicatorAnimator.start();
- }
- }
- }
-
- protected void cancelScrollingIndicatorAnimations() {
- if (mScrollIndicatorAnimator != null) {
- mScrollIndicatorAnimator.cancel();
- }
- }
-
- protected void hideScrollingIndicator(boolean immediately) {
- if (getChildCount() <= 1) return;
- if (!isScrollingIndicatorEnabled()) return;
-
- getScrollingIndicator();
- if (mScrollIndicator != null) {
- // Fade the indicator out
- updateScrollingIndicatorPosition();
- cancelScrollingIndicatorAnimations();
- if (immediately) {
- mScrollIndicator.setVisibility(View.INVISIBLE);
- mScrollIndicator.setAlpha(0f);
- } else {
- mScrollIndicatorAnimator = ObjectAnimator.ofFloat(mScrollIndicator, "alpha", 0f);
- mScrollIndicatorAnimator.setDuration(sScrollIndicatorFadeOutDuration);
- mScrollIndicatorAnimator.addListener(new AnimatorListenerAdapter() {
- private boolean cancelled = false;
- @Override
- public void onAnimationCancel(android.animation.Animator animation) {
- cancelled = true;
- }
- @Override
- public void onAnimationEnd(Animator animation) {
- if (!cancelled) {
- mScrollIndicator.setVisibility(View.INVISIBLE);
- }
- }
- });
- mScrollIndicatorAnimator.start();
- }
- }
- }
-
- /**
- * To be overridden by subclasses to determine whether the scroll indicator should stretch to
- * fill its space on the track or not.
- */
- protected boolean hasElasticScrollIndicator() {
- return true;
- }
-
- private void updateScrollingIndicator() {
- if (getChildCount() <= 1) return;
- if (!isScrollingIndicatorEnabled()) return;
-
- getScrollingIndicator();
- if (mScrollIndicator != null) {
- updateScrollingIndicatorPosition();
- }
- if (mShouldShowScrollIndicator) {
- showScrollingIndicator(mShouldShowScrollIndicatorImmediately);
- }
- }
-
- private void updateScrollingIndicatorPosition() {
- if (!isScrollingIndicatorEnabled()) return;
- if (mScrollIndicator == null) return;
- int numPages = getChildCount();
- int pageWidth = getViewportWidth();
- int lastChildIndex = Math.max(0, getChildCount() - 1);
- int maxScrollX = getChildOffset(lastChildIndex) - getRelativeChildOffset(lastChildIndex);
- int trackWidth = pageWidth - mScrollIndicatorPaddingLeft - mScrollIndicatorPaddingRight;
- int indicatorWidth = mScrollIndicator.getMeasuredWidth() -
- mScrollIndicator.getPaddingLeft() - mScrollIndicator.getPaddingRight();
-
- float offset = Math.max(0f, Math.min(1f, (float) getScrollX() / maxScrollX));
- int indicatorSpace = trackWidth / numPages;
- int indicatorPos = (int) (offset * (trackWidth - indicatorSpace)) + mScrollIndicatorPaddingLeft;
- if (hasElasticScrollIndicator()) {
- if (mScrollIndicator.getMeasuredWidth() != indicatorSpace) {
- mScrollIndicator.getLayoutParams().width = indicatorSpace;
- mScrollIndicator.requestLayout();
- }
- } else {
- int indicatorCenterOffset = indicatorSpace / 2 - indicatorWidth / 2;
- indicatorPos += indicatorCenterOffset;
- }
- mScrollIndicator.setTranslationX(indicatorPos);
- }
-
- // Animate the drag view back to the original position
- void animateDragViewToOriginalPosition() {
- if (mDragView != null) {
- AnimatorSet anim = new AnimatorSet();
- anim.setDuration(REORDERING_DROP_REPOSITION_DURATION);
- anim.playTogether(
- ObjectAnimator.ofFloat(mDragView, "translationX", 0f),
- ObjectAnimator.ofFloat(mDragView, "translationY", 0f));
- anim.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- onPostReorderingAnimationCompleted();
- }
- });
- anim.start();
- }
- }
-
- // "Zooms out" the PagedView to reveal more side pages
- protected boolean zoomOut() {
- if (mZoomInOutAnim != null && mZoomInOutAnim.isRunning()) {
- mZoomInOutAnim.cancel();
- }
-
- if (!(getScaleX() < 1f || getScaleY() < 1f)) {
- mZoomInOutAnim = new AnimatorSet();
- mZoomInOutAnim.setDuration(REORDERING_ZOOM_IN_OUT_DURATION);
- mZoomInOutAnim.playTogether(
- ObjectAnimator.ofFloat(this, "scaleX", mMinScale),
- ObjectAnimator.ofFloat(this, "scaleY", mMinScale));
- mZoomInOutAnim.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- // Show the delete drop target
- if (mDeleteDropTarget != null) {
- mDeleteDropTarget.setVisibility(View.VISIBLE);
- mDeleteDropTarget.animate().alpha(1f)
- .setDuration(REORDERING_DELETE_DROP_TARGET_FADE_DURATION)
- .setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- mDeleteDropTarget.setAlpha(0f);
- }
- });
- }
- }
- });
- mZoomInOutAnim.start();
- return true;
- }
- return false;
- }
-
- protected void onStartReordering() {
- if (AccessibilityManager.getInstance(mContext).isEnabled()) {
- announceForAccessibility(mContext.getString(
- R.string.keyguard_accessibility_widget_reorder_start));
- }
-
- // Set the touch state to reordering (allows snapping to pages, dragging a child, etc.)
- setTouchState(TOUCH_STATE_REORDERING);
- mIsReordering = true;
-
- // Mark all the non-widget pages as invisible
- getVisiblePages(mTempVisiblePagesRange);
- boundByReorderablePages(true, mTempVisiblePagesRange);
- for (int i = 0; i < getPageCount(); ++i) {
- if (i < mTempVisiblePagesRange[0] || i > mTempVisiblePagesRange[1]) {
- getPageAt(i).setAlpha(0f);
- }
- }
-
- // We must invalidate to trigger a redraw to update the layers such that the drag view
- // is always drawn on top
- invalidate();
- }
-
- private void onPostReorderingAnimationCompleted() {
- // Trigger the callback when reordering has settled
- --mPostReorderingPreZoomInRemainingAnimationCount;
- if (mPostReorderingPreZoomInRunnable != null &&
- mPostReorderingPreZoomInRemainingAnimationCount == 0) {
- mPostReorderingPreZoomInRunnable.run();
- mPostReorderingPreZoomInRunnable = null;
- }
- }
-
- protected void onEndReordering() {
- if (AccessibilityManager.getInstance(mContext).isEnabled()) {
- if (mDeleteString != null) {
- announceForAccessibility(mDeleteString);
- mDeleteString = null;
- } else {
- announceForAccessibility(mContext.getString(
- R.string.keyguard_accessibility_widget_reorder_end));
- }
- }
- mIsReordering = false;
-
- // Mark all the non-widget pages as visible again
- getVisiblePages(mTempVisiblePagesRange);
- boundByReorderablePages(true, mTempVisiblePagesRange);
- for (int i = 0; i < getPageCount(); ++i) {
- if (i < mTempVisiblePagesRange[0] || i > mTempVisiblePagesRange[1]) {
- getPageAt(i).setAlpha(1f);
- }
- }
- }
-
- public boolean startReordering() {
- int dragViewIndex = getPageNearestToCenterOfScreen();
- mTempVisiblePagesRange[0] = 0;
- mTempVisiblePagesRange[1] = getPageCount() - 1;
- boundByReorderablePages(true, mTempVisiblePagesRange);
-
- // Check if we are within the reordering range
- if (mTempVisiblePagesRange[0] <= dragViewIndex &&
- dragViewIndex <= mTempVisiblePagesRange[1]) {
- mReorderingStarted = true;
- if (zoomOut()) {
- // Find the drag view under the pointer
- mDragView = getChildAt(dragViewIndex);
-
- onStartReordering();
- }
- return true;
- }
- return false;
- }
-
- boolean isReordering(boolean testTouchState) {
- boolean state = mIsReordering;
- if (testTouchState) {
- state &= (mTouchState == TOUCH_STATE_REORDERING);
- }
- return state;
- }
- void endReordering() {
- // For simplicity, we call endReordering sometimes even if reordering was never started.
- // In that case, we don't want to do anything.
- if (!mReorderingStarted) return;
- mReorderingStarted = false;
-
- // If we haven't flung-to-delete the current child, then we just animate the drag view
- // back into position
- final Runnable onCompleteRunnable = new Runnable() {
- @Override
- public void run() {
- onEndReordering();
- }
- };
- if (!mDeferringForDelete) {
- mPostReorderingPreZoomInRunnable = new Runnable() {
- public void run() {
- zoomIn(onCompleteRunnable);
- };
- };
-
- mPostReorderingPreZoomInRemainingAnimationCount =
- NUM_ANIMATIONS_RUNNING_BEFORE_ZOOM_OUT;
- // Snap to the current page
- snapToPage(indexOfChild(mDragView), 0);
- // Animate the drag view back to the front position
- animateDragViewToOriginalPosition();
- } else {
- // Handled in post-delete-animation-callbacks
- }
- }
-
- // "Zooms in" the PagedView to highlight the current page
- protected boolean zoomIn(final Runnable onCompleteRunnable) {
- if (mZoomInOutAnim != null && mZoomInOutAnim.isRunning()) {
- mZoomInOutAnim.cancel();
- }
- if (getScaleX() < 1f || getScaleY() < 1f) {
- mZoomInOutAnim = new AnimatorSet();
- mZoomInOutAnim.setDuration(REORDERING_ZOOM_IN_OUT_DURATION);
- mZoomInOutAnim.playTogether(
- ObjectAnimator.ofFloat(this, "scaleX", 1f),
- ObjectAnimator.ofFloat(this, "scaleY", 1f));
- mZoomInOutAnim.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- // Hide the delete drop target
- if (mDeleteDropTarget != null) {
- mDeleteDropTarget.animate().alpha(0f)
- .setDuration(REORDERING_DELETE_DROP_TARGET_FADE_DURATION)
- .setListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mDeleteDropTarget.setVisibility(View.GONE);
- }
- });
- }
- }
- @Override
- public void onAnimationCancel(Animator animation) {
- mDragView = null;
- }
- @Override
- public void onAnimationEnd(Animator animation) {
- mDragView = null;
- if (onCompleteRunnable != null) {
- onCompleteRunnable.run();
- }
- }
- });
- mZoomInOutAnim.start();
- return true;
- } else {
- if (onCompleteRunnable != null) {
- onCompleteRunnable.run();
- }
- }
- return false;
- }
-
- /*
- * Flinging to delete - IN PROGRESS
- */
- private PointF isFlingingToDelete() {
- ViewConfiguration config = ViewConfiguration.get(getContext());
- mVelocityTracker.computeCurrentVelocity(1000, config.getScaledMaximumFlingVelocity());
-
- if (mVelocityTracker.getYVelocity() < mFlingToDeleteThresholdVelocity) {
- // Do a quick dot product test to ensure that we are flinging upwards
- PointF vel = new PointF(mVelocityTracker.getXVelocity(),
- mVelocityTracker.getYVelocity());
- PointF upVec = new PointF(0f, -1f);
- float theta = (float) Math.acos(((vel.x * upVec.x) + (vel.y * upVec.y)) /
- (vel.length() * upVec.length()));
- if (theta <= Math.toRadians(FLING_TO_DELETE_MAX_FLING_DEGREES)) {
- return vel;
- }
- }
- return null;
- }
-
- /**
- * Creates an animation from the current drag view along its current velocity vector.
- * For this animation, the alpha runs for a fixed duration and we update the position
- * progressively.
- */
- private static class FlingAlongVectorAnimatorUpdateListener implements AnimatorUpdateListener {
- private View mDragView;
- private PointF mVelocity;
- private Rect mFrom;
- private long mPrevTime;
- private float mFriction;
-
- private final TimeInterpolator mAlphaInterpolator = new DecelerateInterpolator(0.75f);
-
- public FlingAlongVectorAnimatorUpdateListener(View dragView, PointF vel, Rect from,
- long startTime, float friction) {
- mDragView = dragView;
- mVelocity = vel;
- mFrom = from;
- mPrevTime = startTime;
- mFriction = 1f - (mDragView.getResources().getDisplayMetrics().density * friction);
- }
-
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- float t = ((Float) animation.getAnimatedValue()).floatValue();
- long curTime = AnimationUtils.currentAnimationTimeMillis();
-
- mFrom.left += (mVelocity.x * (curTime - mPrevTime) / 1000f);
- mFrom.top += (mVelocity.y * (curTime - mPrevTime) / 1000f);
-
- mDragView.setTranslationX(mFrom.left);
- mDragView.setTranslationY(mFrom.top);
- mDragView.setAlpha(1f - mAlphaInterpolator.getInterpolation(t));
-
- mVelocity.x *= mFriction;
- mVelocity.y *= mFriction;
- mPrevTime = curTime;
- }
- };
-
- private Runnable createPostDeleteAnimationRunnable(final View dragView) {
- return new Runnable() {
- @Override
- public void run() {
- int dragViewIndex = indexOfChild(dragView);
-
- // For each of the pages around the drag view, animate them from the previous
- // position to the new position in the layout (as a result of the drag view moving
- // in the layout)
- // NOTE: We can make an assumption here because we have side-bound pages that we
- // will always have pages to animate in from the left
- getVisiblePages(mTempVisiblePagesRange);
- boundByReorderablePages(true, mTempVisiblePagesRange);
- boolean isLastWidgetPage = (mTempVisiblePagesRange[0] == mTempVisiblePagesRange[1]);
- boolean slideFromLeft = (isLastWidgetPage ||
- dragViewIndex > mTempVisiblePagesRange[0]);
-
- // Setup the scroll to the correct page before we swap the views
- if (slideFromLeft) {
- snapToPageImmediately(dragViewIndex - 1);
- }
-
- int firstIndex = (isLastWidgetPage ? 0 : mTempVisiblePagesRange[0]);
- int lastIndex = Math.min(mTempVisiblePagesRange[1], getPageCount() - 1);
- int lowerIndex = (slideFromLeft ? firstIndex : dragViewIndex + 1 );
- int upperIndex = (slideFromLeft ? dragViewIndex - 1 : lastIndex);
- ArrayList<Animator> animations = new ArrayList<Animator>();
- for (int i = lowerIndex; i <= upperIndex; ++i) {
- View v = getChildAt(i);
- // dragViewIndex < pageUnderPointIndex, so after we remove the
- // drag view all subsequent views to pageUnderPointIndex will
- // shift down.
- int oldX = 0;
- int newX = 0;
- if (slideFromLeft) {
- if (i == 0) {
- // Simulate the page being offscreen with the page spacing
- oldX = getViewportOffsetX() + getChildOffset(i) - getChildWidth(i)
- - mPageSpacing;
- } else {
- oldX = getViewportOffsetX() + getChildOffset(i - 1);
- }
- newX = getViewportOffsetX() + getChildOffset(i);
- } else {
- oldX = getChildOffset(i) - getChildOffset(i - 1);
- newX = 0;
- }
-
- // Animate the view translation from its old position to its new
- // position
- AnimatorSet anim = (AnimatorSet) v.getTag();
- if (anim != null) {
- anim.cancel();
- }
-
- // Note: Hacky, but we want to skip any optimizations to not draw completely
- // hidden views
- v.setAlpha(Math.max(v.getAlpha(), 0.01f));
- v.setTranslationX(oldX - newX);
- anim = new AnimatorSet();
- anim.playTogether(
- ObjectAnimator.ofFloat(v, "translationX", 0f),
- ObjectAnimator.ofFloat(v, "alpha", 1f));
- animations.add(anim);
- v.setTag(anim);
- }
-
- AnimatorSet slideAnimations = new AnimatorSet();
- slideAnimations.playTogether(animations);
- slideAnimations.setDuration(DELETE_SLIDE_IN_SIDE_PAGE_DURATION);
- slideAnimations.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- final Runnable onCompleteRunnable = new Runnable() {
- @Override
- public void run() {
- mDeferringForDelete = false;
- onEndReordering();
- onRemoveViewAnimationCompleted();
- }
- };
- zoomIn(onCompleteRunnable);
- }
- });
- slideAnimations.start();
-
- removeView(dragView);
- onRemoveView(dragView, true);
- }
- };
- }
-
- public void onFlingToDelete(PointF vel) {
- final long startTime = AnimationUtils.currentAnimationTimeMillis();
-
- // NOTE: Because it takes time for the first frame of animation to actually be
- // called and we expect the animation to be a continuation of the fling, we have
- // to account for the time that has elapsed since the fling finished. And since
- // we don't have a startDelay, we will always get call to update when we call
- // start() (which we want to ignore).
- final TimeInterpolator tInterpolator = new TimeInterpolator() {
- private int mCount = -1;
- private long mStartTime;
- private float mOffset;
- /* Anonymous inner class ctor */ {
- mStartTime = startTime;
- }
-
- @Override
- public float getInterpolation(float t) {
- if (mCount < 0) {
- mCount++;
- } else if (mCount == 0) {
- mOffset = Math.min(0.5f, (float) (AnimationUtils.currentAnimationTimeMillis() -
- mStartTime) / FLING_TO_DELETE_FADE_OUT_DURATION);
- mCount++;
- }
- return Math.min(1f, mOffset + t);
- }
- };
-
- final Rect from = new Rect();
- final View dragView = mDragView;
- from.left = (int) dragView.getTranslationX();
- from.top = (int) dragView.getTranslationY();
- AnimatorUpdateListener updateCb = new FlingAlongVectorAnimatorUpdateListener(dragView, vel,
- from, startTime, FLING_TO_DELETE_FRICTION);
-
- mDeleteString = getContext().getResources()
- .getString(R.string.keyguard_accessibility_widget_deleted,
- mDragView.getContentDescription());
- final Runnable onAnimationEndRunnable = createPostDeleteAnimationRunnable(dragView);
-
- // Create and start the animation
- ValueAnimator mDropAnim = new ValueAnimator();
- mDropAnim.setInterpolator(tInterpolator);
- mDropAnim.setDuration(FLING_TO_DELETE_FADE_OUT_DURATION);
- mDropAnim.setFloatValues(0f, 1f);
- mDropAnim.addUpdateListener(updateCb);
- mDropAnim.addListener(new AnimatorListenerAdapter() {
- public void onAnimationEnd(Animator animation) {
- onAnimationEndRunnable.run();
- }
- });
- mDropAnim.start();
- mDeferringForDelete = true;
- }
-
- /* Drag to delete */
- private boolean isHoveringOverDeleteDropTarget(int x, int y) {
- if (mDeleteDropTarget != null) {
- mAltTmpRect.set(0, 0, 0, 0);
- View parent = (View) mDeleteDropTarget.getParent();
- if (parent != null) {
- parent.getGlobalVisibleRect(mAltTmpRect);
- }
- mDeleteDropTarget.getGlobalVisibleRect(mTmpRect);
- mTmpRect.offset(-mAltTmpRect.left, -mAltTmpRect.top);
- return mTmpRect.contains(x, y);
- }
- return false;
- }
-
- protected void setPageHoveringOverDeleteDropTarget(int viewIndex, boolean isHovering) {}
-
- private void onDropToDelete() {
- final View dragView = mDragView;
-
- final float toScale = 0f;
- final float toAlpha = 0f;
-
- // Create and start the complex animation
- ArrayList<Animator> animations = new ArrayList<Animator>();
- AnimatorSet motionAnim = new AnimatorSet();
- motionAnim.setInterpolator(new DecelerateInterpolator(2));
- motionAnim.playTogether(
- ObjectAnimator.ofFloat(dragView, "scaleX", toScale),
- ObjectAnimator.ofFloat(dragView, "scaleY", toScale));
- animations.add(motionAnim);
-
- AnimatorSet alphaAnim = new AnimatorSet();
- alphaAnim.setInterpolator(new LinearInterpolator());
- alphaAnim.playTogether(
- ObjectAnimator.ofFloat(dragView, "alpha", toAlpha));
- animations.add(alphaAnim);
-
- mDeleteString = getContext().getResources()
- .getString(R.string.keyguard_accessibility_widget_deleted,
- mDragView.getContentDescription());
- final Runnable onAnimationEndRunnable = createPostDeleteAnimationRunnable(dragView);
-
- AnimatorSet anim = new AnimatorSet();
- anim.playTogether(animations);
- anim.setDuration(DRAG_TO_DELETE_FADE_OUT_DURATION);
- anim.addListener(new AnimatorListenerAdapter() {
- public void onAnimationEnd(Animator animation) {
- onAnimationEndRunnable.run();
- }
- });
- anim.start();
-
- mDeferringForDelete = true;
- }
-
- /* Accessibility */
- @Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
- info.setScrollable(getPageCount() > 1);
- if (getCurrentPage() < getPageCount() - 1) {
- info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
- }
- if (getCurrentPage() > 0) {
- info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
- }
- }
-
- @Override
- public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
- super.onInitializeAccessibilityEvent(event);
- event.setScrollable(true);
- if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) {
- event.setFromIndex(mCurrentPage);
- event.setToIndex(mCurrentPage);
- event.setItemCount(getChildCount());
- }
- }
-
- @Override
- public boolean performAccessibilityAction(int action, Bundle arguments) {
- if (super.performAccessibilityAction(action, arguments)) {
- return true;
- }
- switch (action) {
- case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: {
- if (getCurrentPage() < getPageCount() - 1) {
- scrollRight();
- return true;
- }
- } break;
- case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: {
- if (getCurrentPage() > 0) {
- scrollLeft();
- return true;
- }
- } break;
- }
- return false;
- }
-
- @Override
- public boolean onHoverEvent(android.view.MotionEvent event) {
- return true;
- }
-
- void beginCameraEvent() {
- mIsCameraEvent = true;
- }
-
- void endCameraEvent() {
- mIsCameraEvent = false;
- }
-
- AnimatorListenerAdapter mOnScreenAnimationListener = new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mWarpAnimation = null;
- if (mTouchState != TOUCH_STATE_SCROLLING && mTouchState != TOUCH_STATE_READY) {
- animateWarpPageOffScreen("onScreen end", true);
- }
- }
-
- @Override
- public void onAnimationCancel(Animator animation) {
- super.onAnimationCancel(animation);
- mWarpAnimation = null;
- }
- };
-
- AnimatorListenerAdapter mOffScreenAnimationListener = new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mWarpAnimation = null;
- mWarpPageExposed = false;
- KeyguardWidgetFrame v = (KeyguardWidgetFrame) getPageAt(getPageWarpIndex());
- v.setTranslationX(0.0f);
- }
-
- @Override
- public void onAnimationCancel(Animator animation) {
- super.onAnimationCancel(animation);
- mWarpAnimation = null;
- }
- };
-
- private void cancelWarpAnimation(String msg, boolean abortAnimation) {
- if (DEBUG_WARP) Log.v(TAG, "cancelWarpAnimation(" + msg + ",abort=" + abortAnimation + ")");
- if (abortAnimation) {
- // We're done with the animation and moving to a new page. Let the scroller
- // take over the animation.
- KeyguardWidgetFrame v = (KeyguardWidgetFrame) getPageAt(getPageWarpIndex());
- v.animate().cancel();
- // Make the scroll amount match the current warp position.
- scrollBy(Math.round(-v.getTranslationX()), 0);
- v.setTranslationX(0);
- } else {
- animateWarpPageOffScreen("canceled", true);
- }
- }
-
- private boolean isAnimatingWarpPage() {
- return mWarpAnimation != null;
- }
-
- private void animateWarpPageOnScreen(String reason) {
- if (DEBUG_WARP) Log.v(TAG, "animateWarpPageOnScreen(" + reason + ")");
- if (!mWarpPageExposed) {
- mWarpPageExposed = true;
- dispatchOnPageBeginWarp();
- KeyguardWidgetFrame v = (KeyguardWidgetFrame) getPageAt(getPageWarpIndex());
- if (DEBUG_WARP) Log.v(TAG, "moving page on screen: Tx=" + v.getTranslationX());
- DecelerateInterpolator interp = new DecelerateInterpolator(1.5f);
- int totalOffset = getCurrentWarpOffset();
- v.setTranslationX(totalOffset);
- mWarpAnimation = v.animate();
- mWarpAnimation.translationX(mWarpPeekAmount+totalOffset)
- .setInterpolator(interp)
- .setDuration(WARP_PEEK_ANIMATION_DURATION)
- .setListener(mOnScreenAnimationListener);
- }
- }
-
- private int getCurrentWarpOffset() {
- if (mCurrentPage == getPageWarpIndex()) {
- return 0;
- }
- View viewRight = getPageAt(mCurrentPage + 1);
- View warpView = getPageAt(getPageWarpIndex());
- if (viewRight != warpView && viewRight != null && warpView != null) {
- return viewRight.getLeft() - warpView.getLeft();
- }
- return 0;
- }
-
- private void animateWarpPageOffScreen(String reason, boolean animate) {
- if (DEBUG_WARP) Log.v(TAG, "animateWarpPageOffScreen(" + reason + " anim:" + animate + ")");
- if (mWarpPageExposed) {
- dispatchOnPageEndWarp();
- KeyguardWidgetFrame v = (KeyguardWidgetFrame) getPageAt(getPageWarpIndex());
- if (DEBUG_WARP) Log.v(TAG, "moving page off screen: Tx=" + v.getTranslationX());
- AccelerateInterpolator interp = new AccelerateInterpolator(1.5f);
- int totalOffset = getCurrentWarpOffset();
- v.animate().translationX(totalOffset)
- .setInterpolator(interp)
- .setDuration(animate ? WARP_PEEK_ANIMATION_DURATION : 0)
- .setListener(mOffScreenAnimationListener);
- } else {
- if (DEBUG_WARP) Log.e(TAG, "animateWarpPageOffScreen(): not warping", new Exception());
- }
- }
-
- /**
- * Swaps the position of the views by setting the left and right edges appropriately.
- */
- void swapPages(int indexA, int indexB) {
- View viewA = getPageAt(indexA);
- View viewB = getPageAt(indexB);
- if (viewA != viewB && viewA != null && viewB != null) {
- int deltaX = viewA.getLeft() - viewB.getLeft();
- viewA.offsetLeftAndRight(-deltaX);
- viewB.offsetLeftAndRight(deltaX);
- }
- }
-
- public void startPageWarp(int pageIndex) {
- if (DEBUG_WARP) Log.v(TAG, "START WARP");
- if (pageIndex != mCurrentPage + 1) {
- mPageSwapIndex = mCurrentPage + 1;
- }
- mPageWarpIndex = pageIndex;
- }
-
- protected int getPageWarpIndex() {
- return getPageCount() - 1;
- }
-
- public void stopPageWarp() {
- if (DEBUG_WARP) Log.v(TAG, "END WARP");
- // mPageSwapIndex is reset in snapToPage() after the scroll animation completes
- }
-
- public void onPageBeginWarp() {
-
- }
-
- public void onPageEndWarp() {
-
- }
-
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java b/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java
deleted file mode 100644
index ab9286b..0000000
--- a/packages/Keyguard/src/com/android/keyguard/SlidingChallengeLayout.java
+++ /dev/null
@@ -1,1290 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.keyguard;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.FloatProperty;
-import android.util.Log;
-import android.util.Property;
-import android.view.MotionEvent;
-import android.view.VelocityTracker;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.accessibility.AccessibilityManager;
-import android.view.animation.Interpolator;
-import android.widget.Scroller;
-
-/**
- * This layout handles interaction with the sliding security challenge views
- * that overlay/resize other keyguard contents.
- */
-public class SlidingChallengeLayout extends ViewGroup implements ChallengeLayout {
- private static final String TAG = "SlidingChallengeLayout";
- private static final boolean DEBUG = KeyguardConstants.DEBUG;
-
- // The drag handle is measured in dp above & below the top edge of the
- // challenge view; these parameters change based on whether the challenge
- // is open or closed.
- private static final int DRAG_HANDLE_CLOSED_ABOVE = 8; // dp
- private static final int DRAG_HANDLE_CLOSED_BELOW = 0; // dp
- private static final int DRAG_HANDLE_OPEN_ABOVE = 8; // dp
- private static final int DRAG_HANDLE_OPEN_BELOW = 0; // dp
-
- private static final int HANDLE_ANIMATE_DURATION = 250; // ms
-
- // Drawn to show the drag handle in closed state; crossfades to the challenge view
- // when challenge is fully visible
- private boolean mEdgeCaptured;
-
- private DisplayMetrics mDisplayMetrics;
-
- // Initialized during measurement from child layoutparams
- private View mExpandChallengeView;
- private KeyguardSecurityContainer mChallengeView;
- private View mScrimView;
- private View mWidgetsView;
-
- // Range: 0 (fully hidden) to 1 (fully visible)
- private float mChallengeOffset = 1.f;
- private boolean mChallengeShowing = true;
- private boolean mChallengeShowingTargetState = true;
- private boolean mWasChallengeShowing = true;
- private boolean mIsBouncing = false;
-
- private final Scroller mScroller;
- private ObjectAnimator mFader;
- private int mScrollState;
- private OnChallengeScrolledListener mScrollListener;
- private OnBouncerStateChangedListener mBouncerListener;
- private boolean mEnableChallengeDragging;
-
- public static final int SCROLL_STATE_IDLE = 0;
- public static final int SCROLL_STATE_DRAGGING = 1;
- public static final int SCROLL_STATE_SETTLING = 2;
- public static final int SCROLL_STATE_FADING = 3;
-
- public static final int CHALLENGE_FADE_OUT_DURATION = 100;
- public static final int CHALLENGE_FADE_IN_DURATION = 160;
-
- private static final int MAX_SETTLE_DURATION = 600; // ms
-
- // ID of the pointer in charge of a current drag
- private int mActivePointerId = INVALID_POINTER;
- private static final int INVALID_POINTER = -1;
-
- // True if the user is currently dragging the slider
- private boolean mDragging;
- // True if the user may not drag until a new gesture begins
- private boolean mBlockDrag;
-
- private VelocityTracker mVelocityTracker;
- private int mMinVelocity;
- private int mMaxVelocity;
- private float mGestureStartX, mGestureStartY; // where did you first touch the screen?
- private int mGestureStartChallengeBottom; // where was the challenge at that time?
-
- private int mDragHandleClosedBelow; // handle hitrect extension into the challenge view
- private int mDragHandleClosedAbove; // extend the handle's hitrect this far above the line
- private int mDragHandleOpenBelow; // handle hitrect extension into the challenge view
- private int mDragHandleOpenAbove; // extend the handle's hitrect this far above the line
-
- private int mDragHandleEdgeSlop;
- private int mChallengeBottomBound; // Number of pixels from the top of the challenge view
- // that should remain on-screen
-
- private int mTouchSlop;
- private int mTouchSlopSquare;
-
- float mHandleAlpha;
- float mFrameAlpha;
- float mFrameAnimationTarget = Float.MIN_VALUE;
- private ObjectAnimator mHandleAnimation;
- private ObjectAnimator mFrameAnimation;
-
- private boolean mHasGlowpad;
- private final Rect mInsets = new Rect();
-
- // We have an internal and external version, and we and them together.
- private boolean mChallengeInteractiveExternal = true;
- private boolean mChallengeInteractiveInternal = true;
-
- static final Property<SlidingChallengeLayout, Float> HANDLE_ALPHA =
- new FloatProperty<SlidingChallengeLayout>("handleAlpha") {
- @Override
- public void setValue(SlidingChallengeLayout view, float value) {
- view.mHandleAlpha = value;
- view.invalidate();
- }
-
- @Override
- public Float get(SlidingChallengeLayout view) {
- return view.mHandleAlpha;
- }
- };
-
- // True if at least one layout pass has happened since the view was attached.
- private boolean mHasLayout;
-
- private static final Interpolator sMotionInterpolator = new Interpolator() {
- public float getInterpolation(float t) {
- t -= 1.0f;
- return t * t * t * t * t + 1.0f;
- }
- };
-
- private static final Interpolator sHandleFadeInterpolator = new Interpolator() {
- public float getInterpolation(float t) {
- return t * t;
- }
- };
-
- private final Runnable mEndScrollRunnable = new Runnable () {
- public void run() {
- completeChallengeScroll();
- }
- };
-
- private final OnClickListener mScrimClickListener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- hideBouncer();
- }
- };
-
- private final OnClickListener mExpandChallengeClickListener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (!isChallengeShowing()) {
- showChallenge(true);
- }
- }
- };
-
- /**
- * Listener interface that reports changes in scroll state of the challenge area.
- */
- public interface OnChallengeScrolledListener {
- /**
- * The scroll state itself changed.
- *
- * <p>scrollState will be one of the following:</p>
- *
- * <ul>
- * <li><code>SCROLL_STATE_IDLE</code> - The challenge area is stationary.</li>
- * <li><code>SCROLL_STATE_DRAGGING</code> - The user is actively dragging
- * the challenge area.</li>
- * <li><code>SCROLL_STATE_SETTLING</code> - The challenge area is animating
- * into place.</li>
- * </ul>
- *
- * <p>Do not perform expensive operations (e.g. layout)
- * while the scroll state is not <code>SCROLL_STATE_IDLE</code>.</p>
- *
- * @param scrollState The new scroll state of the challenge area.
- */
- public void onScrollStateChanged(int scrollState);
-
- /**
- * The precise position of the challenge area has changed.
- *
- * <p>NOTE: It is NOT safe to modify layout or call any View methods that may
- * result in a requestLayout anywhere in your view hierarchy as a result of this call.
- * It may be called during drawing.</p>
- *
- * @param scrollPosition New relative position of the challenge area.
- * 1.f = fully visible/ready to be interacted with.
- * 0.f = fully invisible/inaccessible to the user.
- * @param challengeTop Position of the top edge of the challenge view in px in the
- * SlidingChallengeLayout's coordinate system.
- */
- public void onScrollPositionChanged(float scrollPosition, int challengeTop);
- }
-
- public SlidingChallengeLayout(Context context) {
- this(context, null);
- }
-
- public SlidingChallengeLayout(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public SlidingChallengeLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- mScroller = new Scroller(context, sMotionInterpolator);
-
- final ViewConfiguration vc = ViewConfiguration.get(context);
- mMinVelocity = vc.getScaledMinimumFlingVelocity();
- mMaxVelocity = vc.getScaledMaximumFlingVelocity();
-
- final Resources res = getResources();
- mDragHandleEdgeSlop = res.getDimensionPixelSize(R.dimen.kg_edge_swipe_region_size);
-
- mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
- mTouchSlopSquare = mTouchSlop * mTouchSlop;
-
- mDisplayMetrics = res.getDisplayMetrics();
- final float density = mDisplayMetrics.density;
-
- // top half of the lock icon, plus another 25% to be sure
- mDragHandleClosedAbove = (int) (DRAG_HANDLE_CLOSED_ABOVE * density + 0.5f);
- mDragHandleClosedBelow = (int) (DRAG_HANDLE_CLOSED_BELOW * density + 0.5f);
- mDragHandleOpenAbove = (int) (DRAG_HANDLE_OPEN_ABOVE * density + 0.5f);
- mDragHandleOpenBelow = (int) (DRAG_HANDLE_OPEN_BELOW * density + 0.5f);
-
- // how much space to account for in the handle when closed
- mChallengeBottomBound = res.getDimensionPixelSize(R.dimen.kg_widget_pager_bottom_padding);
-
- setWillNotDraw(false);
- setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
- }
-
- public void setEnableChallengeDragging(boolean enabled) {
- mEnableChallengeDragging = enabled;
- }
-
- public void setInsets(Rect insets) {
- mInsets.set(insets);
- }
-
- public void setHandleAlpha(float alpha) {
- if (mExpandChallengeView != null) {
- mExpandChallengeView.setAlpha(alpha);
- }
- }
-
- public void setChallengeInteractive(boolean interactive) {
- mChallengeInteractiveExternal = interactive;
- if (mExpandChallengeView != null) {
- mExpandChallengeView.setEnabled(interactive);
- }
- }
-
- void animateHandle(boolean visible) {
- if (mHandleAnimation != null) {
- mHandleAnimation.cancel();
- mHandleAnimation = null;
- }
- final float targetAlpha = visible ? 1.f : 0.f;
- if (targetAlpha == mHandleAlpha) {
- return;
- }
- mHandleAnimation = ObjectAnimator.ofFloat(this, HANDLE_ALPHA, targetAlpha);
- mHandleAnimation.setInterpolator(sHandleFadeInterpolator);
- mHandleAnimation.setDuration(HANDLE_ANIMATE_DURATION);
- mHandleAnimation.start();
- }
-
- private void sendInitialListenerUpdates() {
- if (mScrollListener != null) {
- int challengeTop = mChallengeView != null ? mChallengeView.getTop() : 0;
- mScrollListener.onScrollPositionChanged(mChallengeOffset, challengeTop);
- mScrollListener.onScrollStateChanged(mScrollState);
- }
- }
-
- public void setOnChallengeScrolledListener(OnChallengeScrolledListener listener) {
- mScrollListener = listener;
- if (mHasLayout) {
- sendInitialListenerUpdates();
- }
- }
-
- public void setOnBouncerStateChangedListener(OnBouncerStateChangedListener listener) {
- mBouncerListener = listener;
- }
-
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
-
- mHasLayout = false;
- }
-
- @Override
- public void onDetachedFromWindow() {
- super.onDetachedFromWindow();
-
- removeCallbacks(mEndScrollRunnable);
- mHasLayout = false;
- }
-
- @Override
- public void requestChildFocus(View child, View focused) {
- if (mIsBouncing && child != mChallengeView) {
- // Clear out of the bouncer if the user tries to move focus outside of
- // the security challenge view.
- hideBouncer();
- }
- super.requestChildFocus(child, focused);
- }
-
- // We want the duration of the page snap animation to be influenced by the distance that
- // the screen has to travel, however, we don't want this duration to be effected in a
- // purely linear fashion. Instead, we use this method to moderate the effect that the distance
- // of travel has on the overall snap duration.
- float distanceInfluenceForSnapDuration(float f) {
- f -= 0.5f; // center the values about 0.
- f *= 0.3f * Math.PI / 2.0f;
- return (float) Math.sin(f);
- }
-
- void setScrollState(int state) {
- if (mScrollState != state) {
- mScrollState = state;
-
- animateHandle(state == SCROLL_STATE_IDLE && !mChallengeShowing);
- if (mScrollListener != null) {
- mScrollListener.onScrollStateChanged(state);
- }
- }
- }
-
- void completeChallengeScroll() {
- setChallengeShowing(mChallengeShowingTargetState);
- mChallengeOffset = mChallengeShowing ? 1.f : 0.f;
- setScrollState(SCROLL_STATE_IDLE);
- mChallengeInteractiveInternal = true;
- mChallengeView.setLayerType(LAYER_TYPE_NONE, null);
- }
-
- void setScrimView(View scrim) {
- if (mScrimView != null) {
- mScrimView.setOnClickListener(null);
- }
- mScrimView = scrim;
- if (mScrimView != null) {
- mScrimView.setVisibility(mIsBouncing ? VISIBLE : GONE);
- mScrimView.setFocusable(true);
- mScrimView.setOnClickListener(mScrimClickListener);
- }
- }
-
- /**
- * Animate the bottom edge of the challenge view to the given position.
- *
- * @param y desired final position for the bottom edge of the challenge view in px
- * @param velocity velocity in
- */
- void animateChallengeTo(int y, int velocity) {
- if (mChallengeView == null) {
- // Nothing to do.
- return;
- }
-
- cancelTransitionsInProgress();
-
- mChallengeInteractiveInternal = false;
- enableHardwareLayerForChallengeView();
- final int sy = mChallengeView.getBottom();
- final int dy = y - sy;
- if (dy == 0) {
- completeChallengeScroll();
- return;
- }
-
- setScrollState(SCROLL_STATE_SETTLING);
-
- final int childHeight = mChallengeView.getHeight();
- final int halfHeight = childHeight / 2;
- final float distanceRatio = Math.min(1f, 1.0f * Math.abs(dy) / childHeight);
- final float distance = halfHeight + halfHeight *
- distanceInfluenceForSnapDuration(distanceRatio);
-
- int duration = 0;
- velocity = Math.abs(velocity);
- if (velocity > 0) {
- duration = 4 * Math.round(1000 * Math.abs(distance / velocity));
- } else {
- final float childDelta = (float) Math.abs(dy) / childHeight;
- duration = (int) ((childDelta + 1) * 100);
- }
- duration = Math.min(duration, MAX_SETTLE_DURATION);
-
- mScroller.startScroll(0, sy, 0, dy, duration);
- postInvalidateOnAnimation();
- }
-
- private void setChallengeShowing(boolean showChallenge) {
- if (mChallengeShowing == showChallenge) {
- return;
- }
- mChallengeShowing = showChallenge;
-
- if (mExpandChallengeView == null || mChallengeView == null) {
- // These might not be here yet if we haven't been through layout.
- // If we haven't, the first layout pass will set everything up correctly
- // based on mChallengeShowing as set above.
- return;
- }
-
- if (mChallengeShowing) {
- mExpandChallengeView.setVisibility(View.INVISIBLE);
- mChallengeView.setVisibility(View.VISIBLE);
- if (AccessibilityManager.getInstance(mContext).isEnabled()) {
- mChallengeView.requestAccessibilityFocus();
- mChallengeView.announceForAccessibility(mContext.getString(
- R.string.keyguard_accessibility_unlock_area_expanded));
- }
- } else {
- mExpandChallengeView.setVisibility(View.VISIBLE);
- mChallengeView.setVisibility(View.INVISIBLE);
- if (AccessibilityManager.getInstance(mContext).isEnabled()) {
- mExpandChallengeView.requestAccessibilityFocus();
- mChallengeView.announceForAccessibility(mContext.getString(
- R.string.keyguard_accessibility_unlock_area_collapsed));
- }
- }
- }
-
- /**
- * @return true if the challenge is at all visible.
- */
- public boolean isChallengeShowing() {
- return mChallengeShowing;
- }
-
- @Override
- public boolean isChallengeOverlapping() {
- return mChallengeShowing;
- }
-
- @Override
- public boolean isBouncing() {
- return mIsBouncing;
- }
-
- @Override
- public int getBouncerAnimationDuration() {
- return HANDLE_ANIMATE_DURATION;
- }
-
- @Override
- public void showBouncer() {
- if (mIsBouncing) return;
- setSystemUiVisibility(getSystemUiVisibility() | STATUS_BAR_DISABLE_SEARCH);
- mWasChallengeShowing = mChallengeShowing;
- mIsBouncing = true;
- showChallenge(true);
- if (mScrimView != null) {
- Animator anim = ObjectAnimator.ofFloat(mScrimView, "alpha", 1f);
- anim.setDuration(HANDLE_ANIMATE_DURATION);
- anim.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- mScrimView.setVisibility(VISIBLE);
- }
- });
- anim.start();
- }
- if (mChallengeView != null) {
- mChallengeView.showBouncer(HANDLE_ANIMATE_DURATION);
- }
-
- if (mBouncerListener != null) {
- mBouncerListener.onBouncerStateChanged(true);
- }
- }
-
- @Override
- public void hideBouncer() {
- if (!mIsBouncing) return;
- setSystemUiVisibility(getSystemUiVisibility() & ~STATUS_BAR_DISABLE_SEARCH);
- if (!mWasChallengeShowing) showChallenge(false);
- mIsBouncing = false;
-
- if (mScrimView != null) {
- Animator anim = ObjectAnimator.ofFloat(mScrimView, "alpha", 0f);
- anim.setDuration(HANDLE_ANIMATE_DURATION);
- anim.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mScrimView.setVisibility(GONE);
- }
- });
- anim.start();
- }
- if (mChallengeView != null) {
- mChallengeView.hideBouncer(HANDLE_ANIMATE_DURATION);
- }
- if (mBouncerListener != null) {
- mBouncerListener.onBouncerStateChanged(false);
- }
- }
-
- private int getChallengeMargin(boolean expanded) {
- return expanded && mHasGlowpad ? 0 : mDragHandleEdgeSlop;
- }
-
- private float getChallengeAlpha() {
- float x = mChallengeOffset - 1;
- return x * x * x + 1.f;
- }
-
- @Override
- public void requestDisallowInterceptTouchEvent(boolean allowIntercept) {
- // We'll intercept whoever we feel like! ...as long as it isn't a challenge view.
- // If there are one or more pointers in the challenge view before we take over
- // touch events, onInterceptTouchEvent will set mBlockDrag.
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- if (mVelocityTracker == null) {
- mVelocityTracker = VelocityTracker.obtain();
- }
- mVelocityTracker.addMovement(ev);
-
- final int action = ev.getActionMasked();
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- mGestureStartX = ev.getX();
- mGestureStartY = ev.getY();
- mBlockDrag = false;
- break;
-
- case MotionEvent.ACTION_CANCEL:
- case MotionEvent.ACTION_UP:
- resetTouch();
- break;
-
- case MotionEvent.ACTION_MOVE:
- final int count = ev.getPointerCount();
- for (int i = 0; i < count; i++) {
- final float x = ev.getX(i);
- final float y = ev.getY(i);
- if (!mIsBouncing && mActivePointerId == INVALID_POINTER
- && (crossedDragHandle(x, y, mGestureStartY)
- && shouldEnableChallengeDragging()
- || (isInChallengeView(x, y) &&
- mScrollState == SCROLL_STATE_SETTLING))) {
- mActivePointerId = ev.getPointerId(i);
- mGestureStartX = x;
- mGestureStartY = y;
- mGestureStartChallengeBottom = getChallengeBottom();
- mDragging = true;
- enableHardwareLayerForChallengeView();
- } else if (mChallengeShowing && isInChallengeView(x, y)
- && shouldEnableChallengeDragging()) {
- mBlockDrag = true;
- }
- }
- break;
- }
-
- if (mBlockDrag || isChallengeInteractionBlocked()) {
- mActivePointerId = INVALID_POINTER;
- mDragging = false;
- }
-
- return mDragging;
- }
-
- private boolean shouldEnableChallengeDragging() {
- return mEnableChallengeDragging || !mChallengeShowing;
- }
-
- private boolean isChallengeInteractionBlocked() {
- return !mChallengeInteractiveExternal || !mChallengeInteractiveInternal;
- }
-
- private void resetTouch() {
- mVelocityTracker.recycle();
- mVelocityTracker = null;
- mActivePointerId = INVALID_POINTER;
- mDragging = mBlockDrag = false;
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- if (mVelocityTracker == null) {
- mVelocityTracker = VelocityTracker.obtain();
- }
- mVelocityTracker.addMovement(ev);
-
- final int action = ev.getActionMasked();
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- mBlockDrag = false;
- mGestureStartX = ev.getX();
- mGestureStartY = ev.getY();
- break;
-
- case MotionEvent.ACTION_CANCEL:
- if (mDragging && !isChallengeInteractionBlocked()) {
- showChallenge(0);
- }
- resetTouch();
- break;
-
- case MotionEvent.ACTION_POINTER_UP:
- if (mActivePointerId != ev.getPointerId(ev.getActionIndex())) {
- break;
- }
- case MotionEvent.ACTION_UP:
- if (mDragging && !isChallengeInteractionBlocked()) {
- mVelocityTracker.computeCurrentVelocity(1000, mMaxVelocity);
- showChallenge((int) mVelocityTracker.getYVelocity(mActivePointerId));
- }
- resetTouch();
- break;
-
- case MotionEvent.ACTION_MOVE:
- if (!mDragging && !mBlockDrag && !mIsBouncing) {
- final int count = ev.getPointerCount();
- for (int i = 0; i < count; i++) {
- final float x = ev.getX(i);
- final float y = ev.getY(i);
-
- if ((isInDragHandle(x, y) || crossedDragHandle(x, y, mGestureStartY) ||
- (isInChallengeView(x, y) && mScrollState == SCROLL_STATE_SETTLING))
- && mActivePointerId == INVALID_POINTER
- && !isChallengeInteractionBlocked()) {
- mGestureStartX = x;
- mGestureStartY = y;
- mActivePointerId = ev.getPointerId(i);
- mGestureStartChallengeBottom = getChallengeBottom();
- mDragging = true;
- enableHardwareLayerForChallengeView();
- break;
- }
- }
- }
- // Not an else; this can be set above.
- if (mDragging) {
- // No-op if already in this state, but set it here in case we arrived
- // at this point from either intercept or the above.
- setScrollState(SCROLL_STATE_DRAGGING);
-
- final int index = ev.findPointerIndex(mActivePointerId);
- if (index < 0) {
- // Oops, bogus state. We lost some touch events somewhere.
- // Just drop it with no velocity and let things settle.
- resetTouch();
- showChallenge(0);
- return true;
- }
- final float y = ev.getY(index);
- final float pos = Math.min(y - mGestureStartY,
- getLayoutBottom() - mChallengeBottomBound);
-
- moveChallengeTo(mGestureStartChallengeBottom + (int) pos);
- }
- break;
- }
- return true;
- }
-
- /**
- * The lifecycle of touch events is subtle and it's very easy to do something
- * that will cause bugs that will be nasty to track when overriding this method.
- * Normally one should always override onInterceptTouchEvent instead.
- *
- * To put it another way, don't try this at home.
- */
- @Override
- public boolean dispatchTouchEvent(MotionEvent ev) {
- final int action = ev.getActionMasked();
- boolean handled = false;
- if (action == MotionEvent.ACTION_DOWN) {
- // Defensive programming: if we didn't get the UP or CANCEL, reset anyway.
- mEdgeCaptured = false;
- }
- if (mWidgetsView != null && !mIsBouncing && (mEdgeCaptured || isEdgeSwipeBeginEvent(ev))) {
- // Normally we would need to do a lot of extra stuff here.
- // We can only get away with this because we haven't padded in
- // the widget pager or otherwise transformed it during layout.
- // We also don't support things like splitting MotionEvents.
-
- // We set handled to captured even if dispatch is returning false here so that
- // we don't send a different view a busted or incomplete event stream.
- handled = mEdgeCaptured |= mWidgetsView.dispatchTouchEvent(ev);
- }
-
- if (!handled && !mEdgeCaptured) {
- handled = super.dispatchTouchEvent(ev);
- }
-
- if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
- mEdgeCaptured = false;
- }
-
- return handled;
- }
-
- private boolean isEdgeSwipeBeginEvent(MotionEvent ev) {
- if (ev.getActionMasked() != MotionEvent.ACTION_DOWN) {
- return false;
- }
-
- final float x = ev.getX();
- return x < mDragHandleEdgeSlop || x >= getWidth() - mDragHandleEdgeSlop;
- }
-
- /**
- * We only want to add additional vertical space to the drag handle when the panel is fully
- * closed.
- */
- private int getDragHandleSizeAbove() {
- return isChallengeShowing() ? mDragHandleOpenAbove : mDragHandleClosedAbove;
- }
- private int getDragHandleSizeBelow() {
- return isChallengeShowing() ? mDragHandleOpenBelow : mDragHandleClosedBelow;
- }
-
- private boolean isInChallengeView(float x, float y) {
- return isPointInView(x, y, mChallengeView);
- }
-
- private boolean isInDragHandle(float x, float y) {
- return isPointInView(x, y, mExpandChallengeView);
- }
-
- private boolean isPointInView(float x, float y, View view) {
- if (view == null) {
- return false;
- }
- return x >= view.getLeft() && y >= view.getTop()
- && x < view.getRight() && y < view.getBottom();
- }
-
- private boolean crossedDragHandle(float x, float y, float initialY) {
-
- final int challengeTop = mChallengeView.getTop();
- final boolean horizOk = x >= 0 && x < getWidth();
-
- final boolean vertOk;
- if (mChallengeShowing) {
- vertOk = initialY < (challengeTop - getDragHandleSizeAbove()) &&
- y > challengeTop + getDragHandleSizeBelow();
- } else {
- vertOk = initialY > challengeTop + getDragHandleSizeBelow() &&
- y < challengeTop - getDragHandleSizeAbove();
- }
- return horizOk && vertOk;
- }
-
- private int makeChildMeasureSpec(int maxSize, int childDimen) {
- final int mode;
- final int size;
- switch (childDimen) {
- case LayoutParams.WRAP_CONTENT:
- mode = MeasureSpec.AT_MOST;
- size = maxSize;
- break;
- case LayoutParams.MATCH_PARENT:
- mode = MeasureSpec.EXACTLY;
- size = maxSize;
- break;
- default:
- mode = MeasureSpec.EXACTLY;
- size = Math.min(maxSize, childDimen);
- break;
- }
- return MeasureSpec.makeMeasureSpec(size, mode);
- }
-
- @Override
- protected void onMeasure(int widthSpec, int heightSpec) {
- if (MeasureSpec.getMode(widthSpec) != MeasureSpec.EXACTLY ||
- MeasureSpec.getMode(heightSpec) != MeasureSpec.EXACTLY) {
- throw new IllegalArgumentException(
- "SlidingChallengeLayout must be measured with an exact size");
- }
- final int width = MeasureSpec.getSize(widthSpec);
- final int height = MeasureSpec.getSize(heightSpec);
- setMeasuredDimension(width, height);
-
- final int insetHeight = height - mInsets.top - mInsets.bottom;
- final int insetHeightSpec = MeasureSpec.makeMeasureSpec(insetHeight, MeasureSpec.EXACTLY);
-
- // Find one and only one challenge view.
- final View oldChallengeView = mChallengeView;
- final View oldExpandChallengeView = mChallengeView;
- mChallengeView = null;
- mExpandChallengeView = null;
- final int count = getChildCount();
-
- // First iteration through the children finds special children and sets any associated
- // state.
- for (int i = 0; i < count; i++) {
- final View child = getChildAt(i);
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
- if (lp.childType == LayoutParams.CHILD_TYPE_CHALLENGE) {
- if (mChallengeView != null) {
- throw new IllegalStateException(
- "There may only be one child with layout_isChallenge=\"true\"");
- }
- if (!(child instanceof KeyguardSecurityContainer)) {
- throw new IllegalArgumentException(
- "Challenge must be a KeyguardSecurityContainer");
- }
- mChallengeView = (KeyguardSecurityContainer) child;
- if (mChallengeView != oldChallengeView) {
- mChallengeView.setVisibility(mChallengeShowing ? VISIBLE : INVISIBLE);
- }
- // We're going to play silly games with the frame's background drawable later.
- if (!mHasLayout) {
- // Set up the margin correctly based on our content for the first run.
- mHasGlowpad = child.findViewById(R.id.keyguard_selector_view) != null;
- lp.leftMargin = lp.rightMargin = getChallengeMargin(true);
- }
- } else if (lp.childType == LayoutParams.CHILD_TYPE_EXPAND_CHALLENGE_HANDLE) {
- if (mExpandChallengeView != null) {
- throw new IllegalStateException(
- "There may only be one child with layout_childType"
- + "=\"expandChallengeHandle\"");
- }
- mExpandChallengeView = child;
- if (mExpandChallengeView != oldExpandChallengeView) {
- mExpandChallengeView.setVisibility(mChallengeShowing ? INVISIBLE : VISIBLE);
- mExpandChallengeView.setOnClickListener(mExpandChallengeClickListener);
- }
- } else if (lp.childType == LayoutParams.CHILD_TYPE_SCRIM) {
- setScrimView(child);
- } else if (lp.childType == LayoutParams.CHILD_TYPE_WIDGETS) {
- mWidgetsView = child;
- }
- }
-
- // We want to measure the challenge view first, since the KeyguardWidgetPager
- // needs to do things its measure pass that are dependent on the challenge view
- // having been measured.
- if (mChallengeView != null && mChallengeView.getVisibility() != View.GONE) {
- // This one's a little funny. If the IME is present - reported in the form
- // of insets on the root view - we only give the challenge the space it would
- // have had if the IME wasn't there in order to keep the rest of the layout stable.
- // We base this on the layout_maxHeight on the challenge view. If it comes out
- // negative or zero, either we didn't have a maxHeight or we're totally out of space,
- // so give up and measure as if this rule weren't there.
- int challengeHeightSpec = insetHeightSpec;
- final View root = getRootView();
- if (root != null) {
- final LayoutParams lp = (LayoutParams) mChallengeView.getLayoutParams();
- final int windowHeight = mDisplayMetrics.heightPixels
- - root.getPaddingTop() - mInsets.top;
- final int diff = windowHeight - insetHeight;
- final int maxChallengeHeight = lp.maxHeight - diff;
- if (maxChallengeHeight > 0) {
- challengeHeightSpec = makeChildMeasureSpec(maxChallengeHeight, lp.height);
- }
- }
- measureChildWithMargins(mChallengeView, widthSpec, 0, challengeHeightSpec, 0);
- }
-
- // Measure the rest of the children
- for (int i = 0; i < count; i++) {
- final View child = getChildAt(i);
- if (child.getVisibility() == GONE) {
- continue;
- }
- // Don't measure the challenge view twice!
- if (child == mChallengeView) continue;
-
- // Measure children. Widget frame measures special, so that we can ignore
- // insets for the IME.
- int parentWidthSpec = widthSpec, parentHeightSpec = insetHeightSpec;
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
- if (lp.childType == LayoutParams.CHILD_TYPE_WIDGETS) {
- final View root = getRootView();
- if (root != null) {
- // This calculation is super dodgy and relies on several assumptions.
- // Specifically that the root of the window will be padded in for insets
- // and that the window is LAYOUT_IN_SCREEN.
- final int windowWidth = mDisplayMetrics.widthPixels;
- final int windowHeight = mDisplayMetrics.heightPixels
- - root.getPaddingTop() - mInsets.top;
- parentWidthSpec = MeasureSpec.makeMeasureSpec(
- windowWidth, MeasureSpec.EXACTLY);
- parentHeightSpec = MeasureSpec.makeMeasureSpec(
- windowHeight, MeasureSpec.EXACTLY);
- }
- } else if (lp.childType == LayoutParams.CHILD_TYPE_SCRIM) {
- // Allow scrim views to extend into the insets
- parentWidthSpec = widthSpec;
- parentHeightSpec = heightSpec;
- }
- measureChildWithMargins(child, parentWidthSpec, 0, parentHeightSpec, 0);
- }
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- final int paddingLeft = getPaddingLeft();
- final int paddingTop = getPaddingTop();
- final int paddingRight = getPaddingRight();
- final int paddingBottom = getPaddingBottom();
- final int width = r - l;
- final int height = b - t;
-
- final int count = getChildCount();
- for (int i = 0; i < count; i++) {
- final View child = getChildAt(i);
-
- if (child.getVisibility() == GONE) continue;
-
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
- if (lp.childType == LayoutParams.CHILD_TYPE_CHALLENGE) {
- // Challenge views pin to the bottom, offset by a portion of their height,
- // and center horizontally.
- final int center = (paddingLeft + width - paddingRight) / 2;
- final int childWidth = child.getMeasuredWidth();
- final int childHeight = child.getMeasuredHeight();
- final int left = center - childWidth / 2;
- final int layoutBottom = height - paddingBottom - lp.bottomMargin - mInsets.bottom;
- // We use the top of the challenge view to position the handle, so
- // we never want less than the handle size showing at the bottom.
- final int bottom = layoutBottom + (int) ((childHeight - mChallengeBottomBound)
- * (1 - mChallengeOffset));
- child.setAlpha(getChallengeAlpha());
- child.layout(left, bottom - childHeight, left + childWidth, bottom);
- } else if (lp.childType == LayoutParams.CHILD_TYPE_EXPAND_CHALLENGE_HANDLE) {
- final int center = (paddingLeft + width - paddingRight) / 2;
- final int left = center - child.getMeasuredWidth() / 2;
- final int right = left + child.getMeasuredWidth();
- final int bottom = height - paddingBottom - lp.bottomMargin - mInsets.bottom;
- final int top = bottom - child.getMeasuredHeight();
- child.layout(left, top, right, bottom);
- } else if (lp.childType == LayoutParams.CHILD_TYPE_SCRIM) {
- // Scrim views use the entire area, including padding & insets
- child.layout(0, 0, getMeasuredWidth(), getMeasuredHeight());
- } else {
- // Non-challenge views lay out from the upper left, layered.
- child.layout(paddingLeft + lp.leftMargin,
- paddingTop + lp.topMargin + mInsets.top,
- paddingLeft + child.getMeasuredWidth(),
- paddingTop + child.getMeasuredHeight() + mInsets.top);
- }
- }
-
- if (!mHasLayout) {
- mHasLayout = true;
- }
- }
-
- @Override
- public void draw(Canvas c) {
- super.draw(c);
- if (DEBUG) {
- final Paint debugPaint = new Paint();
- debugPaint.setColor(0x40FF00CC);
- // show the isInDragHandle() rect
- c.drawRect(mDragHandleEdgeSlop,
- mChallengeView.getTop() - getDragHandleSizeAbove(),
- getWidth() - mDragHandleEdgeSlop,
- mChallengeView.getTop() + getDragHandleSizeBelow(),
- debugPaint);
- }
- }
-
- @Override
- protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
- // Focus security fileds before widgets.
- if (mChallengeView != null &&
- mChallengeView.requestFocus(direction, previouslyFocusedRect)) {
- return true;
- }
- return super.onRequestFocusInDescendants(direction, previouslyFocusedRect);
- }
-
- public void computeScroll() {
- super.computeScroll();
-
- if (!mScroller.isFinished()) {
- if (mChallengeView == null) {
- // Can't scroll if the view is missing.
- Log.e(TAG, "Challenge view missing in computeScroll");
- mScroller.abortAnimation();
- return;
- }
-
- mScroller.computeScrollOffset();
- moveChallengeTo(mScroller.getCurrY());
-
- if (mScroller.isFinished()) {
- post(mEndScrollRunnable);
- }
- }
- }
-
- private void cancelTransitionsInProgress() {
- if (!mScroller.isFinished()) {
- mScroller.abortAnimation();
- completeChallengeScroll();
- }
- if (mFader != null) {
- mFader.cancel();
- }
- }
-
- public void fadeInChallenge() {
- fadeChallenge(true);
- }
-
- public void fadeOutChallenge() {
- fadeChallenge(false);
- }
-
- public void fadeChallenge(final boolean show) {
- if (mChallengeView != null) {
-
- cancelTransitionsInProgress();
- float alpha = show ? 1f : 0f;
- int duration = show ? CHALLENGE_FADE_IN_DURATION : CHALLENGE_FADE_OUT_DURATION;
- mFader = ObjectAnimator.ofFloat(mChallengeView, "alpha", alpha);
- mFader.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- onFadeStart(show);
- }
- @Override
- public void onAnimationEnd(Animator animation) {
- onFadeEnd(show);
- }
- });
- mFader.setDuration(duration);
- mFader.start();
- }
- }
-
- private int getMaxChallengeBottom() {
- if (mChallengeView == null) return 0;
- final int layoutBottom = getLayoutBottom();
- final int challengeHeight = mChallengeView.getMeasuredHeight();
-
- return (layoutBottom + challengeHeight - mChallengeBottomBound);
- }
-
- private int getMinChallengeBottom() {
- return getLayoutBottom();
- }
-
-
- private void onFadeStart(boolean show) {
- mChallengeInteractiveInternal = false;
- enableHardwareLayerForChallengeView();
-
- if (show) {
- moveChallengeTo(getMinChallengeBottom());
- }
-
- setScrollState(SCROLL_STATE_FADING);
- }
-
- private void enableHardwareLayerForChallengeView() {
- if (mChallengeView.isHardwareAccelerated()) {
- mChallengeView.setLayerType(LAYER_TYPE_HARDWARE, null);
- }
- }
-
- private void onFadeEnd(boolean show) {
- mChallengeInteractiveInternal = true;
- setChallengeShowing(show);
-
- if (!show) {
- moveChallengeTo(getMaxChallengeBottom());
- }
-
- mChallengeView.setLayerType(LAYER_TYPE_NONE, null);
- mFader = null;
- setScrollState(SCROLL_STATE_IDLE);
- }
-
- public int getMaxChallengeTop() {
- if (mChallengeView == null) return 0;
-
- final int layoutBottom = getLayoutBottom();
- final int challengeHeight = mChallengeView.getMeasuredHeight();
- return layoutBottom - challengeHeight - mInsets.top;
- }
-
- /**
- * Move the bottom edge of mChallengeView to a new position and notify the listener
- * if it represents a change in position. Changes made through this method will
- * be stable across layout passes. If this method is called before first layout of
- * this SlidingChallengeLayout it will have no effect.
- *
- * @param bottom New bottom edge in px in this SlidingChallengeLayout's coordinate system.
- * @return true if the challenge view was moved
- */
- private boolean moveChallengeTo(int bottom) {
- if (mChallengeView == null || !mHasLayout) {
- return false;
- }
-
- final int layoutBottom = getLayoutBottom();
- final int challengeHeight = mChallengeView.getHeight();
-
- bottom = Math.max(getMinChallengeBottom(),
- Math.min(bottom, getMaxChallengeBottom()));
-
- float offset = 1.f - (float) (bottom - layoutBottom) /
- (challengeHeight - mChallengeBottomBound);
- mChallengeOffset = offset;
- if (offset > 0 && !mChallengeShowing) {
- setChallengeShowing(true);
- }
-
- mChallengeView.layout(mChallengeView.getLeft(),
- bottom - mChallengeView.getHeight(), mChallengeView.getRight(), bottom);
-
- mChallengeView.setAlpha(getChallengeAlpha());
- if (mScrollListener != null) {
- mScrollListener.onScrollPositionChanged(offset, mChallengeView.getTop());
- }
- postInvalidateOnAnimation();
- return true;
- }
-
- /**
- * The bottom edge of this SlidingChallengeLayout's coordinate system; will coincide with
- * the bottom edge of mChallengeView when the challenge is fully opened.
- */
- private int getLayoutBottom() {
- final int bottomMargin = (mChallengeView == null)
- ? 0
- : ((LayoutParams) mChallengeView.getLayoutParams()).bottomMargin;
- final int layoutBottom = getMeasuredHeight() - getPaddingBottom() - bottomMargin
- - mInsets.bottom;
- return layoutBottom;
- }
-
- /**
- * The bottom edge of mChallengeView; essentially, where the sliding challenge 'is'.
- */
- private int getChallengeBottom() {
- if (mChallengeView == null) return 0;
-
- return mChallengeView.getBottom();
- }
-
- /**
- * Show or hide the challenge view, animating it if necessary.
- * @param show true to show, false to hide
- */
- public void showChallenge(boolean show) {
- showChallenge(show, 0);
- if (!show) {
- // Block any drags in progress so that callers can use this to disable dragging
- // for other touch interactions.
- mBlockDrag = true;
- }
- }
-
- private void showChallenge(int velocity) {
- boolean show = false;
- if (Math.abs(velocity) > mMinVelocity) {
- show = velocity < 0;
- } else {
- show = mChallengeOffset >= 0.5f;
- }
- showChallenge(show, velocity);
- }
-
- private void showChallenge(boolean show, int velocity) {
- if (mChallengeView == null) {
- setChallengeShowing(false);
- return;
- }
-
- if (mHasLayout) {
- mChallengeShowingTargetState = show;
- final int layoutBottom = getLayoutBottom();
- animateChallengeTo(show ? layoutBottom :
- layoutBottom + mChallengeView.getHeight() - mChallengeBottomBound, velocity);
- }
- }
-
- @Override
- public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
- return new LayoutParams(getContext(), attrs);
- }
-
- @Override
- protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
- return p instanceof LayoutParams ? new LayoutParams((LayoutParams) p) :
- p instanceof MarginLayoutParams ? new LayoutParams((MarginLayoutParams) p) :
- new LayoutParams(p);
- }
-
- @Override
- protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
- return new LayoutParams();
- }
-
- @Override
- protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
- return p instanceof LayoutParams;
- }
-
- public static class LayoutParams extends MarginLayoutParams {
- public int childType = CHILD_TYPE_NONE;
- public static final int CHILD_TYPE_NONE = 0;
- public static final int CHILD_TYPE_CHALLENGE = 2;
- public static final int CHILD_TYPE_SCRIM = 4;
- public static final int CHILD_TYPE_WIDGETS = 5;
- public static final int CHILD_TYPE_EXPAND_CHALLENGE_HANDLE = 6;
-
- public int maxHeight;
-
- public LayoutParams() {
- this(MATCH_PARENT, WRAP_CONTENT);
- }
-
- public LayoutParams(int width, int height) {
- super(width, height);
- }
-
- public LayoutParams(android.view.ViewGroup.LayoutParams source) {
- super(source);
- }
-
- public LayoutParams(MarginLayoutParams source) {
- super(source);
- }
-
- public LayoutParams(LayoutParams source) {
- super(source);
-
- childType = source.childType;
- }
-
- public LayoutParams(Context c, AttributeSet attrs) {
- super(c, attrs);
-
- final TypedArray a = c.obtainStyledAttributes(attrs,
- R.styleable.SlidingChallengeLayout_Layout);
- childType = a.getInt(R.styleable.SlidingChallengeLayout_Layout_layout_childType,
- CHILD_TYPE_NONE);
- maxHeight = a.getDimensionPixelSize(
- R.styleable.SlidingChallengeLayout_Layout_layout_maxHeight, 0);
- a.recycle();
- }
- }
-}
diff --git a/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java b/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java
index ab69a0c..f327078 100644
--- a/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java
+++ b/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java
@@ -47,12 +47,6 @@
void setNeedsInput(boolean needsInput);
/**
- * Tell view mediator that the keyguard view's desired user activity timeout
- * has changed and needs to be reapplied to the window.
- */
- void onUserActivityTimeoutChanged();
-
- /**
* Report that the keyguard is dismissable, pending the next keyguardDone call.
*/
void keyguardDonePending();
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
index d1b4812..264dcae 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
@@ -25,6 +25,8 @@
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.net.wifi.WifiManager;
import android.os.FileUtils;
import android.os.Handler;
@@ -33,9 +35,12 @@
import android.provider.Settings;
import android.util.Log;
+import libcore.io.IoUtils;
+
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
+import java.io.ByteArrayOutputStream;
import java.io.CharArrayReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@@ -48,11 +53,15 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.zip.CRC32;
/**
@@ -138,6 +147,7 @@
String ssid = ""; // equals() and hashCode() need these to be non-null
String key_mgmt = "";
boolean certUsed = false;
+ boolean hasWepKey = false;
final ArrayList<String> rawLines = new ArrayList<String>();
public static Network readFromStream(BufferedReader in) {
@@ -164,9 +174,9 @@
rawLines.add(line);
// remember the ssid and key_mgmt lines for duplicate culling
- if (line.startsWith("ssid")) {
+ if (line.startsWith("ssid=")) {
ssid = line;
- } else if (line.startsWith("key_mgmt")) {
+ } else if (line.startsWith("key_mgmt=")) {
key_mgmt = line;
} else if (line.startsWith("client_cert=")) {
certUsed = true;
@@ -174,6 +184,8 @@
certUsed = true;
} else if (line.startsWith("ca_path=")) {
certUsed = true;
+ } else if (line.startsWith("wep_")) {
+ hasWepKey = true;
}
}
@@ -193,6 +205,56 @@
Log.v(TAG, "}");
}
+ // Calculate the equivalent of WifiConfiguration's configKey()
+ public String configKey() {
+ if (ssid == null) {
+ // No SSID => malformed network definition
+ return null;
+ }
+
+ final String bareSsid = ssid.substring(ssid.indexOf('=') + 1);
+
+ final BitSet types = new BitSet();
+ if (key_mgmt == null) {
+ // no key_mgmt specified; this is defined as equivalent to "WPA-PSK WPA-EAP"
+ types.set(KeyMgmt.WPA_PSK);
+ types.set(KeyMgmt.WPA_EAP);
+ } else {
+ // Need to parse the key_mgmt line
+ final String bareKeyMgmt = key_mgmt.substring(key_mgmt.indexOf('=') + 1);
+ String[] typeStrings = bareKeyMgmt.split("\\s+");
+
+ // Parse out all the key management regimes permitted for this network. The literal
+ // strings here are the standard values permitted in wpa_supplicant.conf.
+ for (int i = 0; i < typeStrings.length; i++) {
+ final String ktype = typeStrings[i];
+ if (ktype.equals("WPA-PSK")) {
+ Log.v(TAG, " + setting WPA_PSK bit");
+ types.set(KeyMgmt.WPA_PSK);
+ } else if (ktype.equals("WPA-EAP")) {
+ Log.v(TAG, " + setting WPA_EAP bit");
+ types.set(KeyMgmt.WPA_EAP);
+ } else if (ktype.equals("IEEE8021X")) {
+ Log.v(TAG, " + setting IEEE8021X bit");
+ types.set(KeyMgmt.IEEE8021X);
+ }
+ }
+ }
+
+ // Now build the canonical config key paralleling the WifiConfiguration semantics
+ final String key;
+ if (types.get(KeyMgmt.WPA_PSK)) {
+ key = bareSsid + KeyMgmt.strings[KeyMgmt.WPA_PSK];
+ } else if (types.get(KeyMgmt.WPA_EAP) || types.get(KeyMgmt.IEEE8021X)) {
+ key = bareSsid + KeyMgmt.strings[KeyMgmt.WPA_EAP];
+ } else if (hasWepKey) {
+ key = bareSsid + "WEP"; // hardcoded this way in WifiConfiguration
+ } else {
+ key = bareSsid + KeyMgmt.strings[KeyMgmt.NONE];
+ }
+ return key;
+ }
+
// Same approach as Pair.equals() and Pair.hashCode()
@Override
public boolean equals(Object o) {
@@ -216,6 +278,17 @@
}
}
+ boolean networkInWhitelist(Network net, List<WifiConfiguration> whitelist) {
+ final String netConfigKey = net.configKey();
+ final int N = whitelist.size();
+ for (int i = 0; i < N; i++) {
+ if (Objects.equals(netConfigKey, whitelist.get(i).configKey(true))) {
+ return true;
+ }
+ }
+ return false;
+ }
+
// Ingest multiple wifi config file fragments, looking for network={} blocks
// and eliminating duplicates
class WifiNetworkSettings {
@@ -223,7 +296,7 @@
final HashSet<Network> mKnownNetworks = new HashSet<Network>();
final ArrayList<Network> mNetworks = new ArrayList<Network>(8);
- public void readNetworks(BufferedReader in) {
+ public void readNetworks(BufferedReader in, List<WifiConfiguration> whitelist) {
try {
String line;
while (in.ready()) {
@@ -232,6 +305,15 @@
// Parse out 'network=' decls so we can ignore duplicates
if (line.startsWith("network")) {
Network net = Network.readFromStream(in);
+ if (whitelist != null) {
+ if (!networkInWhitelist(net, whitelist)) {
+ if (DEBUG_BACKUP) {
+ Log.v(TAG, "Network not in whitelist, skipping: "
+ + net.ssid + " / " + net.key_mgmt);
+ }
+ continue;
+ }
+ }
if (! mKnownNetworks.contains(net)) {
if (DEBUG_BACKUP) {
Log.v(TAG, "Adding " + net.ssid + " / " + net.key_mgmt);
@@ -844,24 +926,23 @@
BufferedReader br = null;
try {
File file = new File(filename);
- if (file.exists()) {
- br = new BufferedReader(new FileReader(file));
- StringBuffer relevantLines = new StringBuffer();
- boolean started = false;
- String line;
- while ((line = br.readLine()) != null) {
- if (!started && line.startsWith("network")) {
- started = true;
- }
- if (started) {
- relevantLines.append(line).append("\n");
- }
- }
- if (relevantLines.length() > 0) {
- return relevantLines.toString().getBytes();
- } else {
- return EMPTY_DATA;
- }
+ if (!file.exists()) {
+ return EMPTY_DATA;
+ }
+
+ WifiManager wifi = (WifiManager) getSystemService(WIFI_SERVICE);
+ List<WifiConfiguration> configs = wifi.getConfiguredNetworks();
+
+ WifiNetworkSettings fromFile = new WifiNetworkSettings();
+ br = new BufferedReader(new FileReader(file));
+ fromFile.readNetworks(br, configs);
+
+ // Write the parsed networks into a packed byte array
+ if (fromFile.mKnownNetworks.size() > 0) {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ OutputStreamWriter out = new OutputStreamWriter(bos);
+ fromFile.write(out);
+ return bos.toByteArray();
} else {
return EMPTY_DATA;
}
@@ -869,12 +950,7 @@
Log.w(TAG, "Couldn't backup " + filename);
return EMPTY_DATA;
} finally {
- if (br != null) {
- try {
- br.close();
- } catch (IOException e) {
- }
- }
+ IoUtils.closeQuietly(br);
}
}
@@ -886,7 +962,7 @@
if (supplicantFile.exists()) {
// Retain the existing APs; we'll append the restored ones to them
BufferedReader in = new BufferedReader(new FileReader(FILE_WIFI_SUPPLICANT));
- supplicantImage.readNetworks(in);
+ supplicantImage.readNetworks(in, null);
in.close();
supplicantFile.delete();
@@ -897,7 +973,7 @@
char[] restoredAsBytes = new char[size];
for (int i = 0; i < size; i++) restoredAsBytes[i] = (char) bytes[i];
BufferedReader in = new BufferedReader(new CharArrayReader(restoredAsBytes));
- supplicantImage.readNetworks(in);
+ supplicantImage.readNetworks(in, null);
if (DEBUG_BACKUP) {
Log.v(TAG, "Final AP list:");
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index b606a6f..035bb0e 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -173,18 +173,6 @@
android:excludeFromRecents="true">
</activity>
- <activity android:name=".recent.RecentsActivity"
- android:label="@string/accessibility_desc_recent_apps"
- android:theme="@style/RecentsStyle"
- android:excludeFromRecents="true"
- android:launchMode="singleInstance"
- android:resumeWhilePausing="true"
- android:exported="true">
- <intent-filter>
- <action android:name="com.android.systemui.TOGGLE_RECENTS" />
- </intent-filter>
- </activity>
-
<receiver
android:name=".recent.RecentsPreloadReceiver"
android:exported="false">
diff --git a/packages/SystemUI/res/anim/notification_buttons_in.xml b/packages/SystemUI/res/anim/notification_buttons_in.xml
deleted file mode 100644
index 630fd72..0000000
--- a/packages/SystemUI/res/anim/notification_buttons_in.xml
+++ /dev/null
@@ -1,22 +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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android"
- >
- <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
- android:duration="@android:integer/config_longAnimTime"
- />
-</set>
diff --git a/packages/SystemUI/res/anim/notification_buttons_out.xml b/packages/SystemUI/res/anim/notification_buttons_out.xml
deleted file mode 100644
index 4717e47..0000000
--- a/packages/SystemUI/res/anim/notification_buttons_out.xml
+++ /dev/null
@@ -1,22 +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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android"
- >
- <alpha android:toAlpha="0.0" android:fromAlpha="1.0"
- android:duration="@android:integer/config_longAnimTime"
- />
-</set>
diff --git a/packages/SystemUI/res/anim/notification_icons_in.xml b/packages/SystemUI/res/anim/notification_icons_in.xml
deleted file mode 100644
index 630fd72..0000000
--- a/packages/SystemUI/res/anim/notification_icons_in.xml
+++ /dev/null
@@ -1,22 +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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android"
- >
- <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
- android:duration="@android:integer/config_longAnimTime"
- />
-</set>
diff --git a/packages/SystemUI/res/anim/notification_icons_out.xml b/packages/SystemUI/res/anim/notification_icons_out.xml
deleted file mode 100644
index 4717e47..0000000
--- a/packages/SystemUI/res/anim/notification_icons_out.xml
+++ /dev/null
@@ -1,22 +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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android"
- >
- <alpha android:toAlpha="0.0" android:fromAlpha="1.0"
- android:duration="@android:integer/config_longAnimTime"
- />
-</set>
diff --git a/packages/SystemUI/res/anim/recent_appear.xml b/packages/SystemUI/res/anim/recent_appear.xml
deleted file mode 100644
index 4400d9d..0000000
--- a/packages/SystemUI/res/anim/recent_appear.xml
+++ /dev/null
@@ -1,20 +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.
--->
-
-<alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:fromAlpha="0.0" android:toAlpha="1.0"
- android:duration="@android:integer/config_shortAnimTime"
- />
diff --git a/packages/SystemUI/res/drawable-hdpi/bg_protect.9.png b/packages/SystemUI/res/drawable-hdpi/bg_protect.9.png
deleted file mode 100644
index 5bbfa4f..0000000
--- a/packages/SystemUI/res/drawable-hdpi/bg_protect.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/bottom_divider_glow.png b/packages/SystemUI/res/drawable-hdpi/bottom_divider_glow.png
deleted file mode 100644
index d1948d6..0000000
--- a/packages/SystemUI/res/drawable-hdpi/bottom_divider_glow.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_lockscreen_glowdot.png b/packages/SystemUI/res/drawable-hdpi/ic_lockscreen_glowdot.png
deleted file mode 100644
index 983c45e..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_lockscreen_glowdot.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_alarm_on.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_alarm_on.png
deleted file mode 100644
index c100353..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_alarm_on.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_certificate_info.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_certificate_info.png
deleted file mode 100644
index 1fdaaf9..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_certificate_info.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_ime.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_ime.png
deleted file mode 100644
index e3b3eeb..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_ime.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png
deleted file mode 100644
index cfa539f..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_settings.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_usb_device.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_usb_device.png
deleted file mode 100644
index c3f4729..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_usb_device.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-hdpi/notification_panel_bg.9.png
deleted file mode 100644
index ff0bd4c..0000000
--- a/packages/SystemUI/res/drawable-hdpi/notification_panel_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg.9.png b/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg.9.png
deleted file mode 100644
index d000f7e..0000000
--- a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_normal.9.png b/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_normal.9.png
deleted file mode 100644
index 8b45500..0000000
--- a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_press.9.png b/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_press.9.png
deleted file mode 100644
index cbcb3e3..0000000
--- a/packages/SystemUI/res/drawable-hdpi/recents_thumbnail_bg_press.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/spinner_default_holo_dark_am_no_underline.9.png b/packages/SystemUI/res/drawable-hdpi/spinner_default_holo_dark_am_no_underline.9.png
deleted file mode 100644
index 267e7ba..0000000
--- a/packages/SystemUI/res/drawable-hdpi/spinner_default_holo_dark_am_no_underline.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_0.png
deleted file mode 100644
index 8f17b72..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_sync.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_sync.png
deleted file mode 100644
index 2dc2b17..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_sync.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_close_off.9.png b/packages/SystemUI/res/drawable-hdpi/status_bar_close_off.9.png
deleted file mode 100644
index 6feb622..0000000
--- a/packages/SystemUI/res/drawable-hdpi/status_bar_close_off.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png
deleted file mode 100644
index 42c773d..0000000
--- a/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/top_divider_glow.png b/packages/SystemUI/res/drawable-hdpi/top_divider_glow.png
deleted file mode 100644
index a540efb1..0000000
--- a/packages/SystemUI/res/drawable-hdpi/top_divider_glow.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-land-hdpi/bg_protect.9.png b/packages/SystemUI/res/drawable-land-hdpi/bg_protect.9.png
deleted file mode 100644
index 1a58144..0000000
--- a/packages/SystemUI/res/drawable-land-hdpi/bg_protect.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-land-mdpi/bg_protect.9.png b/packages/SystemUI/res/drawable-land-mdpi/bg_protect.9.png
deleted file mode 100644
index a12519e..0000000
--- a/packages/SystemUI/res/drawable-land-mdpi/bg_protect.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-land-xhdpi/bg_protect.9.png b/packages/SystemUI/res/drawable-land-xhdpi/bg_protect.9.png
deleted file mode 100644
index ce41454..0000000
--- a/packages/SystemUI/res/drawable-land-xhdpi/bg_protect.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-land-xxhdpi/bg_protect.9.png b/packages/SystemUI/res/drawable-land-xxhdpi/bg_protect.9.png
deleted file mode 100644
index b0b4561..0000000
--- a/packages/SystemUI/res/drawable-land-xxhdpi/bg_protect.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_default_user.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_default_user.png
deleted file mode 100644
index 54afe32..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_default_user.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_default_user.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_default_user.png
deleted file mode 100644
index 2495830..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_default_user.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_default_user.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_default_user.png
deleted file mode 100644
index 0d5b50c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_default_user.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_default_user.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_default_user.png
deleted file mode 100644
index 07f16c3..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_default_user.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/bg_protect.9.png b/packages/SystemUI/res/drawable-mdpi/bg_protect.9.png
deleted file mode 100644
index 2856e09..0000000
--- a/packages/SystemUI/res/drawable-mdpi/bg_protect.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/bottom_divider_glow.png b/packages/SystemUI/res/drawable-mdpi/bottom_divider_glow.png
deleted file mode 100644
index ba25f65..0000000
--- a/packages/SystemUI/res/drawable-mdpi/bottom_divider_glow.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_lockscreen_glowdot.png b/packages/SystemUI/res/drawable-mdpi/ic_lockscreen_glowdot.png
deleted file mode 100644
index 056c3f17..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_lockscreen_glowdot.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_alarm_on.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_alarm_on.png
deleted file mode 100644
index 27f08dd..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_alarm_on.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_certificate_info.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_certificate_info.png
deleted file mode 100644
index 3b49472..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_certificate_info.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_ime.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_ime.png
deleted file mode 100644
index cc81794..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_ime.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png
deleted file mode 100644
index e6237eb..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_settings.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_usb_device.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_usb_device.png
deleted file mode 100644
index 19b95dd..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_usb_device.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-mdpi/notification_panel_bg.9.png
deleted file mode 100644
index 2bbb2c6..0000000
--- a/packages/SystemUI/res/drawable-mdpi/notification_panel_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg.9.png b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg.9.png
deleted file mode 100644
index f19dc93..0000000
--- a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_normal.9.png b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_normal.9.png
deleted file mode 100644
index 4b7de52..0000000
--- a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_press.9.png b/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_press.9.png
deleted file mode 100644
index 3ac7c40..0000000
--- a/packages/SystemUI/res/drawable-mdpi/recents_thumbnail_bg_press.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/spinner_default_holo_dark_am_no_underline.9.png b/packages/SystemUI/res/drawable-mdpi/spinner_default_holo_dark_am_no_underline.9.png
deleted file mode 100644
index db51f6b..0000000
--- a/packages/SystemUI/res/drawable-mdpi/spinner_default_holo_dark_am_no_underline.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_roaming_cdma_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_roaming_cdma_0.png
deleted file mode 100644
index cb38896..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_roaming_cdma_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_sync.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_sync.png
deleted file mode 100644
index ad5b2ff..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_sync.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_close_off.9.png b/packages/SystemUI/res/drawable-mdpi/status_bar_close_off.9.png
deleted file mode 100644
index bd1cd12..0000000
--- a/packages/SystemUI/res/drawable-mdpi/status_bar_close_off.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png
deleted file mode 100644
index 20c8785..0000000
--- a/packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/top_divider_glow.png b/packages/SystemUI/res/drawable-mdpi/top_divider_glow.png
deleted file mode 100644
index 53d85de..0000000
--- a/packages/SystemUI/res/drawable-mdpi/top_divider_glow.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/bugdroid.png b/packages/SystemUI/res/drawable-nodpi/bugdroid.png
deleted file mode 100644
index b90675c..0000000
--- a/packages/SystemUI/res/drawable-nodpi/bugdroid.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/notify_item_glow_bottom.png b/packages/SystemUI/res/drawable-nodpi/notify_item_glow_bottom.png
deleted file mode 100644
index e7828c9..0000000
--- a/packages/SystemUI/res/drawable-nodpi/notify_item_glow_bottom.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw600dp-hdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-sw600dp-hdpi/notification_panel_bg.9.png
deleted file mode 100644
index e7caeda..0000000
--- a/packages/SystemUI/res/drawable-sw600dp-hdpi/notification_panel_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw600dp-mdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-sw600dp-mdpi/notification_panel_bg.9.png
deleted file mode 100644
index ae07083..0000000
--- a/packages/SystemUI/res/drawable-sw600dp-mdpi/notification_panel_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw600dp-tvdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-sw600dp-tvdpi/notification_panel_bg.9.png
deleted file mode 100644
index 727ee49..0000000
--- a/packages/SystemUI/res/drawable-sw600dp-tvdpi/notification_panel_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw600dp-xhdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-sw600dp-xhdpi/notification_panel_bg.9.png
deleted file mode 100644
index 8423ef9..0000000
--- a/packages/SystemUI/res/drawable-sw600dp-xhdpi/notification_panel_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw600dp-xxhdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-sw600dp-xxhdpi/notification_panel_bg.9.png
deleted file mode 100644
index 8703e1d..0000000
--- a/packages/SystemUI/res/drawable-sw600dp-xxhdpi/notification_panel_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-tvdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-tvdpi/notification_panel_bg.9.png
deleted file mode 100644
index c3a105c..0000000
--- a/packages/SystemUI/res/drawable-tvdpi/notification_panel_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/bg_protect.9.png b/packages/SystemUI/res/drawable-xhdpi/bg_protect.9.png
deleted file mode 100644
index 72269f2..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/bg_protect.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/bottom_divider_glow.png b/packages/SystemUI/res/drawable-xhdpi/bottom_divider_glow.png
deleted file mode 100644
index 0b012b4..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/bottom_divider_glow.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_lockscreen_glowdot.png b/packages/SystemUI/res/drawable-xhdpi/ic_lockscreen_glowdot.png
deleted file mode 100644
index cbd039a..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_lockscreen_glowdot.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_alarm_on.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_alarm_on.png
deleted file mode 100644
index 3c0eac1..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_alarm_on.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_certificate_info.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_certificate_info.png
deleted file mode 100644
index b3de2ce..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_certificate_info.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_ime.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_ime.png
deleted file mode 100644
index 65d15b5..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_ime.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png
deleted file mode 100644
index 208089d..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_settings.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_usb_device.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_usb_device.png
deleted file mode 100644
index 86de480..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_usb_device.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-xhdpi/notification_panel_bg.9.png
deleted file mode 100644
index 932e0ef..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/notification_panel_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg.9.png b/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg.9.png
deleted file mode 100644
index 80fc849..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_normal.9.png b/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_normal.9.png
deleted file mode 100644
index c57ec67..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_press.9.png b/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_press.9.png
deleted file mode 100644
index 78a69f5..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/recents_thumbnail_bg_press.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/spinner_default_holo_dark_am_no_underline.9.png b/packages/SystemUI/res/drawable-xhdpi/spinner_default_holo_dark_am_no_underline.9.png
deleted file mode 100644
index 8d22ce2..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/spinner_default_holo_dark_am_no_underline.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_roaming_cdma_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_roaming_cdma_0.png
deleted file mode 100644
index f0c2f05..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_roaming_cdma_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync.png
deleted file mode 100644
index 75b002d..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/status_bar_close_off.9.png b/packages/SystemUI/res/drawable-xhdpi/status_bar_close_off.9.png
deleted file mode 100644
index 1fed081..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/status_bar_close_off.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-xhdpi/status_bar_close_on.9.png
deleted file mode 100644
index b4e129c..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/status_bar_close_on.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/top_divider_glow.png b/packages/SystemUI/res/drawable-xhdpi/top_divider_glow.png
deleted file mode 100644
index d4526c0..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/top_divider_glow.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/bg_protect.9.png b/packages/SystemUI/res/drawable-xxhdpi/bg_protect.9.png
deleted file mode 100644
index efc9b04..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/bg_protect.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_lockscreen_glowdot.png b/packages/SystemUI/res/drawable-xxhdpi/ic_lockscreen_glowdot.png
deleted file mode 100644
index c0edd91..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_lockscreen_glowdot.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_alarm_on.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_alarm_on.png
deleted file mode 100644
index 1e8509b..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_alarm_on.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_certificate_info.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_certificate_info.png
deleted file mode 100644
index 5d6f6c7..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_certificate_info.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_ime.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_ime.png
deleted file mode 100644
index 1a5d26a..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_ime.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_settings.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_settings.png
deleted file mode 100644
index 452942e..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_settings.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_usb_device.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_usb_device.png
deleted file mode 100644
index 99abb6a..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_usb_device.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-xxhdpi/notification_panel_bg.9.png
deleted file mode 100644
index adcdcb7..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/notification_panel_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg.9.png b/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg.9.png
deleted file mode 100644
index a446448..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_normal.9.png b/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_normal.9.png
deleted file mode 100644
index a446448..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_press.9.png b/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_press.9.png
deleted file mode 100644
index 1fa1e62..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/recents_thumbnail_bg_press.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/spinner_default_holo_dark_am_no_underline.9.png b/packages/SystemUI/res/drawable-xxhdpi/spinner_default_holo_dark_am_no_underline.9.png
deleted file mode 100644
index 29fb50f..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/spinner_default_holo_dark_am_no_underline.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_roaming_cdma_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_roaming_cdma_0.png
deleted file mode 100644
index 1c544c4..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_roaming_cdma_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync.png
deleted file mode 100644
index 99b2fff..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/status_bar_close_off.9.png b/packages/SystemUI/res/drawable-xxhdpi/status_bar_close_off.9.png
deleted file mode 100644
index d50ff85..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/status_bar_close_off.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-xxhdpi/status_bar_close_on.9.png
deleted file mode 100644
index 5d27ccd..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/status_bar_close_on.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable/navbar_search_outerring.xml b/packages/SystemUI/res/drawable/navbar_search_outerring.xml
deleted file mode 100644
index 689dbf0..0000000
--- a/packages/SystemUI/res/drawable/navbar_search_outerring.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="oval">
- <size android:height="@dimen/navbar_search_outerring_diameter"
- android:width="@dimen/navbar_search_outerring_diameter" />
- <solid android:color="#00000000" />
- <stroke android:color="#40ffffff" android:width="2dp" />
-</shape>
diff --git a/packages/SystemUI/res/drawable/notification_list_shadow.xml b/packages/SystemUI/res/drawable/notification_list_shadow.xml
deleted file mode 100644
index 7f33153..0000000
--- a/packages/SystemUI/res/drawable/notification_list_shadow.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?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.
--->
-
-<shape
- xmlns:android="http://schemas.android.com/apk/res/android"
- >
- <gradient
- android:angle="90"
- android:endColor="@color/notification_list_shadow_top"
- android:startColor="#00000000"
- android:type="linear"
- />
-</shape>
diff --git a/packages/SystemUI/res/drawable/notification_scrim.xml b/packages/SystemUI/res/drawable/notification_scrim.xml
deleted file mode 100644
index 53ba213..0000000
--- a/packages/SystemUI/res/drawable/notification_scrim.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- ~ Copyright (C) 2014 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <solid android:color="#08000000" />
- <corners android:radius="@dimen/notification_material_rounded_rect_radius" />
-</shape>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/recents_thumbnail_fg.xml b/packages/SystemUI/res/drawable/recents_thumbnail_fg.xml
deleted file mode 100644
index c209055..0000000
--- a/packages/SystemUI/res/drawable/recents_thumbnail_fg.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?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:drawable="@drawable/recents_thumbnail_bg_press" android:state_selected="true" />
- <item android:drawable="@drawable/recents_thumbnail_bg_press" android:state_pressed="true" />
- <item android:drawable="@drawable/recents_thumbnail_no_press"/>
-</selector>
diff --git a/packages/SystemUI/res/drawable/recents_thumbnail_no_press.xml b/packages/SystemUI/res/drawable/recents_thumbnail_no_press.xml
deleted file mode 100644
index be07b2c..0000000
--- a/packages/SystemUI/res/drawable/recents_thumbnail_no_press.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<color xmlns:android="http://schemas.android.com/apk/res/android"
- android:color="#00000000" />
diff --git a/packages/SystemUI/res/drawable/status_bar_close.xml b/packages/SystemUI/res/drawable/status_bar_close.xml
deleted file mode 100644
index 2efc3c3a..0000000
--- a/packages/SystemUI/res/drawable/status_bar_close.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/status_bar_close_on" />
- <item
- android:drawable="@drawable/status_bar_close_off" />
-</selector>
-
diff --git a/packages/SystemUI/res/drawable/status_bar_recents_background.xml b/packages/SystemUI/res/drawable/status_bar_recents_background.xml
deleted file mode 100644
index ea0b75c..0000000
--- a/packages/SystemUI/res/drawable/status_bar_recents_background.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 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.
- */
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <gradient name="status_bar_recents_background"
- android:startColor="#E0000000"
- android:endColor="#99000000"
- android:angle="@integer/status_bar_recents_bg_gradient_degrees"
- />
-</shape>
diff --git a/packages/SystemUI/res/drawable/status_bar_settings_slider_disabled.xml b/packages/SystemUI/res/drawable/status_bar_settings_slider_disabled.xml
deleted file mode 100644
index 17d48b7..0000000
--- a/packages/SystemUI/res/drawable/status_bar_settings_slider_disabled.xml
+++ /dev/null
@@ -1,29 +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.
--->
-
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@android:id/background"
- android:drawable="@*android:drawable/scrubber_track_holo_dark" />
- <item android:id="@android:id/secondaryProgress">
- <scale android:scaleWidth="100%"
- android:drawable="@*android:drawable/scrubber_track_holo_dark" />
- </item>
- <item android:id="@android:id/progress">
- <scale android:scaleWidth="100%"
- android:drawable="@*android:drawable/scrubber_track_holo_dark" />
- </item>
-</layer-list>
-
diff --git a/packages/SystemUI/res/drawable/status_bar_toggle_button.xml b/packages/SystemUI/res/drawable/status_bar_toggle_button.xml
deleted file mode 100644
index e17c62f..0000000
--- a/packages/SystemUI/res/drawable/status_bar_toggle_button.xml
+++ /dev/null
@@ -1,23 +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_checked="true"
- android:drawable="@*android:drawable/scrubber_primary_holo" />
- <item
- android:drawable="@*android:drawable/scrubber_track_holo_dark" />
-</selector>
-
diff --git a/packages/SystemUI/res/drawable/system_bar_notification_header_bg.xml b/packages/SystemUI/res/drawable/system_bar_notification_header_bg.xml
deleted file mode 100644
index 85f1ea2..0000000
--- a/packages/SystemUI/res/drawable/system_bar_notification_header_bg.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true" android:drawable="@*android:drawable/list_selector_pressed_holo_dark" />
- <item android:drawable="@*android:drawable/list_selector_disabled_holo_dark" />
-</selector>
diff --git a/packages/SystemUI/res/layout-land/status_bar_recent_item.xml b/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
deleted file mode 100644
index 1257641..0000000
--- a/packages/SystemUI/res/layout-land/status_bar_recent_item.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* apps/common/assets/default/default/skins/StatusBar.xml
-**
-** Copyright 2006, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="match_parent"
- android:layout_width="wrap_content"
- android:paddingStart="@dimen/status_bar_recents_item_padding"
- android:paddingEnd="@dimen/status_bar_recents_item_padding"
- android:importantForAccessibility="no"
- android:clipChildren="false">
-
- <RelativeLayout android:id="@+id/recent_item"
- android:layout_gravity="center_vertical"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:paddingTop="@*android:dimen/status_bar_height"
- android:clipChildren="false"
- android:clipToPadding="false">
-
- <FrameLayout android:id="@+id/app_thumbnail"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentStart="true"
- android:layout_alignParentTop="true"
- android:layout_marginTop="@dimen/status_bar_recents_thumbnail_top_margin"
- android:layout_marginStart="@dimen/status_bar_recents_thumbnail_left_margin"
- android:background="@drawable/recents_thumbnail_bg"
- android:foreground="@drawable/recents_thumbnail_fg"
- android:visibility="invisible">
- <ImageView android:id="@+id/app_thumbnail_image"
- android:layout_width="@dimen/status_bar_recents_thumbnail_width"
- android:layout_height="@dimen/status_bar_recents_thumbnail_height"
- />
- </FrameLayout>
-
- <ImageView android:id="@+id/app_icon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/status_bar_recents_app_icon_top_margin"
- android:layout_marginStart="@dimen/status_bar_recents_app_icon_left_margin"
- android:layout_alignParentStart="true"
- android:layout_alignParentTop="true"
- android:maxWidth="@dimen/status_bar_recents_app_icon_max_width"
- android:maxHeight="@dimen/status_bar_recents_app_icon_max_height"
- android:scaleType="centerInside"
- android:adjustViewBounds="true"
- android:visibility="invisible"
- />
-
- <TextView android:id="@+id/app_label"
- android:layout_width="@dimen/status_bar_recents_app_label_width"
- android:layout_height="wrap_content"
- android:textSize="@dimen/status_bar_recents_app_label_text_size"
- android:fadingEdge="horizontal"
- android:fadingEdgeLength="@dimen/status_bar_recents_text_fading_edge_length"
- android:scrollHorizontally="true"
- android:layout_alignStart="@id/app_thumbnail"
- android:layout_below="@id/app_thumbnail"
- android:layout_marginTop="@dimen/status_bar_recents_text_description_padding"
- android:layout_marginStart="@dimen/status_bar_recents_app_label_left_margin"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textColor="@color/status_bar_recents_app_label_color"
- android:importantForAccessibility="no"
- />
-
- <TextView android:id="@+id/app_description"
- android:layout_width="@dimen/status_bar_recents_app_label_width"
- android:layout_height="wrap_content"
- android:textSize="@dimen/status_bar_recents_app_description_text_size"
- android:fadingEdge="horizontal"
- android:fadingEdgeLength="@dimen/status_bar_recents_text_fading_edge_length"
- android:scrollHorizontally="true"
- android:layout_alignStart="@id/app_thumbnail"
- android:layout_below="@id/app_label"
- android:layout_marginTop="@dimen/status_bar_recents_text_description_padding"
- android:singleLine="true"
- android:ellipsize="marquee"
- />
-
- </RelativeLayout>
-</FrameLayout>
diff --git a/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml
deleted file mode 100644
index b5d2f86..0000000
--- a/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* apps/common/assets/default/default/skins/StatusBar.xml
-**
-** Copyright 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.
-*/
--->
-
-<com.android.systemui.recent.RecentsPanelView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:systemui="http://schemas.android.com/apk/res-auto"
- android:id="@+id/recents_root"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:foreground="@drawable/bg_protect"
- systemui:recentItemLayout="@layout/status_bar_recent_item"
- >
- <FrameLayout
- android:id="@+id/recents_bg_protect"
- android:background="@drawable/status_bar_recents_background"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_alignParentBottom="true"
- android:clipToPadding="false"
- android:clipChildren="false">
-
- <com.android.systemui.recent.RecentsHorizontalScrollView android:id="@+id/recents_container"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:fadingEdge="horizontal"
- android:scrollbars="none"
- android:layout_gravity="right"
- android:fadingEdgeLength="@dimen/status_bar_recents_scroll_fading_edge_length">
-
- <LinearLayout android:id="@+id/recents_linear_layout"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layoutDirection="ltr"
- android:layout_gravity="left"
- android:orientation="horizontal"
- android:fitsSystemWindows="true">
- </LinearLayout>
-
- </com.android.systemui.recent.RecentsHorizontalScrollView>
-
- </FrameLayout>
-
- <include layout="@layout/status_bar_no_recent_apps"
- android:id="@+id/recents_no_apps"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="invisible" />
-
-</com.android.systemui.recent.RecentsPanelView>
diff --git a/packages/SystemUI/res/layout/notification_public_default.xml b/packages/SystemUI/res/layout/notification_public_default.xml
index acfc4bb..efabc06 100644
--- a/packages/SystemUI/res/layout/notification_public_default.xml
+++ b/packages/SystemUI/res/layout/notification_public_default.xml
@@ -37,7 +37,7 @@
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_alignParentEnd="true"
- android:layout_alignBaseline="@id/title"
+ android:layout_alignBaseline="@+id/title"
android:singleLine="true"
android:gravity="center"
android:paddingStart="8dp"
diff --git a/packages/SystemUI/res/layout/status_bar_recent_item.xml b/packages/SystemUI/res/layout/status_bar_recent_item.xml
deleted file mode 100644
index 6290bb3..0000000
--- a/packages/SystemUI/res/layout/status_bar_recent_item.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* apps/common/assets/default/default/skins/StatusBar.xml
-**
-** Copyright 2006, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
--->
-
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:paddingTop="@dimen/status_bar_recents_item_padding"
- android:paddingBottom="@dimen/status_bar_recents_item_padding"
- android:clipChildren="false"
- android:importantForAccessibility="no">
-
- <RelativeLayout android:id="@+id/recent_item"
- android:layout_gravity="center_horizontal"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:clipChildren="false">
-
- <TextView android:id="@+id/app_label"
- android:layout_width="@dimen/status_bar_recents_app_label_width"
- android:layout_height="wrap_content"
- android:textSize="@dimen/status_bar_recents_app_label_text_size"
- android:fadingEdge="horizontal"
- android:fadingEdgeLength="@dimen/status_bar_recents_text_fading_edge_length"
- android:scrollHorizontally="true"
- android:layout_alignParentStart="true"
- android:layout_alignTop="@+id/app_icon"
- android:paddingTop="2dp"
- android:layout_marginStart="@dimen/status_bar_recents_app_label_left_margin"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textColor="@color/status_bar_recents_app_label_color"
- android:importantForAccessibility="no"
- android:textAlignment="viewStart"
- />
- <FrameLayout android:id="@+id/app_thumbnail"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_toEndOf="@id/app_label"
- android:layout_marginStart="@dimen/status_bar_recents_thumbnail_left_margin"
- android:background="@drawable/recents_thumbnail_bg"
- android:foreground="@drawable/recents_thumbnail_fg"
- android:visibility="invisible">
- <ImageView android:id="@+id/app_thumbnail_image"
- android:layout_width="@dimen/status_bar_recents_thumbnail_width"
- android:layout_height="@dimen/status_bar_recents_thumbnail_height"
- />
- </FrameLayout>
- <View android:id="@+id/recents_callout_line"
- android:layout_width="@dimen/status_bar_recents_app_label_width"
- android:layout_height="1dip"
- android:layout_alignParentStart="true"
- android:layout_marginStart="@dimen/status_bar_recents_app_label_left_margin"
- android:layout_toStartOf="@id/app_thumbnail"
- android:layout_below="@id/app_label"
- android:layout_marginEnd="3dip"
- android:layout_marginTop="3dip"
- android:background="@drawable/recents_callout_line"
- />
-
- <ImageView android:id="@id/app_icon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toEndOf="@id/app_label"
- android:layout_marginStart="@dimen/status_bar_recents_app_icon_left_margin"
- android:layout_marginTop="@dimen/status_bar_recents_app_icon_top_margin"
- android:maxWidth="@dimen/status_bar_recents_app_icon_max_width"
- android:maxHeight="@dimen/status_bar_recents_app_icon_max_height"
- android:scaleType="centerInside"
- android:adjustViewBounds="true"
- android:visibility="invisible"
- />
-
- <TextView android:id="@+id/app_description"
- android:layout_width="@dimen/status_bar_recents_app_label_width"
- android:layout_height="wrap_content"
- android:textSize="@dimen/status_bar_recents_app_description_text_size"
- android:fadingEdge="horizontal"
- android:fadingEdgeLength="@dimen/status_bar_recents_text_fading_edge_length"
- android:scrollHorizontally="true"
- android:layout_alignParentStart="true"
- android:layout_marginStart="@dimen/status_bar_recents_app_label_left_margin"
- android:layout_below="@id/recents_callout_line"
- android:layout_marginTop="3dip"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:textAlignment="viewStart"
- />
-
- </RelativeLayout>
-</FrameLayout>
diff --git a/packages/SystemUI/res/layout/status_bar_recent_panel.xml b/packages/SystemUI/res/layout/status_bar_recent_panel.xml
deleted file mode 100644
index 588873a..0000000
--- a/packages/SystemUI/res/layout/status_bar_recent_panel.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* apps/common/assets/default/default/skins/StatusBar.xml
-**
-** Copyright 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.
-*/
--->
-
-<com.android.systemui.recent.RecentsPanelView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:systemui="http://schemas.android.com/apk/res-auto"
- android:id="@+id/recents_root"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:foreground="@drawable/bg_protect"
- systemui:recentItemLayout="@layout/status_bar_recent_item"
- >
- <FrameLayout
- android:id="@+id/recents_bg_protect"
- android:background="@drawable/status_bar_recents_background"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_alignParentBottom="true">
-
- <com.android.systemui.recent.RecentsVerticalScrollView
- android:id="@+id/recents_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginEnd="0dp"
- android:divider="@null"
- android:stackFromBottom="true"
- android:fadingEdge="vertical"
- android:scrollbars="none"
- android:fadingEdgeLength="@dimen/status_bar_recents_scroll_fading_edge_length"
- android:layout_gravity="bottom|start"
- android:clipToPadding="false"
- android:clipChildren="false">
-
- <LinearLayout android:id="@+id/recents_linear_layout"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:fitsSystemWindows="true"
- android:clipToPadding="false"
- android:clipChildren="false">
- </LinearLayout>
-
- </com.android.systemui.recent.RecentsVerticalScrollView>
-
- </FrameLayout>
-
- <include layout="@layout/status_bar_no_recent_apps"
- android:id="@+id/recents_no_apps"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="invisible" />
-
-</com.android.systemui.recent.RecentsPanelView>
diff --git a/packages/SystemUI/res/menu/recent_popup_menu.xml b/packages/SystemUI/res/menu/recent_popup_menu.xml
deleted file mode 100644
index eecfb9a..0000000
--- a/packages/SystemUI/res/menu/recent_popup_menu.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* apps/common/assets/default/default/skins/StatusBar.xml
-**
-** Copyright 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.
-*/
--->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/recent_remove_item" android:title="@string/status_bar_recent_remove_item_title" />
- <item android:id="@+id/recent_inspect_item" android:title="@string/status_bar_recent_inspect_item_title" />
-</menu>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index d32539b..fd8d8e1 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Klaar"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Gekoppel"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Gekoppel via Wi-Fi-assistent"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Gestoor"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Koppel tans …"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"USB-verbinding"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Warmkol"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 5bc7d59..3cc57f4 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"ተከናውኗል"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"ተገናኝቷል"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"በWi‑Fi ረዳት አማካኝነት ተገናኝቷል"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"ተቀምጧል"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"በማገናኘት ላይ..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"በማገናኘት ላይ"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"መገናኛ ነጥብ"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 8a23713..9ba068a 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"تم"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"متصل"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"تم التوصيل عبر مساعد Wi-Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"تم الحفظ"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"جارٍ الاتصال..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"النطاق"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"نقطة اتصال"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 120a49b..fc01954 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Готово"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Установена е връзка"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Установена е връзка чрез помощника за Wi-Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Запазено"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Установява се връзка..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Тетъринг"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Точка за достъп"</string>
diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml
index cfc6b3e..82d7128 100644
--- a/packages/SystemUI/res/values-bn-rBD/strings.xml
+++ b/packages/SystemUI/res/values-bn-rBD/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"সম্পন্ন হয়েছে"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"সংযুক্ত হয়েছে"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi সহায়ক-এর মাধ্যমে সংযুক্ত হয়েছে"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"সংরক্ষিত হয়েছে"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"সংযুক্ত হচ্ছে..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"টেদারিং"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"হটস্পট"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 0236dfe..12c07d5 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Fet"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Connectat"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Connectat mitjançant l\'assistent de Wi‑Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"S\'ha desat"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"S\'està connectant..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Ancoratge a xarxa"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona Wi-Fi"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 791ae1b..643fee7 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Hotovo"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Připojeno"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Připojeno pomocí asistenta připojení Wi-Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Uloženo"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Připojování..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Sdílení datového připojení"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 5be774e..e92cbf0 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Udført"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Tilsluttet"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Forbindelse via Wi-Fi-assistent"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Gemt"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Opretter forbindelse…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Netdeling"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 4bc932b..b4f4f20 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Fertig"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Verbunden"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Über WLAN-Assistenten verbunden"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Gespeichert"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Verbindung wird hergestellt…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index e131037..3e4c79ea 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Τέλος"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Συνδέθηκε"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Σύνδεση μέσω βοηθού Wi‑Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Αποθηκεύτηκε"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Σύνδεση…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Πρόσδεση"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Σημείο πρόσβασης Wi-Fi"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index f61724d..e79ef4e 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Done"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Connected"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Connected via Wi‑Fi assistant"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Saved"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Connecting..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index f61724d..e79ef4e 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Done"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Connected"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Connected via Wi‑Fi assistant"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Saved"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Connecting..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index c70c8e8..6c2f35b 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Listo"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Conectado"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Conexión por asistente de Wi-Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Guardado/a"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Conectando…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Anclaje a red"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 4a05367..b3ee1e9 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Listo"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Conectado"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Conectado a través de asistente Wi‑Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Guardado"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Conectando..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Anclaje a red"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona Wi-Fi"</string>
diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml
index fc5b18c..003e4cc 100644
--- a/packages/SystemUI/res/values-et-rEE/strings.xml
+++ b/packages/SystemUI/res/values-et-rEE/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Valmis"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Ühendatud"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Ühendatud WiFi-abi kaudu"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Salvestatud"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Ühenduse loomine ..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Jagamine"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Leviala"</string>
diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml
index d284b470..67c1348 100644
--- a/packages/SystemUI/res/values-eu-rES/strings.xml
+++ b/packages/SystemUI/res/values-eu-rES/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Eginda"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Konektatuta"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi laguntzailearen bidez konektatuta"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Gordeta"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Konektatzen…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Konexioa partekatzea"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Sare publikoa"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 37aab03..96ecb4e0 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"انجام شد"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"متصل"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"متصل شده از طریق دستیار Wi-Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"ذخیره شده"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"در حال اتصال..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"اتصال به اینترنت با تلفن همراه"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"نقطه اتصال"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index fb8b0d78..dff31a0 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Valmis"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Yhdistetty"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Yhteys muodostettu Wi‑Fi-apurin kautta"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Tallennetut"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Yhdistetään…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Jaettu yhteys"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 10b6a2d..f1f986b 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Terminé"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Connecté"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Connecté à l\'aide de l\'assistant Wi-Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Enregistré"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Connexion en cours…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Partage de connexion"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Point d\'accès sans fil"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 05ca6dc..bd5eb50 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"OK"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Connecté"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Connecté via l\'assistant Wi‑Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Enregistré"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Connexion en cours..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Partage de connexion"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Point d\'accès"</string>
diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml
index f97e226..839a4d2 100644
--- a/packages/SystemUI/res/values-gl-rES/strings.xml
+++ b/packages/SystemUI/res/values-gl-rES/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Feito"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Conectado"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Conectado ao asistente de wifi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Gardado"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Conectando..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Ancoraxe á rede"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona wifi"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 924fece..810f52e 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"पूर्ण"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"कनेक्ट है"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"वाई-फ़ाई सहायक के द्वारा कनेक्ट है"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"सहेजा गया"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"कनेक्ट हो रहा है..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"टेदरिंग"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"हॉटस्पॉट"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 38723c4..4cc49b6 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Gotovo"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Povezano"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Povezani putem pomoćnika za Wi-Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Spremljeno"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Povezivanje..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Dijeljenje veze"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Žarišna točka"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index b4e0601..714f5f6 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Kész"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Csatlakoztatva"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Csatlakozva Wi‑Fi-segéddel"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Mentett"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Csatlakozás…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Megosztás"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml
index ea00568..1e3468d 100644
--- a/packages/SystemUI/res/values-hy-rAM/strings.xml
+++ b/packages/SystemUI/res/values-hy-rAM/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Պատրաստ է"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Կապակցված է"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Կապակցված է Wi‑Fi Օգնականի միջոցով"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Պահված է"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Միանում է..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Միացում"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Թեժ կետ"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 1674c3f..eb595ed 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Selesai"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Tersambung"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Terhubung melalui Asisten Wi-Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Disimpan"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Menyambung..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Menambatkan"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml
index 9ba0b54..25ee045 100644
--- a/packages/SystemUI/res/values-is-rIS/strings.xml
+++ b/packages/SystemUI/res/values-is-rIS/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Lokið"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Tengt"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Tengt í gegnum Wi-Fi aðstoð"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Vistað"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Tengist..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tjóðrun"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Heitur reitur"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 052678a..ceaab6d 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Fine"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Connesso"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Connesso tramite assistente Wi‑Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Salvata"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Connessione..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 5fa4e31..0eb8076 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"בוצע"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"מחובר"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"מחובר באמצעות אסיסטנט ה-Wi-Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"נשמר"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"מתחבר..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"שיתוף אינטרנט בין ניידים"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"נקודה לשיתוף אינטרנט"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index d581e73..47a0303 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"完了"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"接続済み"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fiアシスタント経由で接続"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"保存済み"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"接続しています..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"テザリング"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"アクセスポイント"</string>
diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml
index e5f8f36..6ce7219 100644
--- a/packages/SystemUI/res/values-ka-rGE/strings.xml
+++ b/packages/SystemUI/res/values-ka-rGE/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"დასრულდა"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"დაკავშირებულია"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"დაკავშირებული Wi-Fi თანაშემწით"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"დამახსოვრებულია"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"დაკავშირება..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"მოდემის რეჟიმი"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"წვდომის წერტილი"</string>
diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml
index 838d94d..048407d0 100644
--- a/packages/SystemUI/res/values-kk-rKZ/strings.xml
+++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Дайын"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Қосылды"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi көмекшісі арқылы қосылу орындалды"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Сақталды"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Қосылуда…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Тетеринг"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Хот-спот"</string>
diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml
index 7f47ff2..c429cd0 100644
--- a/packages/SystemUI/res/values-km-rKH/strings.xml
+++ b/packages/SystemUI/res/values-km-rKH/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"រួចរាល់"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"បានភ្ជាប់"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"បានភ្ជាប់តាមរយៈជំនួយការ Wi‑Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"បានរក្សាទុក"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"កំពុងតភ្ជាប់..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"ការភ្ជាប់"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ហតស្ប៉ត"</string>
diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml
index 181706f..1048077 100644
--- a/packages/SystemUI/res/values-kn-rIN/strings.xml
+++ b/packages/SystemUI/res/values-kn-rIN/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"ಮುಗಿದಿದೆ"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi ಸಹಾಯಕದ ಮೂಲಕ ಸಂಪರ್ಕಿತಗೊಳಿಸಲಾಗಿದೆ"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"ಉಳಿಸಲಾಗಿದೆ"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"ಟೆಥರಿಂಗ್"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ಹಾಟ್ಸ್ಪಾಟ್"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 054c192..a4265ff 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"완료"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"연결됨"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi 도우미를 통해 연결됨"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"저장됨"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"연결 중..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"테더링"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"핫스팟"</string>
diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml
index fed9f25..b0a72ac 100644
--- a/packages/SystemUI/res/values-ky-rKG/strings.xml
+++ b/packages/SystemUI/res/values-ky-rKG/strings.xml
@@ -287,6 +287,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Аткарылды"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Туташкан"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi жардамчысы аркылуу туташып турат"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Сакталды"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Туташууда…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Тетеринг"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Туташуу чекити"</string>
diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml
index 9808830..89ca89b 100644
--- a/packages/SystemUI/res/values-lo-rLA/strings.xml
+++ b/packages/SystemUI/res/values-lo-rLA/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"ແລ້ວໆ"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"ເຊື່ອມຕໍ່ແລ້ວ"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"ເຊື່ອມຕໍ່ຜ່ານ Wi‑Fi ຕົວຊ່ວຍແລ້ວ"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"ບັນທຶກແລ້ວ"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"ກຳລັງເຊື່ອມຕໍ່..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"ການປ່ອນສັນຍານ"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ຮັອດສະປອດ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index a8dd63c..2644434 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Atlikta"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Prijungtas"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Prisijungta naudojant „Wi‑Fi“ pagelbiklį"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Išsaugota"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Prisijungiama..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Susiejimas"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Viešosios interneto prieigos taškas"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 5fc3b0b..fc7524e 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Gatavs"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Pievienota"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Izveidots savienojums ar Wi‑Fi palīgu"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Saglabāts"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Notiek savienojuma izveide…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Piesaiste"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Tīklājs"</string>
diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml
index 1a0f59e..3a86e69 100644
--- a/packages/SystemUI/res/values-mk-rMK/strings.xml
+++ b/packages/SystemUI/res/values-mk-rMK/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Готово"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Поврзано"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Поврзано преку помошник за Wi-Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Зачувано"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Се поврзува..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Поврзување"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Точка на пристап"</string>
diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml
index 357af5d..0a8c619 100644
--- a/packages/SystemUI/res/values-ml-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ml-rIN/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"പൂർത്തിയാക്കി"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"കണക്റ്റുചെയ്തു"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi അസിസ്റ്റന്റ് മുഖേന കണക്റ്റുചെയ്തു"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"സംരക്ഷിച്ചു"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"കണക്റ്റുചെയ്യുന്നു..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"ടെതറിംഗ്"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ഹോട്ട്സ്പോട്ട്"</string>
diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml
index b215ac7..942c612 100644
--- a/packages/SystemUI/res/values-mn-rMN/strings.xml
+++ b/packages/SystemUI/res/values-mn-rMN/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Дууссан"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Холбогдсон"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi-Fi туслагчаар дамжуулан холбогдлоо"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Хадгалагдсан"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Холбогдож байна..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Модем болгох"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Сүлжээний цэг"</string>
diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml
index e7ecaa4..bacfe00 100644
--- a/packages/SystemUI/res/values-mr-rIN/strings.xml
+++ b/packages/SystemUI/res/values-mr-rIN/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"पूर्ण झाले"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"कनेक्ट केलेले"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi सहाय्यक द्वारे कनेक्ट केले"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"जतन केलेले"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"कनेक्ट करीत आहे..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"टेदरिंग"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"हॉटस्पॉट"</string>
diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml
index 67c23d6..fe89626 100644
--- a/packages/SystemUI/res/values-ms-rMY/strings.xml
+++ b/packages/SystemUI/res/values-ms-rMY/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Selesai"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Disambungkan"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Disambungkan melalui Pembantu Wi-Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Disimpan"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Menyambung..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Penambatan"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Tempat liputan"</string>
diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml
index f3830dd..1fbabcb 100644
--- a/packages/SystemUI/res/values-my-rMM/strings.xml
+++ b/packages/SystemUI/res/values-my-rMM/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"လုပ်ပြီး"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"ချိတ်ဆက်ထား"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"ကြိုးမဲ့ကူညီသူမှတဆင့် ချိတ်ဆက်ပြီး၏"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"သိမ်းဆည်းပြီး"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"ဆက်သွယ်နေ..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"တွဲချီပေးခြင်း"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ဟော့စပေါ့"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index a99b3d0..52795b0 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Ferdig"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Tilkoblet"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Koblet til via en Wi-Fi-assistent"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Lagret"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Kobler til …"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tilknytning"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Wi-Fi-sone"</string>
diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml
index e30f49f..217fb82 100644
--- a/packages/SystemUI/res/values-ne-rNP/strings.xml
+++ b/packages/SystemUI/res/values-ne-rNP/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"भयो"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"जोडिएको"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi-Fi सहायक द्वारा जोडिएको"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"सुरक्षित गरियो"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"जडान हुँदै..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"टेदर गर्दै"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"हटस्पट"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 060b1c5..f2b03e9 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Gereed"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Verbonden"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Verbonden via wifi-assistent"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Opgeslagen"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Verbinding maken…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index a68d076..d9a59b5 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Gotowe"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Połączono"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Połączono przez Asystenta Wi‑Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Zapisano"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Łączę..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Powiązanie"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Punkt dostępu"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index db1528e..19be904 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Concluído"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Ligado"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Ligado através do Assistente de Wi‑Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Guardado(a)"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"A ligar..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Associação"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona Wi-Fi"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 87eb2db..2f17f1b 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Concluído"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Conectado"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Conectado via assistente de Wi‑Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Salvo"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Conectando..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Ponto de acesso"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 76a33c5..4a6611bf 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Terminat"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Conectat"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Conexiune realizată printr-un asistent Wi-Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Salvat"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Se conectează..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 28451b1..4430e3c 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Готово"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Подключено"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Установлено подключение через Ассистента Wi-Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Сохранено"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Соединение..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Режим модема"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Точка доступа"</string>
diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml
index 0256a66..44a15d0 100644
--- a/packages/SystemUI/res/values-si-rLK/strings.xml
+++ b/packages/SystemUI/res/values-si-rLK/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"නිමයි"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"සම්බන්ධිත"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi සහායක හරහා සම්බන්ධ කරන ලදි"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"සුරකින ලදි"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"සම්බන්ධ වෙමින්..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"ටෙදරින්"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"හොට්ස්පොට්"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 0a27b91..c7dd7de 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Hotovo"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Pripojené"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Pripojené pomocou Asistenta Wi-Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Uložené"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Pripája sa..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Zdieľanie dátového pripojenia"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 4bd5ddd..60264fc 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Končano"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Povezava je vzpostavljena"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Povezava vzpostavljena prek pomočnika za Wi-Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Shranjeno"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Vzpostavljanje povezave ..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Internet prek mobilne naprave"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Dostopna točka"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 8a15b9f..7858484 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Готово"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Повезан"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Повезано преко Wi‑Fi помоћника"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Сачувано"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Повезује се..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Повезивање"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Хотспот"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index ea2c07a..0f6a227 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Klart"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Ansluten"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Ansluten via Wi-Fi-assistent"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Sparad"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Ansluter ..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Internetdelning"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Trådlös surfzon"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 6b4d4af..d89b926 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Nimemaliza"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Imeunganishwa"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Imeunganishwa kupitia Kisaidizi cha Wi-Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Kilichohifadhiwa"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Inaunganisha..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Kusambaza mtandao"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Mtandao-hewa"</string>
diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml
index 27c2c6d..07a787b 100644
--- a/packages/SystemUI/res/values-ta-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ta-rIN/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"முடிந்தது"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"இணைக்கப்பட்டது"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"வைஃபை அசிஸ்டண்ட் மூலம் இணைக்கப்பட்டது"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"சேமிக்கப்பட்டது"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"இணைக்கிறது..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"டெதெரிங்"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ஹாட்ஸ்பாட்"</string>
diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml
index bc7edb2..b48fbd1 100644
--- a/packages/SystemUI/res/values-te-rIN/strings.xml
+++ b/packages/SystemUI/res/values-te-rIN/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"పూర్తయింది"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"కనెక్ట్ చేయబడినది"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi సహాయకం ద్వారా కనెక్ట్ చేయబడింది"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"సేవ్ చేయబడింది"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"కనెక్ట్ అవుతోంది..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"టీథరింగ్"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"హాట్స్పాట్"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index c5e0e6a..b7fd59f 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"เสร็จสิ้น"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"เชื่อมต่อ"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"เชื่อมต่อผ่านตัวช่วย Wi-Fi อยู่"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"ที่บันทึกไว้"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"กำลังเชื่อมต่อ..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"การปล่อยสัญญาณ"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ฮอตสปอต"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index b870c7a..0528467 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Tapos na"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Nakakonekta"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Nakakonekta sa pamamagitan ng Wi‑Fi assistant"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Na-save"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Kumokonekta..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Nagte-tether"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 03ddc46..29551f7 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Bitti"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Bağlı"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Kablosuz bağlantı yardımcısıyla bağlandı"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Kayıtlı"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Bağlanılıyor..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 133954e..4a93528 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Готово"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Під’єднано"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Під’єднано через Диспетчер Wi-Fi-з’єднання"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Збережено"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"З’єднання…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Режим модема"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Точка доступу"</string>
diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml
index f34a685..dfea0d1 100644
--- a/packages/SystemUI/res/values-ur-rPK/strings.xml
+++ b/packages/SystemUI/res/values-ur-rPK/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"ہو گیا"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"مربوط"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi اسسٹنٹ کے ذریعے منسلک ہے"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"محفوظ کردہ"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"مربوط ہو رہا ہے…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"مربوط کرنا"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ہاٹ اسپاٹ"</string>
diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml
index 8b8fedc..1579beb 100644
--- a/packages/SystemUI/res/values-uz-rUZ/strings.xml
+++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Tayyor"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Ulangan"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Wi‑Fi yordamchisi orqali ulangan"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Saqlandi"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Ulanmoqda…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Modem rejimi"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Ulanish nuqtasi"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index f92116d..0276b98 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Xong"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Đã kết nối"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Được kết nối qua trình hỗ trợ Wi‑Fi"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Đã lưu"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Đang kết nối..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Đang dùng làm điểm truy cập Internet"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Điểm phát sóng"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index c3811f8..614eb05 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"完成"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"已连接"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"已连接(通过 WLAN 助手)"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"已保存"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"正在连接…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"网络共享"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"热点"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 7532520..5e871cf 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"完成"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"已連線"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"已透過 Wi-Fi 小幫手連線"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"已儲存"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"正在連線…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"網絡共享"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"熱點"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 082a92e..ec6f961 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -264,6 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"完成"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"已連線"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"已透過 Wi‑Fi 小幫手連線"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"已儲存"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"連線中..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"網路共用"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"無線基地台"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index b3572a2..4c6aa33 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -262,6 +262,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Kwenziwe"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Ixhunyiwe"</string>
<string name="quick_settings_connected_via_wfa" msgid="1587051627194895715">"Ixhunywe ngomsizi we-Wi-FI"</string>
+ <string name="quick_settings_saved" msgid="4758747300943481411">"Ilondoloziwe"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Iyaxhuma..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Ukusebenzisa njengemodemu"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"I-Hotspot"</string>
diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml
index 4a9eb55..033a90e 100644
--- a/packages/SystemUI/res/values/ids.xml
+++ b/packages/SystemUI/res/values/ids.xml
@@ -36,5 +36,6 @@
<item type="id" name="height_animator_start_value_tag"/>
<item type="id" name="doze_saved_filter_tag"/>
<item type="id" name="qs_icon_tag"/>
+ <item type="id" name="scrim"/>
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
index b3f90d7..e302c98 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
@@ -41,7 +41,7 @@
*/
private final Class<?>[] SERVICES = new Class[] {
com.android.systemui.keyguard.KeyguardViewMediator.class,
- com.android.systemui.recent.Recents.class,
+ com.android.systemui.recents.Recents.class,
com.android.systemui.volume.VolumeUI.class,
com.android.systemui.statusbar.SystemBars.class,
com.android.systemui.usb.StorageNotification.class,
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index e66934e..f9e0219 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -63,7 +63,6 @@
import com.android.keyguard.KeyguardDisplayManager;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
-import com.android.keyguard.MultiUserAvatarCache;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.SystemUI;
import com.android.systemui.statusbar.phone.PhoneStatusBar;
@@ -335,12 +334,10 @@
@Override
public void onUserRemoved(int userId) {
mLockPatternUtils.removeUser(userId);
- MultiUserAvatarCache.getInstance().clear(userId);
}
@Override
public void onUserInfoChanged(int userId) {
- MultiUserAvatarCache.getInstance().clear(userId);
}
@Override
@@ -477,11 +474,6 @@
}
@Override
- public void onUserActivityTimeoutChanged() {
- mStatusBarKeyguardViewManager.updateUserActivityTimeout();
- }
-
- @Override
public void keyguardDonePending() {
mKeyguardDonePending = true;
mHideAnimationRun = true;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
index f2ebcf6..ddb96a2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -184,6 +184,11 @@
// Make sure signal gets cleared out when no sims.
mInfo.mobileSignalIconId = 0;
mInfo.dataTypeIconId = 0;
+ // Show a No SIMs description to avoid emergency calls message.
+ mInfo.enabled = true;
+ mInfo.enabledDesc = mContext.getString(
+ R.string.keyguard_missing_sim_message_short);
+ mInfo.signalContentDescription = mInfo.enabledDesc;
}
refreshState(mInfo);
}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/ColorDrawableWithDimensions.java b/packages/SystemUI/src/com/android/systemui/recent/ColorDrawableWithDimensions.java
deleted file mode 100644
index b4d3edd..0000000
--- a/packages/SystemUI/src/com/android/systemui/recent/ColorDrawableWithDimensions.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.recent;
-
-import android.graphics.drawable.ColorDrawable;
-
-public class ColorDrawableWithDimensions extends ColorDrawable {
- private int mWidth;
- private int mHeight;
-
- public ColorDrawableWithDimensions(int color, int width, int height) {
- super(color);
- mWidth = width;
- mHeight = height;
- }
-
- @Override
- public int getIntrinsicWidth() {
- return mWidth;
- }
-
- @Override
- public int getIntrinsicHeight() {
- return mHeight;
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/Constants.java b/packages/SystemUI/src/com/android/systemui/recent/Constants.java
deleted file mode 100644
index 8252a9f8..0000000
--- a/packages/SystemUI/src/com/android/systemui/recent/Constants.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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 com.android.systemui.recent;
-
-public class Constants {
- static final int MAX_ESCAPE_ANIMATION_DURATION = 500; // in ms
- static final int SNAP_BACK_DURATION = 250; // in ms
- static final int ESCAPE_VELOCITY = 100; // speed of item required to "curate" it in dp/s
- public static float ALPHA_FADE_START = 0.8f; // fraction of thumbnail width where fade starts
- static final float ALPHA_FADE_END = 0.5f; // fraction of thumbnail width beyond which alpha->0
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/FadedEdgeDrawHelper.java b/packages/SystemUI/src/com/android/systemui/recent/FadedEdgeDrawHelper.java
deleted file mode 100644
index 59f7a80..0000000
--- a/packages/SystemUI/src/com/android/systemui/recent/FadedEdgeDrawHelper.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * 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 com.android.systemui.recent;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.LinearGradient;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.Shader;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.widget.LinearLayout;
-
-import com.android.systemui.R;
-
-public class FadedEdgeDrawHelper {
- public static final boolean OPTIMIZE_SW_RENDERED_RECENTS = true;
- public static final boolean USE_DARK_FADE_IN_HW_ACCELERATED_MODE = true;
- private View mScrollView;
-
- private int mFadingEdgeLength;
- private boolean mIsVertical;
- private boolean mSoftwareRendered = false;
- private Paint mBlackPaint;
- private Paint mFadePaint;
- private Matrix mFadeMatrix;
- private LinearGradient mFade;
-
- public static FadedEdgeDrawHelper create(Context context,
- AttributeSet attrs, View scrollView, boolean isVertical) {
- boolean isTablet = context.getResources().
- getBoolean(R.bool.config_recents_interface_for_tablets);
- if (!isTablet && (OPTIMIZE_SW_RENDERED_RECENTS || USE_DARK_FADE_IN_HW_ACCELERATED_MODE)) {
- return new FadedEdgeDrawHelper(context, attrs, scrollView, isVertical);
- } else {
- return null;
- }
- }
-
- public FadedEdgeDrawHelper(Context context,
- AttributeSet attrs, View scrollView, boolean isVertical) {
- mScrollView = scrollView;
- TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.View);
- mFadingEdgeLength = a.getDimensionPixelSize(android.R.styleable.View_fadingEdgeLength,
- ViewConfiguration.get(context).getScaledFadingEdgeLength());
- mIsVertical = isVertical;
- }
-
- public void onAttachedToWindowCallback(
- LinearLayout layout, boolean hardwareAccelerated) {
- mSoftwareRendered = !hardwareAccelerated;
- if ((mSoftwareRendered && OPTIMIZE_SW_RENDERED_RECENTS)
- || USE_DARK_FADE_IN_HW_ACCELERATED_MODE) {
- mScrollView.setVerticalFadingEdgeEnabled(false);
- mScrollView.setHorizontalFadingEdgeEnabled(false);
- }
- }
-
- public void addViewCallback(View newLinearLayoutChild) {
- if (mSoftwareRendered && OPTIMIZE_SW_RENDERED_RECENTS) {
- final RecentsPanelView.ViewHolder holder =
- (RecentsPanelView.ViewHolder) newLinearLayoutChild.getTag();
- holder.labelView.setDrawingCacheEnabled(true);
- holder.labelView.buildDrawingCache();
- }
- }
-
- public void drawCallback(Canvas canvas,
- int left, int right, int top, int bottom, int scrollX, int scrollY,
- float topFadingEdgeStrength, float bottomFadingEdgeStrength,
- float leftFadingEdgeStrength, float rightFadingEdgeStrength, int mPaddingTop) {
-
- if ((mSoftwareRendered && OPTIMIZE_SW_RENDERED_RECENTS)
- || USE_DARK_FADE_IN_HW_ACCELERATED_MODE) {
- if (mFadePaint == null) {
- mFadePaint = new Paint();
- mFadeMatrix = new Matrix();
- // use use a height of 1, and then wack the matrix each time we
- // actually use it.
- mFade = new LinearGradient(0, 0, 0, 1, 0xCC000000, 0, Shader.TileMode.CLAMP);
- // PULL OUT THIS CONSTANT
- mFadePaint.setShader(mFade);
- }
-
- // draw the fade effect
- boolean drawTop = false;
- boolean drawBottom = false;
- boolean drawLeft = false;
- boolean drawRight = false;
-
- float topFadeStrength = 0.0f;
- float bottomFadeStrength = 0.0f;
- float leftFadeStrength = 0.0f;
- float rightFadeStrength = 0.0f;
-
- final float fadeHeight = mFadingEdgeLength;
- int length = (int) fadeHeight;
-
- // clip the fade length if top and bottom fades overlap
- // overlapping fades produce odd-looking artifacts
- if (mIsVertical && (top + length > bottom - length)) {
- length = (bottom - top) / 2;
- }
-
- // also clip horizontal fades if necessary
- if (!mIsVertical && (left + length > right - length)) {
- length = (right - left) / 2;
- }
-
- if (mIsVertical) {
- topFadeStrength = Math.max(0.0f, Math.min(1.0f, topFadingEdgeStrength));
- drawTop = topFadeStrength * fadeHeight > 1.0f;
- bottomFadeStrength = Math.max(0.0f, Math.min(1.0f, bottomFadingEdgeStrength));
- drawBottom = bottomFadeStrength * fadeHeight > 1.0f;
- }
-
- if (!mIsVertical) {
- leftFadeStrength = Math.max(0.0f, Math.min(1.0f, leftFadingEdgeStrength));
- drawLeft = leftFadeStrength * fadeHeight > 1.0f;
- rightFadeStrength = Math.max(0.0f, Math.min(1.0f, rightFadingEdgeStrength));
- drawRight = rightFadeStrength * fadeHeight > 1.0f;
- }
-
- if (drawTop) {
- mFadeMatrix.setScale(1, fadeHeight * topFadeStrength);
- mFadeMatrix.postTranslate(left, top);
- mFade.setLocalMatrix(mFadeMatrix);
- mFadePaint.setShader(mFade);
- canvas.drawRect(left, top, right, top + length, mFadePaint);
-
- if (mBlackPaint == null) {
- // Draw under the status bar at the top
- mBlackPaint = new Paint();
- mBlackPaint.setColor(0xFF000000);
- }
- canvas.drawRect(left, top - mPaddingTop, right, top, mBlackPaint);
- }
-
- if (drawBottom) {
- mFadeMatrix.setScale(1, fadeHeight * bottomFadeStrength);
- mFadeMatrix.postRotate(180);
- mFadeMatrix.postTranslate(left, bottom);
- mFade.setLocalMatrix(mFadeMatrix);
- mFadePaint.setShader(mFade);
- canvas.drawRect(left, bottom - length, right, bottom, mFadePaint);
- }
-
- if (drawLeft) {
- mFadeMatrix.setScale(1, fadeHeight * leftFadeStrength);
- mFadeMatrix.postRotate(-90);
- mFadeMatrix.postTranslate(left, top);
- mFade.setLocalMatrix(mFadeMatrix);
- mFadePaint.setShader(mFade);
- canvas.drawRect(left, top, left + length, bottom, mFadePaint);
- }
-
- if (drawRight) {
- mFadeMatrix.setScale(1, fadeHeight * rightFadeStrength);
- mFadeMatrix.postRotate(90);
- mFadeMatrix.postTranslate(right, top);
- mFade.setLocalMatrix(mFadeMatrix);
- mFadePaint.setShader(mFade);
- canvas.drawRect(right - length, top, right, bottom, mFadePaint);
- }
- }
- }
-
- public int getVerticalFadingEdgeLength() {
- return mFadingEdgeLength;
- }
-
- public int getHorizontalFadingEdgeLength() {
- return mFadingEdgeLength;
- }
-
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/FirstFrameAnimatorHelper.java b/packages/SystemUI/src/com/android/systemui/recent/FirstFrameAnimatorHelper.java
deleted file mode 100644
index 84d13cf..0000000
--- a/packages/SystemUI/src/com/android/systemui/recent/FirstFrameAnimatorHelper.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.recent;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewPropertyAnimator;
-import android.view.ViewTreeObserver;
-
-/*
- * This is a helper class that listens to updates from the corresponding animation.
- * For the first two frames, it adjusts the current play time of the animation to
- * prevent jank at the beginning of the animation
- */
-public class FirstFrameAnimatorHelper extends AnimatorListenerAdapter
- implements ValueAnimator.AnimatorUpdateListener {
- private static final boolean DEBUG = false;
- private static final int MAX_DELAY = 1000;
- private static final int IDEAL_FRAME_DURATION = 16;
- private View mTarget;
- private long mStartFrame;
- private long mStartTime = -1;
- private boolean mHandlingOnAnimationUpdate;
- private boolean mAdjustedSecondFrameTime;
-
- private static ViewTreeObserver.OnDrawListener sGlobalDrawListener;
- private static long sGlobalFrameCounter;
-
- public FirstFrameAnimatorHelper(ValueAnimator animator, View target) {
- mTarget = target;
- animator.addUpdateListener(this);
- }
-
- public FirstFrameAnimatorHelper(ViewPropertyAnimator vpa, View target) {
- mTarget = target;
- vpa.setListener(this);
- }
-
- // only used for ViewPropertyAnimators
- public void onAnimationStart(Animator animation) {
- final ValueAnimator va = (ValueAnimator) animation;
- va.addUpdateListener(FirstFrameAnimatorHelper.this);
- onAnimationUpdate(va);
- }
-
- public static void initializeDrawListener(View view) {
- if (sGlobalDrawListener != null) {
- view.getViewTreeObserver().removeOnDrawListener(sGlobalDrawListener);
- }
- sGlobalDrawListener = new ViewTreeObserver.OnDrawListener() {
- private long mTime = System.currentTimeMillis();
- public void onDraw() {
- sGlobalFrameCounter++;
- if (DEBUG) {
- long newTime = System.currentTimeMillis();
- Log.d("FirstFrameAnimatorHelper", "TICK " + (newTime - mTime));
- mTime = newTime;
- }
- }
- };
- view.getViewTreeObserver().addOnDrawListener(sGlobalDrawListener);
- }
-
- public void onAnimationUpdate(final ValueAnimator animation) {
- final long currentTime = System.currentTimeMillis();
- if (mStartTime == -1) {
- mStartFrame = sGlobalFrameCounter;
- mStartTime = currentTime;
- }
-
- if (!mHandlingOnAnimationUpdate &&
- // If the current play time exceeds the duration, the animation
- // will get finished, even if we call setCurrentPlayTime -- therefore
- // don't adjust the animation in that case
- animation.getCurrentPlayTime() < animation.getDuration()) {
- mHandlingOnAnimationUpdate = true;
- long frameNum = sGlobalFrameCounter - mStartFrame;
- // If we haven't drawn our first frame, reset the time to t = 0
- // (give up after MAX_DELAY ms of waiting though - might happen, for example, if we
- // are no longer in the foreground and no frames are being rendered ever)
- if (frameNum == 0 && currentTime < mStartTime + MAX_DELAY) {
- // The first frame on animations doesn't always trigger an invalidate...
- // force an invalidate here to make sure the animation continues to advance
- mTarget.getRootView().invalidate();
- animation.setCurrentPlayTime(0);
-
- // For the second frame, if the first frame took more than 16ms,
- // adjust the start time and pretend it took only 16ms anyway. This
- // prevents a large jump in the animation due to an expensive first frame
- } else if (frameNum == 1 && currentTime < mStartTime + MAX_DELAY &&
- !mAdjustedSecondFrameTime &&
- currentTime > mStartTime + IDEAL_FRAME_DURATION) {
- animation.setCurrentPlayTime(IDEAL_FRAME_DURATION);
- mAdjustedSecondFrameTime = true;
- } else {
- if (frameNum > 1) {
- mTarget.post(new Runnable() {
- public void run() {
- animation.removeUpdateListener(FirstFrameAnimatorHelper.this);
- }
- });
- }
- if (DEBUG) print(animation);
- }
- mHandlingOnAnimationUpdate = false;
- } else {
- if (DEBUG) print(animation);
- }
- }
-
- public void print(ValueAnimator animation) {
- float flatFraction = animation.getCurrentPlayTime() / (float) animation.getDuration();
- Log.d("FirstFrameAnimatorHelper", sGlobalFrameCounter +
- "(" + (sGlobalFrameCounter - mStartFrame) + ") " + mTarget + " dirty? " +
- mTarget.isDirty() + " " + flatFraction + " " + this + " " + animation);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentTasksLoader.java b/packages/SystemUI/src/com/android/systemui/recent/RecentTasksLoader.java
deleted file mode 100644
index 34430d9..0000000
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentTasksLoader.java
+++ /dev/null
@@ -1,586 +0,0 @@
-/*
- * 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 com.android.systemui.recent;
-
-import android.app.ActivityManager;
-import android.app.AppGlobals;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ActivityInfo;
-import android.content.pm.IPackageManager;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.os.AsyncTask;
-import android.os.Handler;
-import android.os.Process;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.View;
-
-import com.android.systemui.R;
-import com.android.systemui.recents.misc.SystemServicesProxy;
-import com.android.systemui.statusbar.phone.PhoneStatusBar;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-
-public class RecentTasksLoader implements View.OnTouchListener {
- static final String TAG = "RecentTasksLoader";
- static final boolean DEBUG = PhoneStatusBar.DEBUG || false;
-
- private static final int DISPLAY_TASKS = 20;
- private static final int MAX_TASKS = DISPLAY_TASKS + 1; // allow extra for non-apps
-
- private Context mContext;
- private RecentsPanelView mRecentsPanel;
-
- private Object mFirstTaskLock = new Object();
- private TaskDescription mFirstTask;
- private boolean mFirstTaskLoaded;
-
- private AsyncTask<Void, ArrayList<TaskDescription>, Void> mTaskLoader;
- private AsyncTask<Void, TaskDescription, Void> mThumbnailLoader;
- private Handler mHandler;
-
- private int mIconDpi;
- private ColorDrawableWithDimensions mDefaultThumbnailBackground;
- private ColorDrawableWithDimensions mDefaultIconBackground;
- private int mNumTasksInFirstScreenful = Integer.MAX_VALUE;
-
- private boolean mFirstScreenful;
- private ArrayList<TaskDescription> mLoadedTasks;
-
- private enum State { LOADING, LOADED, CANCELLED };
- private State mState = State.CANCELLED;
-
-
- private static RecentTasksLoader sInstance;
- public static RecentTasksLoader getInstance(Context context) {
- if (sInstance == null) {
- sInstance = new RecentTasksLoader(context);
- }
- return sInstance;
- }
-
- private RecentTasksLoader(Context context) {
- mContext = context;
- mHandler = new Handler();
-
- final Resources res = context.getResources();
-
- // get the icon size we want -- on tablets, we use bigger icons
- boolean isTablet = res.getBoolean(R.bool.config_recents_interface_for_tablets);
- if (isTablet) {
- ActivityManager activityManager =
- (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- mIconDpi = activityManager.getLauncherLargeIconDensity();
- } else {
- mIconDpi = res.getDisplayMetrics().densityDpi;
- }
-
- // Render default icon (just a blank image)
- int defaultIconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.app_icon_size);
- int iconSize = (int) (defaultIconSize * mIconDpi / res.getDisplayMetrics().densityDpi);
- mDefaultIconBackground = new ColorDrawableWithDimensions(0x00000000, iconSize, iconSize);
-
- // Render the default thumbnail background
- int thumbnailWidth =
- (int) res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_width);
- int thumbnailHeight =
- (int) res.getDimensionPixelSize(com.android.internal.R.dimen.thumbnail_height);
- int color = res.getColor(R.drawable.status_bar_recents_app_thumbnail_background);
-
- mDefaultThumbnailBackground =
- new ColorDrawableWithDimensions(color, thumbnailWidth, thumbnailHeight);
- }
-
- public void setRecentsPanel(RecentsPanelView newRecentsPanel, RecentsPanelView caller) {
- // Only allow clearing mRecentsPanel if the caller is the current recentsPanel
- if (newRecentsPanel != null || mRecentsPanel == caller) {
- mRecentsPanel = newRecentsPanel;
- if (mRecentsPanel != null) {
- mNumTasksInFirstScreenful = mRecentsPanel.numItemsInOneScreenful();
- }
- }
- }
-
- public Drawable getDefaultThumbnail() {
- return mDefaultThumbnailBackground;
- }
-
- public Drawable getDefaultIcon() {
- return mDefaultIconBackground;
- }
-
- public ArrayList<TaskDescription> getLoadedTasks() {
- return mLoadedTasks;
- }
-
- public void remove(TaskDescription td) {
- mLoadedTasks.remove(td);
- }
-
- public boolean isFirstScreenful() {
- return mFirstScreenful;
- }
-
- private boolean isCurrentHomeActivity(ComponentName component, ActivityInfo homeInfo) {
- if (homeInfo == null) {
- final PackageManager pm = mContext.getPackageManager();
- homeInfo = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME)
- .resolveActivityInfo(pm, 0);
- }
- return homeInfo != null
- && homeInfo.packageName.equals(component.getPackageName())
- && homeInfo.name.equals(component.getClassName());
- }
-
- // Create an TaskDescription, returning null if the title or icon is null
- TaskDescription createTaskDescription(int taskId, int persistentTaskId, Intent baseIntent,
- ComponentName origActivity, CharSequence description, int userId) {
- Intent intent = new Intent(baseIntent);
- if (origActivity != null) {
- intent.setComponent(origActivity);
- }
- final PackageManager pm = mContext.getPackageManager();
- final IPackageManager ipm = AppGlobals.getPackageManager();
- intent.setFlags((intent.getFlags()&~Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
- | Intent.FLAG_ACTIVITY_NEW_TASK);
- ResolveInfo resolveInfo = null;
- try {
- resolveInfo = ipm.resolveIntent(intent, null, 0, userId);
- } catch (RemoteException re) {
- }
- if (resolveInfo != null) {
- final ActivityInfo info = resolveInfo.activityInfo;
- final String title = info.loadLabel(pm).toString();
-
- if (title != null && title.length() > 0) {
- if (DEBUG) Log.v(TAG, "creating activity desc for id="
- + persistentTaskId + ", label=" + title);
-
- TaskDescription item = new TaskDescription(taskId,
- persistentTaskId, resolveInfo, baseIntent, info.packageName,
- description, userId);
- item.setLabel(title);
-
- return item;
- } else {
- if (DEBUG) Log.v(TAG, "SKIPPING item " + persistentTaskId);
- }
- }
- return null;
- }
-
- void loadThumbnailAndIcon(TaskDescription td) {
- final ActivityManager am = (ActivityManager)
- mContext.getSystemService(Context.ACTIVITY_SERVICE);
- final PackageManager pm = mContext.getPackageManager();
- final Bitmap thumbnail = SystemServicesProxy.getThumbnail(am, td.persistentTaskId);
- Drawable icon = getFullResIcon(td.resolveInfo, pm);
- if (td.userId != UserHandle.myUserId()) {
- // Need to badge the icon
- icon = mContext.getPackageManager().getUserBadgedIcon(icon, new UserHandle(td.userId));
- }
- if (DEBUG) Log.v(TAG, "Loaded bitmap for task "
- + td + ": " + thumbnail);
- synchronized (td) {
- if (thumbnail != null) {
- td.setThumbnail(new BitmapDrawable(mContext.getResources(), thumbnail));
- } else {
- td.setThumbnail(mDefaultThumbnailBackground);
- }
- if (icon != null) {
- td.setIcon(icon);
- }
- td.setLoaded(true);
- }
- }
-
- Drawable getFullResDefaultActivityIcon() {
- return getFullResIcon(Resources.getSystem(),
- com.android.internal.R.mipmap.sym_def_app_icon);
- }
-
- Drawable getFullResIcon(Resources resources, int iconId) {
- try {
- return resources.getDrawableForDensity(iconId, mIconDpi);
- } catch (Resources.NotFoundException e) {
- return getFullResDefaultActivityIcon();
- }
- }
-
- private Drawable getFullResIcon(ResolveInfo info, PackageManager packageManager) {
- Resources resources;
- try {
- resources = packageManager.getResourcesForApplication(
- info.activityInfo.applicationInfo);
- } catch (PackageManager.NameNotFoundException e) {
- resources = null;
- }
- if (resources != null) {
- int iconId = info.activityInfo.getIconResource();
- if (iconId != 0) {
- return getFullResIcon(resources, iconId);
- }
- }
- return getFullResDefaultActivityIcon();
- }
-
- Runnable mPreloadTasksRunnable = new Runnable() {
- public void run() {
- loadTasksInBackground();
- }
- };
-
- // additional optimization when we have software system buttons - start loading the recent
- // tasks on touch down
- @Override
- public boolean onTouch(View v, MotionEvent ev) {
- int action = ev.getAction() & MotionEvent.ACTION_MASK;
- if (action == MotionEvent.ACTION_DOWN) {
- preloadRecentTasksList();
- } else if (action == MotionEvent.ACTION_CANCEL) {
- cancelPreloadingRecentTasksList();
- } else if (action == MotionEvent.ACTION_UP) {
- // Remove the preloader if we haven't called it yet
- mHandler.removeCallbacks(mPreloadTasksRunnable);
- if (!v.isPressed()) {
- cancelLoadingThumbnailsAndIcons();
- }
-
- }
- return false;
- }
-
- public void preloadRecentTasksList() {
- mHandler.post(mPreloadTasksRunnable);
- }
-
- public void cancelPreloadingRecentTasksList() {
- cancelLoadingThumbnailsAndIcons();
- mHandler.removeCallbacks(mPreloadTasksRunnable);
- }
-
- public void cancelLoadingThumbnailsAndIcons(RecentsPanelView caller) {
- // Only oblige this request if it comes from the current RecentsPanel
- // (eg when you rotate, the old RecentsPanel request should be ignored)
- if (mRecentsPanel == caller) {
- cancelLoadingThumbnailsAndIcons();
- }
- }
-
-
- private void cancelLoadingThumbnailsAndIcons() {
- if (mRecentsPanel != null && mRecentsPanel.isShowing()) {
- return;
- }
-
- if (mTaskLoader != null) {
- mTaskLoader.cancel(false);
- mTaskLoader = null;
- }
- if (mThumbnailLoader != null) {
- mThumbnailLoader.cancel(false);
- mThumbnailLoader = null;
- }
- mLoadedTasks = null;
- if (mRecentsPanel != null) {
- mRecentsPanel.onTaskLoadingCancelled();
- }
- mFirstScreenful = false;
- mState = State.CANCELLED;
- }
-
- private void clearFirstTask() {
- synchronized (mFirstTaskLock) {
- mFirstTask = null;
- mFirstTaskLoaded = false;
- }
- }
-
- public void preloadFirstTask() {
- Thread bgLoad = new Thread() {
- public void run() {
- TaskDescription first = loadFirstTask();
- synchronized(mFirstTaskLock) {
- if (mCancelPreloadingFirstTask) {
- clearFirstTask();
- } else {
- mFirstTask = first;
- mFirstTaskLoaded = true;
- }
- mPreloadingFirstTask = false;
- }
- }
- };
- synchronized(mFirstTaskLock) {
- if (!mPreloadingFirstTask) {
- clearFirstTask();
- mPreloadingFirstTask = true;
- bgLoad.start();
- }
- }
- }
-
- public void cancelPreloadingFirstTask() {
- synchronized(mFirstTaskLock) {
- if (mPreloadingFirstTask) {
- mCancelPreloadingFirstTask = true;
- } else {
- clearFirstTask();
- }
- }
- }
-
- boolean mPreloadingFirstTask;
- boolean mCancelPreloadingFirstTask;
- public TaskDescription getFirstTask() {
- while(true) {
- synchronized(mFirstTaskLock) {
- if (mFirstTaskLoaded) {
- return mFirstTask;
- } else if (!mFirstTaskLoaded && !mPreloadingFirstTask) {
- mFirstTask = loadFirstTask();
- mFirstTaskLoaded = true;
- return mFirstTask;
- }
- }
- try {
- Thread.sleep(3);
- } catch (InterruptedException e) {
- }
- }
- }
-
- public TaskDescription loadFirstTask() {
- final ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
-
- final List<ActivityManager.RecentTaskInfo> recentTasks = am.getRecentTasksForUser(1,
- ActivityManager.RECENT_IGNORE_UNAVAILABLE | ActivityManager.RECENT_INCLUDE_PROFILES,
- UserHandle.CURRENT.getIdentifier());
- TaskDescription item = null;
- if (recentTasks.size() > 0) {
- ActivityManager.RecentTaskInfo recentInfo = recentTasks.get(0);
-
- Intent intent = new Intent(recentInfo.baseIntent);
- if (recentInfo.origActivity != null) {
- intent.setComponent(recentInfo.origActivity);
- }
-
- // Don't load the current home activity.
- if (isCurrentHomeActivity(intent.getComponent(), null)) {
- return null;
- }
-
- // Don't load ourselves
- if (intent.getComponent().getPackageName().equals(mContext.getPackageName())) {
- return null;
- }
-
- item = createTaskDescription(recentInfo.id,
- recentInfo.persistentId, recentInfo.baseIntent,
- recentInfo.origActivity, recentInfo.description,
- recentInfo.userId);
- if (item != null) {
- loadThumbnailAndIcon(item);
- }
- return item;
- }
- return null;
- }
-
- public void loadTasksInBackground() {
- loadTasksInBackground(false);
- }
- public void loadTasksInBackground(final boolean zeroeth) {
- if (mState != State.CANCELLED) {
- return;
- }
- mState = State.LOADING;
- mFirstScreenful = true;
-
- final LinkedBlockingQueue<TaskDescription> tasksWaitingForThumbnails =
- new LinkedBlockingQueue<TaskDescription>();
- mTaskLoader = new AsyncTask<Void, ArrayList<TaskDescription>, Void>() {
- @Override
- protected void onProgressUpdate(ArrayList<TaskDescription>... values) {
- if (!isCancelled()) {
- ArrayList<TaskDescription> newTasks = values[0];
- // do a callback to RecentsPanelView to let it know we have more values
- // how do we let it know we're all done? just always call back twice
- if (mRecentsPanel != null) {
- mRecentsPanel.onTasksLoaded(newTasks, mFirstScreenful);
- }
- if (mLoadedTasks == null) {
- mLoadedTasks = new ArrayList<TaskDescription>();
- }
- mLoadedTasks.addAll(newTasks);
- mFirstScreenful = false;
- }
- }
- @Override
- protected Void doInBackground(Void... params) {
- // We load in two stages: first, we update progress with just the first screenful
- // of items. Then, we update with the rest of the items
- final int origPri = Process.getThreadPriority(Process.myTid());
- Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
- final PackageManager pm = mContext.getPackageManager();
- final ActivityManager am = (ActivityManager)
- mContext.getSystemService(Context.ACTIVITY_SERVICE);
-
- final List<ActivityManager.RecentTaskInfo> recentTasks =
- am.getRecentTasks(MAX_TASKS, ActivityManager.RECENT_IGNORE_UNAVAILABLE
- | ActivityManager.RECENT_INCLUDE_PROFILES);
- int numTasks = recentTasks.size();
- ActivityInfo homeInfo = new Intent(Intent.ACTION_MAIN)
- .addCategory(Intent.CATEGORY_HOME).resolveActivityInfo(pm, 0);
-
- boolean firstScreenful = true;
- ArrayList<TaskDescription> tasks = new ArrayList<TaskDescription>();
-
- // skip the first task - assume it's either the home screen or the current activity.
- final int first = 0;
- for (int i = first, index = 0; i < numTasks && (index < MAX_TASKS); ++i) {
- if (isCancelled()) {
- break;
- }
- final ActivityManager.RecentTaskInfo recentInfo = recentTasks.get(i);
-
- Intent intent = new Intent(recentInfo.baseIntent);
- if (recentInfo.origActivity != null) {
- intent.setComponent(recentInfo.origActivity);
- }
-
- // Don't load the current home activity.
- if (isCurrentHomeActivity(intent.getComponent(), homeInfo)) {
- continue;
- }
-
- // Don't load ourselves
- if (intent.getComponent().getPackageName().equals(mContext.getPackageName())) {
- continue;
- }
-
- TaskDescription item = createTaskDescription(recentInfo.id,
- recentInfo.persistentId, recentInfo.baseIntent,
- recentInfo.origActivity, recentInfo.description,
- recentInfo.userId);
-
- if (item != null) {
- while (true) {
- try {
- tasksWaitingForThumbnails.put(item);
- break;
- } catch (InterruptedException e) {
- }
- }
- tasks.add(item);
- if (firstScreenful && tasks.size() == mNumTasksInFirstScreenful) {
- publishProgress(tasks);
- tasks = new ArrayList<TaskDescription>();
- firstScreenful = false;
- //break;
- }
- ++index;
- }
- }
-
- if (!isCancelled()) {
- publishProgress(tasks);
- if (firstScreenful) {
- // always should publish two updates
- publishProgress(new ArrayList<TaskDescription>());
- }
- }
-
- while (true) {
- try {
- tasksWaitingForThumbnails.put(new TaskDescription());
- break;
- } catch (InterruptedException e) {
- }
- }
-
- Process.setThreadPriority(origPri);
- return null;
- }
- };
- mTaskLoader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- loadThumbnailsAndIconsInBackground(tasksWaitingForThumbnails);
- }
-
- private void loadThumbnailsAndIconsInBackground(
- final BlockingQueue<TaskDescription> tasksWaitingForThumbnails) {
- // continually read items from tasksWaitingForThumbnails and load
- // thumbnails and icons for them. finish thread when cancelled or there
- // is a null item in tasksWaitingForThumbnails
- mThumbnailLoader = new AsyncTask<Void, TaskDescription, Void>() {
- @Override
- protected void onProgressUpdate(TaskDescription... values) {
- if (!isCancelled()) {
- TaskDescription td = values[0];
- if (td.isNull()) { // end sentinel
- mState = State.LOADED;
- } else {
- if (mRecentsPanel != null) {
- mRecentsPanel.onTaskThumbnailLoaded(td);
- }
- }
- }
- }
- @Override
- protected Void doInBackground(Void... params) {
- final int origPri = Process.getThreadPriority(Process.myTid());
- Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-
- while (true) {
- if (isCancelled()) {
- break;
- }
- TaskDescription td = null;
- while (td == null) {
- try {
- td = tasksWaitingForThumbnails.take();
- } catch (InterruptedException e) {
- }
- }
- if (td.isNull()) { // end sentinel
- publishProgress(td);
- break;
- }
- loadThumbnailAndIcon(td);
-
- publishProgress(td);
- }
-
- Process.setThreadPriority(origPri);
- return null;
- }
- };
- mThumbnailLoader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/Recents.java b/packages/SystemUI/src/com/android/systemui/recent/Recents.java
deleted file mode 100644
index e9f3cf9..0000000
--- a/packages/SystemUI/src/com/android/systemui/recent/Recents.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.recent;
-
-import android.app.ActivityOptions;
-import android.content.ActivityNotFoundException;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.view.Display;
-import android.view.View;
-import com.android.systemui.R;
-import com.android.systemui.RecentsComponent;
-import com.android.systemui.SystemUI;
-import com.android.systemui.recents.AlternateRecentsComponent;
-
-
-public class Recents extends SystemUI implements RecentsComponent {
- private static final String TAG = "Recents";
- private static final boolean DEBUG = true;
-
- // Which recents to use
- boolean mUseAlternateRecents = true;
- boolean mBootCompleted = false;
- static AlternateRecentsComponent sAlternateRecents;
-
- /** Returns the Recents component, creating a new one in-process if necessary. */
- public static AlternateRecentsComponent getRecentsComponent(Context context,
- boolean forceInitialize) {
- if (sAlternateRecents == null) {
- sAlternateRecents = new AlternateRecentsComponent(context);
- if (forceInitialize) {
- sAlternateRecents.onStart();
- sAlternateRecents.onBootCompleted();
- }
- }
- return sAlternateRecents;
- }
-
- @Override
- public void start() {
- if (mUseAlternateRecents) {
- if (sAlternateRecents == null) {
- sAlternateRecents = getRecentsComponent(mContext, false);
- }
- sAlternateRecents.onStart();
- }
-
- putComponent(RecentsComponent.class, this);
- }
-
- @Override
- protected void onBootCompleted() {
- if (mUseAlternateRecents) {
- if (sAlternateRecents != null) {
- sAlternateRecents.onBootCompleted();
- }
- }
- mBootCompleted = true;
- }
-
- @Override
- public void showRecents(boolean triggeredFromAltTab, View statusBarView) {
- if (mUseAlternateRecents) {
- sAlternateRecents.onShowRecents(triggeredFromAltTab);
- }
- }
-
- @Override
- public void hideRecents(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) {
- if (mUseAlternateRecents) {
- sAlternateRecents.onHideRecents(triggeredFromAltTab, triggeredFromHomeKey);
- } else {
- Intent intent = new Intent(RecentsActivity.CLOSE_RECENTS_INTENT);
- intent.setPackage("com.android.systemui");
- sendBroadcastSafely(intent);
-
- RecentTasksLoader.getInstance(mContext).cancelPreloadingFirstTask();
- }
- }
-
- @Override
- public void toggleRecents(Display display, int layoutDirection, View statusBarView) {
- if (mUseAlternateRecents) {
- // Launch the alternate recents if required
- sAlternateRecents.onToggleRecents();
- return;
- }
-
- if (DEBUG) Log.d(TAG, "toggle recents panel");
- try {
- TaskDescription firstTask = RecentTasksLoader.getInstance(mContext).getFirstTask();
-
- Intent intent = new Intent(RecentsActivity.TOGGLE_RECENTS_INTENT);
- intent.setClassName("com.android.systemui",
- "com.android.systemui.recent.RecentsActivity");
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
-
- if (firstTask == null) {
- if (RecentsActivity.forceOpaqueBackground(mContext)) {
- ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext,
- R.anim.recents_launch_from_launcher_enter,
- R.anim.recents_launch_from_launcher_exit);
- mContext.startActivityAsUser(intent, opts.toBundle(), new UserHandle(
- UserHandle.USER_CURRENT));
- } else {
- // The correct window animation will be applied via the activity's style
- mContext.startActivityAsUser(intent, new UserHandle(
- UserHandle.USER_CURRENT));
- }
-
- } else {
- Bitmap first = null;
- if (firstTask.getThumbnail() instanceof BitmapDrawable) {
- first = ((BitmapDrawable) firstTask.getThumbnail()).getBitmap();
- } else {
- first = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
- Drawable d = RecentTasksLoader.getInstance(mContext).getDefaultThumbnail();
- d.draw(new Canvas(first));
- }
- final Resources res = mContext.getResources();
-
- float thumbWidth = res
- .getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_width);
- float thumbHeight = res
- .getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_height);
- if (first == null) {
- throw new RuntimeException("Recents thumbnail is null");
- }
- if (first.getWidth() != thumbWidth || first.getHeight() != thumbHeight) {
- first = Bitmap.createScaledBitmap(first, (int) thumbWidth, (int) thumbHeight,
- true);
- if (first == null) {
- throw new RuntimeException("Recents thumbnail is null");
- }
- }
-
-
- DisplayMetrics dm = new DisplayMetrics();
- display.getMetrics(dm);
- // calculate it here, but consider moving it elsewhere
- // first, determine which orientation you're in.
- final Configuration config = res.getConfiguration();
- int x, y;
-
- if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {
- float appLabelLeftMargin = res.getDimensionPixelSize(
- R.dimen.status_bar_recents_app_label_left_margin);
- float appLabelWidth = res.getDimensionPixelSize(
- R.dimen.status_bar_recents_app_label_width);
- float thumbLeftMargin = res.getDimensionPixelSize(
- R.dimen.status_bar_recents_thumbnail_left_margin);
- float thumbBgPadding = res.getDimensionPixelSize(
- R.dimen.status_bar_recents_thumbnail_bg_padding);
-
- float width = appLabelLeftMargin +
- +appLabelWidth
- + thumbLeftMargin
- + thumbWidth
- + 2 * thumbBgPadding;
-
- x = (int) ((dm.widthPixels - width) / 2f + appLabelLeftMargin + appLabelWidth
- + thumbBgPadding + thumbLeftMargin);
- y = (int) (dm.heightPixels
- - res.getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_height)
- - thumbBgPadding);
- if (layoutDirection == View.LAYOUT_DIRECTION_RTL) {
- x = dm.widthPixels - x - res.getDimensionPixelSize(
- R.dimen.status_bar_recents_thumbnail_width);
- }
-
- } else { // if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
- float thumbTopMargin = res.getDimensionPixelSize(
- R.dimen.status_bar_recents_thumbnail_top_margin);
- float thumbBgPadding = res.getDimensionPixelSize(
- R.dimen.status_bar_recents_thumbnail_bg_padding);
- float textPadding = res.getDimensionPixelSize(
- R.dimen.status_bar_recents_text_description_padding);
- float labelTextSize = res.getDimensionPixelSize(
- R.dimen.status_bar_recents_app_label_text_size);
- Paint p = new Paint();
- p.setTextSize(labelTextSize);
- float labelTextHeight = p.getFontMetricsInt().bottom
- - p.getFontMetricsInt().top;
- float descriptionTextSize = res.getDimensionPixelSize(
- R.dimen.status_bar_recents_app_description_text_size);
- p.setTextSize(descriptionTextSize);
- float descriptionTextHeight = p.getFontMetricsInt().bottom
- - p.getFontMetricsInt().top;
-
- float statusBarHeight = res.getDimensionPixelSize(
- com.android.internal.R.dimen.status_bar_height);
- float recentsItemTopPadding = statusBarHeight;
-
- float height = thumbTopMargin
- + thumbHeight
- + 2 * thumbBgPadding + textPadding + labelTextHeight
- + recentsItemTopPadding + textPadding + descriptionTextHeight;
- float recentsItemRightPadding = res
- .getDimensionPixelSize(R.dimen.status_bar_recents_item_padding);
- float recentsScrollViewRightPadding = res
- .getDimensionPixelSize(R.dimen.status_bar_recents_right_glow_margin);
- x = (int) (dm.widthPixels - res
- .getDimensionPixelSize(R.dimen.status_bar_recents_thumbnail_width)
- - thumbBgPadding - recentsItemRightPadding
- - recentsScrollViewRightPadding);
- y = (int) ((dm.heightPixels - statusBarHeight - height) / 2f + thumbTopMargin
- + recentsItemTopPadding + thumbBgPadding + statusBarHeight);
- }
-
- ActivityOptions opts = ActivityOptions.makeThumbnailScaleDownAnimation(
- statusBarView,
- first, x, y,
- new ActivityOptions.OnAnimationStartedListener() {
- public void onAnimationStarted() {
- Intent intent =
- new Intent(RecentsActivity.WINDOW_ANIMATION_START_INTENT);
- intent.setPackage("com.android.systemui");
- sendBroadcastSafely(intent);
- }
- });
- intent.putExtra(RecentsActivity.WAITING_FOR_WINDOW_ANIMATION_PARAM, true);
- startActivitySafely(intent, opts.toBundle());
- }
- } catch (ActivityNotFoundException e) {
- Log.e(TAG, "Failed to launch RecentAppsIntent", e);
- }
- }
-
- @Override
- protected void onConfigurationChanged(Configuration newConfig) {
- if (mUseAlternateRecents) {
- sAlternateRecents.onConfigurationChanged(newConfig);
- }
- }
-
- @Override
- public void preloadRecents() {
- if (mUseAlternateRecents) {
- sAlternateRecents.onPreloadRecents();
- } else {
- Intent intent = new Intent(RecentsActivity.PRELOAD_INTENT);
- intent.setClassName("com.android.systemui",
- "com.android.systemui.recent.RecentsPreloadReceiver");
- sendBroadcastSafely(intent);
-
- RecentTasksLoader.getInstance(mContext).preloadFirstTask();
- }
- }
-
- @Override
- public void cancelPreloadingRecents() {
- if (mUseAlternateRecents) {
- sAlternateRecents.onCancelPreloadingRecents();
- } else {
- Intent intent = new Intent(RecentsActivity.CANCEL_PRELOAD_INTENT);
- intent.setClassName("com.android.systemui",
- "com.android.systemui.recent.RecentsPreloadReceiver");
- sendBroadcastSafely(intent);
-
- RecentTasksLoader.getInstance(mContext).cancelPreloadingFirstTask();
- }
- }
-
- @Override
- public void showNextAffiliatedTask() {
- if (mUseAlternateRecents) {
- sAlternateRecents.onShowNextAffiliatedTask();
- }
- }
-
- @Override
- public void showPrevAffiliatedTask() {
- if (mUseAlternateRecents) {
- sAlternateRecents.onShowPrevAffiliatedTask();
- }
- }
-
- @Override
- public void setCallback(Callbacks cb) {
- if (mUseAlternateRecents) {
- sAlternateRecents.setRecentsComponentCallback(cb);
- }
- }
-
- /**
- * Send broadcast only if BOOT_COMPLETED
- */
- private void sendBroadcastSafely(Intent intent) {
- if (!mBootCompleted) return;
- mContext.sendBroadcastAsUser(intent, new UserHandle(UserHandle.USER_CURRENT));
- }
-
- /**
- * Start activity only if BOOT_COMPLETED
- */
- private void startActivitySafely(Intent intent, Bundle opts) {
- if (!mBootCompleted) return;
- mContext.startActivityAsUser(intent, opts, new UserHandle(UserHandle.USER_CURRENT));
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java
deleted file mode 100644
index 7ab40b0..0000000
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.recent;
-
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.WallpaperManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.WindowManager;
-
-import com.android.systemui.R;
-import com.android.systemui.statusbar.StatusBarPanel;
-
-import java.util.List;
-
-public class RecentsActivity extends Activity {
- public static final String TOGGLE_RECENTS_INTENT = "com.android.systemui.recent.action.TOGGLE_RECENTS";
- public static final String PRELOAD_INTENT = "com.android.systemui.recent.action.PRELOAD";
- public static final String CANCEL_PRELOAD_INTENT = "com.android.systemui.recent.CANCEL_PRELOAD";
- public static final String CLOSE_RECENTS_INTENT = "com.android.systemui.recent.action.CLOSE";
- public static final String WINDOW_ANIMATION_START_INTENT = "com.android.systemui.recent.action.WINDOW_ANIMATION_START";
- public static final String PRELOAD_PERMISSION = "com.android.systemui.recent.permission.PRELOAD";
- public static final String WAITING_FOR_WINDOW_ANIMATION_PARAM = "com.android.systemui.recent.WAITING_FOR_WINDOW_ANIMATION";
- private static final String WAS_SHOWING = "was_showing";
-
- private RecentsPanelView mRecentsPanel;
- private IntentFilter mIntentFilter;
- private boolean mShowing;
- private boolean mForeground;
-
- private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (CLOSE_RECENTS_INTENT.equals(intent.getAction())) {
- if (mRecentsPanel != null && mRecentsPanel.isShowing()) {
- if (mShowing && !mForeground) {
- // Captures the case right before we transition to another activity
- mRecentsPanel.show(false);
- }
- }
- } else if (WINDOW_ANIMATION_START_INTENT.equals(intent.getAction())) {
- if (mRecentsPanel != null) {
- mRecentsPanel.onWindowAnimationStart();
- }
- }
- }
- };
-
- public class TouchOutsideListener implements View.OnTouchListener {
- private StatusBarPanel mPanel;
-
- public TouchOutsideListener(StatusBarPanel panel) {
- mPanel = panel;
- }
-
- public boolean onTouch(View v, MotionEvent ev) {
- final int action = ev.getAction();
- if (action == MotionEvent.ACTION_OUTSIDE
- || (action == MotionEvent.ACTION_DOWN
- && !mPanel.isInContentArea((int) ev.getX(), (int) ev.getY()))) {
- dismissAndGoHome();
- return true;
- }
- return false;
- }
- }
-
- @Override
- public void onPause() {
- overridePendingTransition(
- R.anim.recents_return_to_launcher_enter,
- R.anim.recents_return_to_launcher_exit);
- mForeground = false;
- super.onPause();
- }
-
- @Override
- public void onStop() {
- mShowing = false;
- if (mRecentsPanel != null) {
- mRecentsPanel.onUiHidden();
- }
- super.onStop();
- }
-
- private void updateWallpaperVisibility(boolean visible) {
- int wpflags = visible ? WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER : 0;
- int curflags = getWindow().getAttributes().flags
- & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
- if (wpflags != curflags) {
- getWindow().setFlags(wpflags, WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER);
- }
- }
-
- public static boolean forceOpaqueBackground(Context context) {
- return WallpaperManager.getInstance(context).getWallpaperInfo() != null;
- }
-
- @Override
- public void onStart() {
- // Hide wallpaper if it's not a static image
- if (forceOpaqueBackground(this)) {
- updateWallpaperVisibility(false);
- } else {
- updateWallpaperVisibility(true);
- }
- mShowing = true;
- if (mRecentsPanel != null) {
- // Call and refresh the recent tasks list in case we didn't preload tasks
- // or in case we don't get an onNewIntent
- mRecentsPanel.refreshRecentTasksList();
- mRecentsPanel.refreshViews();
- }
- super.onStart();
- }
-
- @Override
- public void onResume() {
- mForeground = true;
- super.onResume();
- }
-
- @Override
- public void onBackPressed() {
- dismissAndGoBack();
- }
-
- public void dismissAndGoHome() {
- if (mRecentsPanel != null) {
- Intent homeIntent = new Intent(Intent.ACTION_MAIN, null);
- homeIntent.addCategory(Intent.CATEGORY_HOME);
- homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- startActivityAsUser(homeIntent, new UserHandle(UserHandle.USER_CURRENT));
- mRecentsPanel.show(false);
- }
- }
-
- public void dismissAndGoBack() {
- if (mRecentsPanel != null) {
- final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
-
- final List<ActivityManager.RecentTaskInfo> recentTasks =
- am.getRecentTasks(2,
- ActivityManager.RECENT_WITH_EXCLUDED |
- ActivityManager.RECENT_IGNORE_UNAVAILABLE |
- ActivityManager.RECENT_INCLUDE_PROFILES);
- if (recentTasks.size() > 1 &&
- mRecentsPanel.simulateClick(recentTasks.get(1).persistentId)) {
- // recents panel will take care of calling show(false) through simulateClick
- return;
- }
- mRecentsPanel.show(false);
- }
- finish();
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- getWindow().addPrivateFlags(
- WindowManager.LayoutParams.PRIVATE_FLAG_INHERIT_TRANSLUCENT_DECOR);
- setContentView(R.layout.status_bar_recent_panel);
- mRecentsPanel = (RecentsPanelView) findViewById(R.id.recents_root);
- mRecentsPanel.setOnTouchListener(new TouchOutsideListener(mRecentsPanel));
- mRecentsPanel.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
- | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
-
- final RecentTasksLoader recentTasksLoader = RecentTasksLoader.getInstance(this);
- recentTasksLoader.setRecentsPanel(mRecentsPanel, mRecentsPanel);
- mRecentsPanel.setMinSwipeAlpha(
- getResources().getInteger(R.integer.config_recent_item_min_alpha) / 100f);
-
- if (savedInstanceState == null ||
- savedInstanceState.getBoolean(WAS_SHOWING)) {
- handleIntent(getIntent(), (savedInstanceState == null));
- }
- mIntentFilter = new IntentFilter();
- mIntentFilter.addAction(CLOSE_RECENTS_INTENT);
- mIntentFilter.addAction(WINDOW_ANIMATION_START_INTENT);
- registerReceiver(mIntentReceiver, mIntentFilter);
- super.onCreate(savedInstanceState);
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- outState.putBoolean(WAS_SHOWING, mRecentsPanel.isShowing());
- }
-
- @Override
- protected void onDestroy() {
- RecentTasksLoader.getInstance(this).setRecentsPanel(null, mRecentsPanel);
- unregisterReceiver(mIntentReceiver);
- super.onDestroy();
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- handleIntent(intent, true);
- }
-
- private void handleIntent(Intent intent, boolean checkWaitingForAnimationParam) {
- super.onNewIntent(intent);
-
- if (TOGGLE_RECENTS_INTENT.equals(intent.getAction())) {
- if (mRecentsPanel != null) {
- if (mRecentsPanel.isShowing()) {
- dismissAndGoBack();
- } else {
- final RecentTasksLoader recentTasksLoader = RecentTasksLoader.getInstance(this);
- boolean waitingForWindowAnimation = checkWaitingForAnimationParam &&
- intent.getBooleanExtra(WAITING_FOR_WINDOW_ANIMATION_PARAM, false);
- mRecentsPanel.show(true, recentTasksLoader.getLoadedTasks(),
- recentTasksLoader.isFirstScreenful(), waitingForWindowAnimation);
- }
- }
- }
- }
-
- boolean isForeground() {
- return mForeground;
- }
-
- boolean isActivityShowing() {
- return mShowing;
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsCallback.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsCallback.java
deleted file mode 100644
index deb5670..0000000
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsCallback.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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 com.android.systemui.recent;
-
-import android.view.View;
-
-public interface RecentsCallback {
- static final int SWIPE_LEFT = 0;
- static final int SWIPE_RIGHT = 1;
- static final int SWIPE_UP = 2;
- static final int SWIPE_DOWN = 3;
-
- void handleOnClick(View selectedView);
- void handleSwipe(View selectedView);
- void handleLongPress(View selectedView, View anchorView, View thumbnailView);
- void dismiss();
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java
deleted file mode 100644
index cf5d3a6..0000000
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * 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 com.android.systemui.recent;
-
-import android.animation.LayoutTransition;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.database.DataSetObserver;
-import android.graphics.Canvas;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewTreeObserver;
-import android.view.ViewTreeObserver.OnGlobalLayoutListener;
-import android.widget.HorizontalScrollView;
-import android.widget.LinearLayout;
-
-import com.android.systemui.R;
-import com.android.systemui.SwipeHelper;
-import com.android.systemui.recent.RecentsPanelView.TaskDescriptionAdapter;
-
-import java.util.HashSet;
-import java.util.Iterator;
-
-public class RecentsHorizontalScrollView extends HorizontalScrollView
- implements SwipeHelper.Callback, RecentsPanelView.RecentsScrollView {
- private static final String TAG = RecentsPanelView.TAG;
- private static final boolean DEBUG = RecentsPanelView.DEBUG;
- private LinearLayout mLinearLayout;
- private TaskDescriptionAdapter mAdapter;
- private RecentsCallback mCallback;
- protected int mLastScrollPosition;
- private SwipeHelper mSwipeHelper;
- private FadedEdgeDrawHelper mFadedEdgeDrawHelper;
- private HashSet<View> mRecycledViews;
- private int mNumItemsInOneScreenful;
- private Runnable mOnScrollListener;
-
- public RecentsHorizontalScrollView(Context context, AttributeSet attrs) {
- super(context, attrs, 0);
- mSwipeHelper = new SwipeHelper(SwipeHelper.Y, this, context);
- mFadedEdgeDrawHelper = FadedEdgeDrawHelper.create(context, attrs, this, false);
- mRecycledViews = new HashSet<View>();
- }
-
- public void setMinSwipeAlpha(float minAlpha) {
- mSwipeHelper.setMinSwipeProgress(minAlpha);
- }
-
- private int scrollPositionOfMostRecent() {
- return mLinearLayout.getWidth() - getWidth();
- }
-
- private void addToRecycledViews(View v) {
- if (mRecycledViews.size() < mNumItemsInOneScreenful) {
- mRecycledViews.add(v);
- }
- }
-
- public View findViewForTask(int persistentTaskId) {
- for (int i = 0; i < mLinearLayout.getChildCount(); i++) {
- View v = mLinearLayout.getChildAt(i);
- RecentsPanelView.ViewHolder holder = (RecentsPanelView.ViewHolder) v.getTag();
- if (holder.taskDescription.persistentTaskId == persistentTaskId) {
- return v;
- }
- }
- return null;
- }
-
- private void update() {
- for (int i = 0; i < mLinearLayout.getChildCount(); i++) {
- View v = mLinearLayout.getChildAt(i);
- addToRecycledViews(v);
- mAdapter.recycleView(v);
- }
- LayoutTransition transitioner = getLayoutTransition();
- setLayoutTransition(null);
-
- mLinearLayout.removeAllViews();
- Iterator<View> recycledViews = mRecycledViews.iterator();
- for (int i = 0; i < mAdapter.getCount(); i++) {
- View old = null;
- if (recycledViews.hasNext()) {
- old = recycledViews.next();
- recycledViews.remove();
- old.setVisibility(VISIBLE);
- }
-
- final View view = mAdapter.getView(i, old, mLinearLayout);
-
- if (mFadedEdgeDrawHelper != null) {
- mFadedEdgeDrawHelper.addViewCallback(view);
- }
-
- OnTouchListener noOpListener = new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- return true;
- }
- };
-
- view.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- mCallback.dismiss();
- }
- });
- // We don't want a click sound when we dimiss recents
- view.setSoundEffectsEnabled(false);
-
- OnClickListener launchAppListener = new OnClickListener() {
- public void onClick(View v) {
- mCallback.handleOnClick(view);
- }
- };
-
- RecentsPanelView.ViewHolder holder = (RecentsPanelView.ViewHolder) view.getTag();
- final View thumbnailView = holder.thumbnailView;
- OnLongClickListener longClickListener = new OnLongClickListener() {
- public boolean onLongClick(View v) {
- final View anchorView = view.findViewById(R.id.app_description);
- mCallback.handleLongPress(view, anchorView, thumbnailView);
- return true;
- }
- };
- thumbnailView.setClickable(true);
- thumbnailView.setOnClickListener(launchAppListener);
- thumbnailView.setOnLongClickListener(longClickListener);
-
- // We don't want to dismiss recents if a user clicks on the app title
- // (we also don't want to launch the app either, though, because the
- // app title is a small target and doesn't have great click feedback)
- final View appTitle = view.findViewById(R.id.app_label);
- appTitle.setContentDescription(" ");
- appTitle.setOnTouchListener(noOpListener);
- mLinearLayout.addView(view);
- }
- setLayoutTransition(transitioner);
-
- // Scroll to end after initial layout.
-
- final OnGlobalLayoutListener updateScroll = new OnGlobalLayoutListener() {
- public void onGlobalLayout() {
- mLastScrollPosition = scrollPositionOfMostRecent();
- scrollTo(mLastScrollPosition, 0);
- final ViewTreeObserver observer = getViewTreeObserver();
- if (observer.isAlive()) {
- observer.removeOnGlobalLayoutListener(this);
- }
- }
- };
- getViewTreeObserver().addOnGlobalLayoutListener(updateScroll);
- }
-
- @Override
- public void removeViewInLayout(final View view) {
- dismissChild(view);
- }
-
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- if (DEBUG) Log.v(TAG, "onInterceptTouchEvent()");
- return mSwipeHelper.onInterceptTouchEvent(ev) ||
- super.onInterceptTouchEvent(ev);
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- return mSwipeHelper.onTouchEvent(ev) ||
- super.onTouchEvent(ev);
- }
-
- public boolean canChildBeDismissed(View v) {
- return true;
- }
-
- @Override
- public boolean isAntiFalsingNeeded() {
- return false;
- }
-
- @Override
- public float getFalsingThresholdFactor() {
- return 1.0f;
- }
-
- public void dismissChild(View v) {
- mSwipeHelper.dismissChild(v, 0);
- }
-
- public void onChildDismissed(View v) {
- addToRecycledViews(v);
- mLinearLayout.removeView(v);
- mCallback.handleSwipe(v);
- // Restore the alpha/translation parameters to what they were before swiping
- // (for when these items are recycled)
- View contentView = getChildContentView(v);
- contentView.setAlpha(1f);
- contentView.setTranslationY(0);
- }
-
- public void onBeginDrag(View v) {
- // We do this so the underlying ScrollView knows that it won't get
- // the chance to intercept events anymore
- requestDisallowInterceptTouchEvent(true);
- }
-
- public void onDragCancelled(View v) {
- }
-
- @Override
- public void onChildSnappedBack(View animView) {
- }
-
- @Override
- public boolean updateSwipeProgress(View animView, boolean dismissable, float swipeProgress) {
- return false;
- }
-
- public View getChildAtPosition(MotionEvent ev) {
- final float x = ev.getX() + getScrollX();
- final float y = ev.getY() + getScrollY();
- for (int i = 0; i < mLinearLayout.getChildCount(); i++) {
- View item = mLinearLayout.getChildAt(i);
- if (x >= item.getLeft() && x < item.getRight()
- && y >= item.getTop() && y < item.getBottom()) {
- return item;
- }
- }
- return null;
- }
-
- public View getChildContentView(View v) {
- return v.findViewById(R.id.recent_item);
- }
-
- @Override
- public void drawFadedEdges(Canvas canvas, int left, int right, int top, int bottom) {
- if (mFadedEdgeDrawHelper != null) {
-
- mFadedEdgeDrawHelper.drawCallback(canvas,
- left, right, top, bottom, getScrollX(), getScrollY(),
- 0, 0,
- getLeftFadingEdgeStrength(), getRightFadingEdgeStrength(), getPaddingTop());
- }
- }
-
- @Override
- protected void onScrollChanged(int l, int t, int oldl, int oldt) {
- super.onScrollChanged(l, t, oldl, oldt);
- if (mOnScrollListener != null) {
- mOnScrollListener.run();
- }
- }
-
- public void setOnScrollListener(Runnable listener) {
- mOnScrollListener = listener;
- }
-
- @Override
- public int getVerticalFadingEdgeLength() {
- if (mFadedEdgeDrawHelper != null) {
- return mFadedEdgeDrawHelper.getVerticalFadingEdgeLength();
- } else {
- return super.getVerticalFadingEdgeLength();
- }
- }
-
- @Override
- public int getHorizontalFadingEdgeLength() {
- if (mFadedEdgeDrawHelper != null) {
- return mFadedEdgeDrawHelper.getHorizontalFadingEdgeLength();
- } else {
- return super.getHorizontalFadingEdgeLength();
- }
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- setScrollbarFadingEnabled(true);
- mLinearLayout = (LinearLayout) findViewById(R.id.recents_linear_layout);
- final int leftPadding = getContext().getResources()
- .getDimensionPixelOffset(R.dimen.status_bar_recents_thumbnail_left_margin);
- setOverScrollEffectPadding(leftPadding, 0);
- }
-
- @Override
- public void onAttachedToWindow() {
- if (mFadedEdgeDrawHelper != null) {
- mFadedEdgeDrawHelper.onAttachedToWindowCallback(mLinearLayout, isHardwareAccelerated());
- }
- }
-
- @Override
- protected void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- float densityScale = getResources().getDisplayMetrics().density;
- mSwipeHelper.setDensityScale(densityScale);
- float pagingTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop();
- mSwipeHelper.setPagingTouchSlop(pagingTouchSlop);
- }
-
- private void setOverScrollEffectPadding(int leftPadding, int i) {
- // TODO Add to (Vertical)ScrollView
- }
-
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- super.onSizeChanged(w, h, oldw, oldh);
-
- // Skip this work if a transition is running; it sets the scroll values independently
- // and should not have those animated values clobbered by this logic
- LayoutTransition transition = mLinearLayout.getLayoutTransition();
- if (transition != null && transition.isRunning()) {
- return;
- }
- // Keep track of the last visible item in the list so we can restore it
- // to the bottom when the orientation changes.
- mLastScrollPosition = scrollPositionOfMostRecent();
-
- // This has to happen post-layout, so run it "in the future"
- post(new Runnable() {
- public void run() {
- // Make sure we're still not clobbering the transition-set values, since this
- // runnable launches asynchronously
- LayoutTransition transition = mLinearLayout.getLayoutTransition();
- if (transition == null || !transition.isRunning()) {
- scrollTo(mLastScrollPosition, 0);
- }
- }
- });
- }
-
- public void setAdapter(TaskDescriptionAdapter adapter) {
- mAdapter = adapter;
- mAdapter.registerDataSetObserver(new DataSetObserver() {
- public void onChanged() {
- update();
- }
-
- public void onInvalidated() {
- update();
- }
- });
- DisplayMetrics dm = getResources().getDisplayMetrics();
- int childWidthMeasureSpec =
- MeasureSpec.makeMeasureSpec(dm.widthPixels, MeasureSpec.AT_MOST);
- int childheightMeasureSpec =
- MeasureSpec.makeMeasureSpec(dm.heightPixels, MeasureSpec.AT_MOST);
- View child = mAdapter.createView(mLinearLayout);
- child.measure(childWidthMeasureSpec, childheightMeasureSpec);
- mNumItemsInOneScreenful =
- (int) Math.ceil(dm.widthPixels / (double) child.getMeasuredWidth());
- addToRecycledViews(child);
-
- for (int i = 0; i < mNumItemsInOneScreenful - 1; i++) {
- addToRecycledViews(mAdapter.createView(mLinearLayout));
- }
- }
-
- public int numItemsInOneScreenful() {
- return mNumItemsInOneScreenful;
- }
-
- @Override
- public void setLayoutTransition(LayoutTransition transition) {
- // The layout transition applies to our embedded LinearLayout
- mLinearLayout.setLayoutTransition(transition);
- }
-
- public void setCallback(RecentsCallback callback) {
- mCallback = callback;
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
deleted file mode 100644
index 4c3460e..0000000
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
+++ /dev/null
@@ -1,813 +0,0 @@
-/*
- * 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 com.android.systemui.recent;
-
-import android.animation.Animator;
-import android.animation.LayoutTransition;
-import android.animation.TimeInterpolator;
-import android.app.ActivityManager;
-import android.app.ActivityManagerNative;
-import android.app.ActivityOptions;
-import android.app.TaskStackBuilder;
-import android.content.ActivityNotFoundException;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Matrix;
-import android.graphics.Shader.TileMode;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.MenuItem;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewPropertyAnimator;
-import android.view.ViewRootImpl;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.animation.AnimationUtils;
-import android.view.animation.DecelerateInterpolator;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.BaseAdapter;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
-import android.widget.PopupMenu;
-import android.widget.TextView;
-
-import com.android.systemui.R;
-import com.android.systemui.statusbar.BaseStatusBar;
-import com.android.systemui.statusbar.StatusBarPanel;
-import com.android.systemui.statusbar.phone.PhoneStatusBar;
-
-import java.util.ArrayList;
-
-public class RecentsPanelView extends FrameLayout implements OnItemClickListener, RecentsCallback,
- StatusBarPanel, Animator.AnimatorListener {
- static final String TAG = "RecentsPanelView";
- static final boolean DEBUG = PhoneStatusBar.DEBUG || false;
- private PopupMenu mPopup;
- private View mRecentsScrim;
- private View mRecentsNoApps;
- private RecentsScrollView mRecentsContainer;
-
- private boolean mShowing;
- private boolean mWaitingToShow;
- private ViewHolder mItemToAnimateInWhenWindowAnimationIsFinished;
- private boolean mAnimateIconOfFirstTask;
- private boolean mWaitingForWindowAnimation;
- private long mWindowAnimationStartTime;
- private boolean mCallUiHiddenBeforeNextReload;
-
- private RecentTasksLoader mRecentTasksLoader;
- private ArrayList<TaskDescription> mRecentTaskDescriptions;
- private TaskDescriptionAdapter mListAdapter;
- private int mThumbnailWidth;
- private boolean mFitThumbnailToXY;
- private int mRecentItemLayoutId;
- private boolean mHighEndGfx;
-
- public static interface RecentsScrollView {
- public int numItemsInOneScreenful();
- public void setAdapter(TaskDescriptionAdapter adapter);
- public void setCallback(RecentsCallback callback);
- public void setMinSwipeAlpha(float minAlpha);
- public View findViewForTask(int persistentTaskId);
- public void drawFadedEdges(Canvas c, int left, int right, int top, int bottom);
- public void setOnScrollListener(Runnable listener);
- }
-
- private final class OnLongClickDelegate implements View.OnLongClickListener {
- View mOtherView;
- OnLongClickDelegate(View other) {
- mOtherView = other;
- }
- public boolean onLongClick(View v) {
- return mOtherView.performLongClick();
- }
- }
-
- /* package */ final static class ViewHolder {
- View thumbnailView;
- ImageView thumbnailViewImage;
- Drawable thumbnailViewDrawable;
- ImageView iconView;
- TextView labelView;
- TextView descriptionView;
- View calloutLine;
- TaskDescription taskDescription;
- boolean loadedThumbnailAndIcon;
- }
-
- /* package */ final class TaskDescriptionAdapter extends BaseAdapter {
- private LayoutInflater mInflater;
-
- public TaskDescriptionAdapter(Context context) {
- mInflater = LayoutInflater.from(context);
- }
-
- public int getCount() {
- return mRecentTaskDescriptions != null ? mRecentTaskDescriptions.size() : 0;
- }
-
- public Object getItem(int position) {
- return position; // we only need the index
- }
-
- public long getItemId(int position) {
- return position; // we just need something unique for this position
- }
-
- public View createView(ViewGroup parent) {
- View convertView = mInflater.inflate(mRecentItemLayoutId, parent, false);
- ViewHolder holder = new ViewHolder();
- holder.thumbnailView = convertView.findViewById(R.id.app_thumbnail);
- holder.thumbnailViewImage =
- (ImageView) convertView.findViewById(R.id.app_thumbnail_image);
- // If we set the default thumbnail now, we avoid an onLayout when we update
- // the thumbnail later (if they both have the same dimensions)
- updateThumbnail(holder, mRecentTasksLoader.getDefaultThumbnail(), false, false);
- holder.iconView = (ImageView) convertView.findViewById(R.id.app_icon);
- holder.iconView.setImageDrawable(mRecentTasksLoader.getDefaultIcon());
- holder.labelView = (TextView) convertView.findViewById(R.id.app_label);
- holder.calloutLine = convertView.findViewById(R.id.recents_callout_line);
- holder.descriptionView = (TextView) convertView.findViewById(R.id.app_description);
-
- convertView.setTag(holder);
- return convertView;
- }
-
- public View getView(int position, View convertView, ViewGroup parent) {
- if (convertView == null) {
- convertView = createView(parent);
- }
- final ViewHolder holder = (ViewHolder) convertView.getTag();
-
- // index is reverse since most recent appears at the bottom...
- final int index = mRecentTaskDescriptions.size() - position - 1;
-
- final TaskDescription td = mRecentTaskDescriptions.get(index);
-
- holder.labelView.setText(td.getLabel());
- holder.thumbnailView.setContentDescription(td.getLabel());
- holder.loadedThumbnailAndIcon = td.isLoaded();
- if (td.isLoaded()) {
- updateThumbnail(holder, td.getThumbnail(), true, false);
- updateIcon(holder, td.getIcon(), true, false);
- }
- if (index == 0) {
- if (mAnimateIconOfFirstTask) {
- ViewHolder oldHolder = mItemToAnimateInWhenWindowAnimationIsFinished;
- if (oldHolder != null) {
- oldHolder.iconView.setAlpha(1f);
- oldHolder.iconView.setTranslationX(0f);
- oldHolder.iconView.setTranslationY(0f);
- oldHolder.labelView.setAlpha(1f);
- oldHolder.labelView.setTranslationX(0f);
- oldHolder.labelView.setTranslationY(0f);
- if (oldHolder.calloutLine != null) {
- oldHolder.calloutLine.setAlpha(1f);
- oldHolder.calloutLine.setTranslationX(0f);
- oldHolder.calloutLine.setTranslationY(0f);
- }
- }
- mItemToAnimateInWhenWindowAnimationIsFinished = holder;
- int translation = -getResources().getDimensionPixelSize(
- R.dimen.status_bar_recents_app_icon_translate_distance);
- final Configuration config = getResources().getConfiguration();
- if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {
- if (getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
- translation = -translation;
- }
- holder.iconView.setAlpha(0f);
- holder.iconView.setTranslationX(translation);
- holder.labelView.setAlpha(0f);
- holder.labelView.setTranslationX(translation);
- holder.calloutLine.setAlpha(0f);
- holder.calloutLine.setTranslationX(translation);
- } else {
- holder.iconView.setAlpha(0f);
- holder.iconView.setTranslationY(translation);
- }
- if (!mWaitingForWindowAnimation) {
- animateInIconOfFirstTask();
- }
- }
- }
-
- holder.thumbnailView.setTag(td);
- holder.thumbnailView.setOnLongClickListener(new OnLongClickDelegate(convertView));
- holder.taskDescription = td;
- return convertView;
- }
-
- public void recycleView(View v) {
- ViewHolder holder = (ViewHolder) v.getTag();
- updateThumbnail(holder, mRecentTasksLoader.getDefaultThumbnail(), false, false);
- holder.iconView.setImageDrawable(mRecentTasksLoader.getDefaultIcon());
- holder.iconView.setVisibility(INVISIBLE);
- holder.iconView.animate().cancel();
- holder.labelView.setText(null);
- holder.labelView.animate().cancel();
- holder.thumbnailView.setContentDescription(null);
- holder.thumbnailView.setTag(null);
- holder.thumbnailView.setOnLongClickListener(null);
- holder.thumbnailView.setVisibility(INVISIBLE);
- holder.iconView.setAlpha(1f);
- holder.iconView.setTranslationX(0f);
- holder.iconView.setTranslationY(0f);
- holder.labelView.setAlpha(1f);
- holder.labelView.setTranslationX(0f);
- holder.labelView.setTranslationY(0f);
- if (holder.calloutLine != null) {
- holder.calloutLine.setAlpha(1f);
- holder.calloutLine.setTranslationX(0f);
- holder.calloutLine.setTranslationY(0f);
- holder.calloutLine.animate().cancel();
- }
- holder.taskDescription = null;
- holder.loadedThumbnailAndIcon = false;
- }
- }
-
- public RecentsPanelView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public RecentsPanelView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- updateValuesFromResources();
-
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RecentsPanelView,
- defStyle, 0);
-
- mRecentItemLayoutId = a.getResourceId(R.styleable.RecentsPanelView_recentItemLayout, 0);
- mRecentTasksLoader = RecentTasksLoader.getInstance(context);
- a.recycle();
- }
-
- public int numItemsInOneScreenful() {
- return mRecentsContainer.numItemsInOneScreenful();
- }
-
- private boolean pointInside(int x, int y, View v) {
- final int l = v.getLeft();
- final int r = v.getRight();
- final int t = v.getTop();
- final int b = v.getBottom();
- return x >= l && x < r && y >= t && y < b;
- }
-
- public boolean isInContentArea(int x, int y) {
- return pointInside(x, y, (View) mRecentsContainer);
- }
-
- public void show(boolean show) {
- show(show, null, false, false);
- }
-
- public void show(boolean show, ArrayList<TaskDescription> recentTaskDescriptions,
- boolean firstScreenful, boolean animateIconOfFirstTask) {
- if (show && mCallUiHiddenBeforeNextReload) {
- onUiHidden();
- recentTaskDescriptions = null;
- mAnimateIconOfFirstTask = false;
- mWaitingForWindowAnimation = false;
- } else {
- mAnimateIconOfFirstTask = animateIconOfFirstTask;
- mWaitingForWindowAnimation = animateIconOfFirstTask;
- }
- if (show) {
- mWaitingToShow = true;
- refreshRecentTasksList(recentTaskDescriptions, firstScreenful);
- showIfReady();
- } else {
- showImpl(false);
- }
- }
-
- private void showIfReady() {
- // mWaitingToShow => there was a touch up on the recents button
- // mRecentTaskDescriptions != null => we've created views for the first screenful of items
- if (mWaitingToShow && mRecentTaskDescriptions != null) {
- showImpl(true);
- }
- }
-
- static void sendCloseSystemWindows(Context context, String reason) {
- if (ActivityManagerNative.isSystemReady()) {
- try {
- ActivityManagerNative.getDefault().closeSystemDialogs(reason);
- } catch (RemoteException e) {
- }
- }
- }
-
- private void showImpl(boolean show) {
- sendCloseSystemWindows(getContext(), BaseStatusBar.SYSTEM_DIALOG_REASON_RECENT_APPS);
-
- mShowing = show;
-
- if (show) {
- // if there are no apps, bring up a "No recent apps" message
- boolean noApps = mRecentTaskDescriptions != null
- && (mRecentTaskDescriptions.size() == 0);
- mRecentsNoApps.setAlpha(1f);
- mRecentsNoApps.setVisibility(noApps ? View.VISIBLE : View.INVISIBLE);
-
- onAnimationEnd(null);
- setFocusable(true);
- setFocusableInTouchMode(true);
- requestFocus();
- } else {
- mWaitingToShow = false;
- // call onAnimationEnd() and clearRecentTasksList() in onUiHidden()
- mCallUiHiddenBeforeNextReload = true;
- if (mPopup != null) {
- mPopup.dismiss();
- }
- }
- }
-
- protected void onAttachedToWindow () {
- super.onAttachedToWindow();
- final ViewRootImpl root = getViewRootImpl();
- if (root != null) {
- root.setDrawDuringWindowsAnimating(true);
- }
- }
-
- public void onUiHidden() {
- mCallUiHiddenBeforeNextReload = false;
- if (!mShowing && mRecentTaskDescriptions != null) {
- onAnimationEnd(null);
- clearRecentTasksList();
- }
- }
-
- public void dismiss() {
- ((RecentsActivity) getContext()).dismissAndGoHome();
- }
-
- public void dismissAndGoBack() {
- ((RecentsActivity) getContext()).dismissAndGoBack();
- }
-
- public void onAnimationCancel(Animator animation) {
- }
-
- public void onAnimationEnd(Animator animation) {
- if (mShowing) {
- final LayoutTransition transitioner = new LayoutTransition();
- ((ViewGroup)mRecentsContainer).setLayoutTransition(transitioner);
- createCustomAnimations(transitioner);
- } else {
- ((ViewGroup)mRecentsContainer).setLayoutTransition(null);
- }
- }
-
- public void onAnimationRepeat(Animator animation) {
- }
-
- public void onAnimationStart(Animator animation) {
- }
-
- @Override
- public boolean dispatchHoverEvent(MotionEvent event) {
- // Ignore hover events outside of this panel bounds since such events
- // generate spurious accessibility events with the panel content when
- // tapping outside of it, thus confusing the user.
- final int x = (int) event.getX();
- final int y = (int) event.getY();
- if (x >= 0 && x < getWidth() && y >= 0 && y < getHeight()) {
- return super.dispatchHoverEvent(event);
- }
- return true;
- }
-
- /**
- * Whether the panel is showing, or, if it's animating, whether it will be
- * when the animation is done.
- */
- public boolean isShowing() {
- return mShowing;
- }
-
- public void setRecentTasksLoader(RecentTasksLoader loader) {
- mRecentTasksLoader = loader;
- }
-
- public void updateValuesFromResources() {
- final Resources res = getContext().getResources();
- mThumbnailWidth = Math.round(res.getDimension(R.dimen.status_bar_recents_thumbnail_width));
- mFitThumbnailToXY = res.getBoolean(R.bool.config_recents_thumbnail_image_fits_to_xy);
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
-
- mRecentsContainer = (RecentsScrollView) findViewById(R.id.recents_container);
- mRecentsContainer.setOnScrollListener(new Runnable() {
- public void run() {
- // need to redraw the faded edges
- invalidate();
- }
- });
- mListAdapter = new TaskDescriptionAdapter(getContext());
- mRecentsContainer.setAdapter(mListAdapter);
- mRecentsContainer.setCallback(this);
-
- mRecentsScrim = findViewById(R.id.recents_bg_protect);
- mRecentsNoApps = findViewById(R.id.recents_no_apps);
-
- if (mRecentsScrim != null) {
- mHighEndGfx = ActivityManager.isHighEndGfx();
- if (!mHighEndGfx) {
- mRecentsScrim.setBackground(null);
- } else if (mRecentsScrim.getBackground() instanceof BitmapDrawable) {
- // In order to save space, we make the background texture repeat in the Y direction
- ((BitmapDrawable) mRecentsScrim.getBackground()).setTileModeY(TileMode.REPEAT);
- }
- }
- }
-
- public void setMinSwipeAlpha(float minAlpha) {
- mRecentsContainer.setMinSwipeAlpha(minAlpha);
- }
-
- private void createCustomAnimations(LayoutTransition transitioner) {
- transitioner.setDuration(200);
- transitioner.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, 0);
- transitioner.setAnimator(LayoutTransition.DISAPPEARING, null);
- }
-
- private void updateIcon(ViewHolder h, Drawable icon, boolean show, boolean anim) {
- if (icon != null) {
- h.iconView.setImageDrawable(icon);
- if (show && h.iconView.getVisibility() != View.VISIBLE) {
- if (anim) {
- h.iconView.setAnimation(
- AnimationUtils.loadAnimation(getContext(), R.anim.recent_appear));
- }
- h.iconView.setVisibility(View.VISIBLE);
- }
- }
- }
-
- private void updateThumbnail(ViewHolder h, Drawable thumbnail, boolean show, boolean anim) {
- if (thumbnail != null) {
- // Should remove the default image in the frame
- // that this now covers, to improve scrolling speed.
- // That can't be done until the anim is complete though.
- h.thumbnailViewImage.setImageDrawable(thumbnail);
-
- // scale the image to fill the full width of the ImageView. do this only if
- // we haven't set a bitmap before, or if the bitmap size has changed
- if (h.thumbnailViewDrawable == null ||
- h.thumbnailViewDrawable.getIntrinsicWidth() != thumbnail.getIntrinsicWidth() ||
- h.thumbnailViewDrawable.getIntrinsicHeight() != thumbnail.getIntrinsicHeight()) {
- if (mFitThumbnailToXY) {
- h.thumbnailViewImage.setScaleType(ScaleType.FIT_XY);
- } else {
- Matrix scaleMatrix = new Matrix();
- float scale = mThumbnailWidth / (float) thumbnail.getIntrinsicWidth();
- scaleMatrix.setScale(scale, scale);
- h.thumbnailViewImage.setScaleType(ScaleType.MATRIX);
- h.thumbnailViewImage.setImageMatrix(scaleMatrix);
- }
- }
- if (show && h.thumbnailView.getVisibility() != View.VISIBLE) {
- if (anim) {
- h.thumbnailView.setAnimation(
- AnimationUtils.loadAnimation(getContext(), R.anim.recent_appear));
- }
- h.thumbnailView.setVisibility(View.VISIBLE);
- }
- h.thumbnailViewDrawable = thumbnail;
- }
- }
-
- void onTaskThumbnailLoaded(TaskDescription td) {
- synchronized (td) {
- if (mRecentsContainer != null) {
- ViewGroup container = (ViewGroup) mRecentsContainer;
- if (container instanceof RecentsScrollView) {
- container = (ViewGroup) container.findViewById(
- R.id.recents_linear_layout);
- }
- // Look for a view showing this thumbnail, to update.
- for (int i=0; i < container.getChildCount(); i++) {
- View v = container.getChildAt(i);
- if (v.getTag() instanceof ViewHolder) {
- ViewHolder h = (ViewHolder)v.getTag();
- if (!h.loadedThumbnailAndIcon && h.taskDescription == td) {
- // only fade in the thumbnail if recents is already visible-- we
- // show it immediately otherwise
- //boolean animateShow = mShowing &&
- // mRecentsContainer.getAlpha() > ViewConfiguration.ALPHA_THRESHOLD;
- boolean animateShow = false;
- updateIcon(h, td.getIcon(), true, animateShow);
- updateThumbnail(h, td.getThumbnail(), true, animateShow);
- h.loadedThumbnailAndIcon = true;
- }
- }
- }
- }
- }
- showIfReady();
- }
-
- private void animateInIconOfFirstTask() {
- if (mItemToAnimateInWhenWindowAnimationIsFinished != null &&
- !mRecentTasksLoader.isFirstScreenful()) {
- int timeSinceWindowAnimation =
- (int) (System.currentTimeMillis() - mWindowAnimationStartTime);
- final int minStartDelay = 150;
- final int startDelay = Math.max(0, Math.min(
- minStartDelay - timeSinceWindowAnimation, minStartDelay));
- final int duration = 250;
- final ViewHolder holder = mItemToAnimateInWhenWindowAnimationIsFinished;
- final TimeInterpolator cubic = new DecelerateInterpolator(1.5f);
- FirstFrameAnimatorHelper.initializeDrawListener(holder.iconView);
- for (View v :
- new View[] { holder.iconView, holder.labelView, holder.calloutLine }) {
- if (v != null) {
- ViewPropertyAnimator vpa = v.animate().translationX(0).translationY(0)
- .alpha(1f).setStartDelay(startDelay)
- .setDuration(duration).setInterpolator(cubic);
- FirstFrameAnimatorHelper h = new FirstFrameAnimatorHelper(vpa, v);
- }
- }
- mItemToAnimateInWhenWindowAnimationIsFinished = null;
- mAnimateIconOfFirstTask = false;
- }
- }
-
- public void onWindowAnimationStart() {
- mWaitingForWindowAnimation = false;
- mWindowAnimationStartTime = System.currentTimeMillis();
- animateInIconOfFirstTask();
- }
-
- public void clearRecentTasksList() {
- // Clear memory used by screenshots
- if (mRecentTaskDescriptions != null) {
- mRecentTasksLoader.cancelLoadingThumbnailsAndIcons(this);
- onTaskLoadingCancelled();
- }
- }
-
- public void onTaskLoadingCancelled() {
- // Gets called by RecentTasksLoader when it's cancelled
- if (mRecentTaskDescriptions != null) {
- mRecentTaskDescriptions = null;
- mListAdapter.notifyDataSetInvalidated();
- }
- }
-
- public void refreshViews() {
- mListAdapter.notifyDataSetInvalidated();
- updateUiElements();
- showIfReady();
- }
-
- public void refreshRecentTasksList() {
- refreshRecentTasksList(null, false);
- }
-
- private void refreshRecentTasksList(
- ArrayList<TaskDescription> recentTasksList, boolean firstScreenful) {
- if (mRecentTaskDescriptions == null && recentTasksList != null) {
- onTasksLoaded(recentTasksList, firstScreenful);
- } else {
- mRecentTasksLoader.loadTasksInBackground();
- }
- }
-
- public void onTasksLoaded(ArrayList<TaskDescription> tasks, boolean firstScreenful) {
- if (mRecentTaskDescriptions == null) {
- mRecentTaskDescriptions = new ArrayList<TaskDescription>(tasks);
- } else {
- mRecentTaskDescriptions.addAll(tasks);
- }
- if (((RecentsActivity) getContext()).isActivityShowing()) {
- refreshViews();
- }
- }
-
- private void updateUiElements() {
- final int items = mRecentTaskDescriptions != null
- ? mRecentTaskDescriptions.size() : 0;
-
- ((View) mRecentsContainer).setVisibility(items > 0 ? View.VISIBLE : View.GONE);
-
- // Set description for accessibility
- int numRecentApps = mRecentTaskDescriptions != null
- ? mRecentTaskDescriptions.size() : 0;
- String recentAppsAccessibilityDescription;
- if (numRecentApps == 0) {
- recentAppsAccessibilityDescription =
- getResources().getString(R.string.status_bar_no_recent_apps);
- } else {
- recentAppsAccessibilityDescription = getResources().getQuantityString(
- R.plurals.status_bar_accessibility_recent_apps, numRecentApps, numRecentApps);
- }
- setContentDescription(recentAppsAccessibilityDescription);
- }
-
- public boolean simulateClick(int persistentTaskId) {
- View v = mRecentsContainer.findViewForTask(persistentTaskId);
- if (v != null) {
- handleOnClick(v);
- return true;
- }
- return false;
- }
-
- public void handleOnClick(View view) {
- ViewHolder holder = (ViewHolder) view.getTag();
- TaskDescription ad = holder.taskDescription;
- final Context context = view.getContext();
- final ActivityManager am = (ActivityManager)
- context.getSystemService(Context.ACTIVITY_SERVICE);
-
- Bitmap bm = null;
- boolean usingDrawingCache = true;
- if (holder.thumbnailViewDrawable instanceof BitmapDrawable) {
- bm = ((BitmapDrawable) holder.thumbnailViewDrawable).getBitmap();
- if (bm.getWidth() == holder.thumbnailViewImage.getWidth() &&
- bm.getHeight() == holder.thumbnailViewImage.getHeight()) {
- usingDrawingCache = false;
- }
- }
- if (usingDrawingCache) {
- holder.thumbnailViewImage.setDrawingCacheEnabled(true);
- bm = holder.thumbnailViewImage.getDrawingCache();
- }
- Bundle opts = (bm == null) ?
- null :
- ActivityOptions.makeThumbnailScaleUpAnimation(
- holder.thumbnailViewImage, bm, 0, 0, null).toBundle();
-
- show(false);
- if (ad.taskId >= 0) {
- // This is an active task; it should just go to the foreground.
- am.moveTaskToFront(ad.taskId, ActivityManager.MOVE_TASK_WITH_HOME,
- opts);
- } else {
- Intent intent = ad.intent;
- intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
- | Intent.FLAG_ACTIVITY_TASK_ON_HOME
- | Intent.FLAG_ACTIVITY_NEW_TASK);
- if (DEBUG) Log.v(TAG, "Starting activity " + intent);
- try {
- context.startActivityAsUser(intent, opts,
- new UserHandle(ad.userId));
- } catch (SecurityException e) {
- Log.e(TAG, "Recents does not have the permission to launch " + intent, e);
- } catch (ActivityNotFoundException e) {
- Log.e(TAG, "Error launching activity " + intent, e);
- }
- }
- if (usingDrawingCache) {
- holder.thumbnailViewImage.setDrawingCacheEnabled(false);
- }
- }
-
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- handleOnClick(view);
- }
-
- public void handleSwipe(View view) {
- TaskDescription ad = ((ViewHolder) view.getTag()).taskDescription;
- if (ad == null) {
- Log.v(TAG, "Not able to find activity description for swiped task; view=" + view +
- " tag=" + view.getTag());
- return;
- }
- if (DEBUG) Log.v(TAG, "Jettison " + ad.getLabel());
- mRecentTaskDescriptions.remove(ad);
- mRecentTasksLoader.remove(ad);
-
- // Handled by widget containers to enable LayoutTransitions properly
- // mListAdapter.notifyDataSetChanged();
-
- if (mRecentTaskDescriptions.size() == 0) {
- dismissAndGoBack();
- }
-
- // Currently, either direction means the same thing, so ignore direction and remove
- // the task.
- final ActivityManager am = (ActivityManager)
- getContext().getSystemService(Context.ACTIVITY_SERVICE);
- if (am != null) {
- am.removeTask(ad.persistentTaskId);
-
- // Accessibility feedback
- setContentDescription(
- getContext().getString(R.string.accessibility_recents_item_dismissed, ad.getLabel()));
- sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
- setContentDescription(null);
- }
- }
-
- private void startApplicationDetailsActivity(String packageName, int userId) {
- Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
- Uri.fromParts("package", packageName, null));
- intent.setComponent(intent.resolveActivity(getContext().getPackageManager()));
- TaskStackBuilder.create(getContext())
- .addNextIntentWithParentStack(intent).startActivities(null, new UserHandle(userId));
- }
-
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- if (mPopup != null) {
- return true;
- } else {
- return super.onInterceptTouchEvent(ev);
- }
- }
-
- public void handleLongPress(
- final View selectedView, final View anchorView, final View thumbnailView) {
- thumbnailView.setSelected(true);
- final PopupMenu popup =
- new PopupMenu(getContext(), anchorView == null ? selectedView : anchorView);
- mPopup = popup;
- popup.getMenuInflater().inflate(R.menu.recent_popup_menu, popup.getMenu());
- popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
- public boolean onMenuItemClick(MenuItem item) {
- if (item.getItemId() == R.id.recent_remove_item) {
- ((ViewGroup) mRecentsContainer).removeViewInLayout(selectedView);
- } else if (item.getItemId() == R.id.recent_inspect_item) {
- ViewHolder viewHolder = (ViewHolder) selectedView.getTag();
- if (viewHolder != null) {
- final TaskDescription ad = viewHolder.taskDescription;
- startApplicationDetailsActivity(ad.packageName, ad.userId);
- show(false);
- } else {
- throw new IllegalStateException("Oops, no tag on view " + selectedView);
- }
- } else {
- return false;
- }
- return true;
- }
- });
- popup.setOnDismissListener(new PopupMenu.OnDismissListener() {
- public void onDismiss(PopupMenu menu) {
- thumbnailView.setSelected(false);
- mPopup = null;
- }
- });
- popup.show();
- }
-
- @Override
- protected void dispatchDraw(Canvas canvas) {
- super.dispatchDraw(canvas);
-
- int paddingLeft = getPaddingLeft();
- final boolean offsetRequired = isPaddingOffsetRequired();
- if (offsetRequired) {
- paddingLeft += getLeftPaddingOffset();
- }
-
- int left = getScrollX() + paddingLeft;
- int right = left + getRight() - getLeft() - getPaddingRight() - paddingLeft;
- int top = getScrollY() + getFadeTop(offsetRequired);
- int bottom = top + getFadeHeight(offsetRequired);
-
- if (offsetRequired) {
- right += getRightPaddingOffset();
- bottom += getBottomPaddingOffset();
- }
- mRecentsContainer.drawFadedEdges(canvas, left, right, top, bottom);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsPreloadReceiver.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsPreloadReceiver.java
deleted file mode 100644
index eb5892007..0000000
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsPreloadReceiver.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.recent;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-public class RecentsPreloadReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (RecentsActivity.PRELOAD_INTENT.equals(intent.getAction())) {
- RecentTasksLoader.getInstance(context).preloadRecentTasksList();
- } else if (RecentsActivity.CANCEL_PRELOAD_INTENT.equals(intent.getAction())){
- RecentTasksLoader.getInstance(context).cancelPreloadingRecentTasksList();
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
deleted file mode 100644
index d518f74..0000000
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- * 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 com.android.systemui.recent;
-
-import android.animation.LayoutTransition;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.database.DataSetObserver;
-import android.graphics.Canvas;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewTreeObserver;
-import android.view.ViewTreeObserver.OnGlobalLayoutListener;
-import android.widget.LinearLayout;
-import android.widget.ScrollView;
-
-import com.android.systemui.R;
-import com.android.systemui.SwipeHelper;
-import com.android.systemui.recent.RecentsPanelView.TaskDescriptionAdapter;
-
-import java.util.HashSet;
-import java.util.Iterator;
-
-public class RecentsVerticalScrollView extends ScrollView
- implements SwipeHelper.Callback, RecentsPanelView.RecentsScrollView {
- private static final String TAG = RecentsPanelView.TAG;
- private static final boolean DEBUG = RecentsPanelView.DEBUG;
- private LinearLayout mLinearLayout;
- private TaskDescriptionAdapter mAdapter;
- private RecentsCallback mCallback;
- protected int mLastScrollPosition;
- private SwipeHelper mSwipeHelper;
- private FadedEdgeDrawHelper mFadedEdgeDrawHelper;
- private HashSet<View> mRecycledViews;
- private int mNumItemsInOneScreenful;
- private Runnable mOnScrollListener;
-
- public RecentsVerticalScrollView(Context context, AttributeSet attrs) {
- super(context, attrs, 0);
- mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, context);
-
- mFadedEdgeDrawHelper = FadedEdgeDrawHelper.create(context, attrs, this, true);
- mRecycledViews = new HashSet<View>();
- }
-
- public void setMinSwipeAlpha(float minAlpha) {
- mSwipeHelper.setMinSwipeProgress(minAlpha);
- }
-
- private int scrollPositionOfMostRecent() {
- return mLinearLayout.getHeight() - getHeight() + getPaddingTop();
- }
-
- private void addToRecycledViews(View v) {
- if (mRecycledViews.size() < mNumItemsInOneScreenful) {
- mRecycledViews.add(v);
- }
- }
-
- public View findViewForTask(int persistentTaskId) {
- for (int i = 0; i < mLinearLayout.getChildCount(); i++) {
- View v = mLinearLayout.getChildAt(i);
- RecentsPanelView.ViewHolder holder = (RecentsPanelView.ViewHolder) v.getTag();
- if (holder.taskDescription.persistentTaskId == persistentTaskId) {
- return v;
- }
- }
- return null;
- }
-
- private void update() {
- for (int i = 0; i < mLinearLayout.getChildCount(); i++) {
- View v = mLinearLayout.getChildAt(i);
- addToRecycledViews(v);
- mAdapter.recycleView(v);
- }
- LayoutTransition transitioner = getLayoutTransition();
- setLayoutTransition(null);
-
- mLinearLayout.removeAllViews();
-
- // Once we can clear the data associated with individual item views,
- // we can get rid of the removeAllViews() and the code below will
- // recycle them.
- Iterator<View> recycledViews = mRecycledViews.iterator();
- for (int i = 0; i < mAdapter.getCount(); i++) {
- View old = null;
- if (recycledViews.hasNext()) {
- old = recycledViews.next();
- recycledViews.remove();
- old.setVisibility(VISIBLE);
- }
- final View view = mAdapter.getView(i, old, mLinearLayout);
-
- if (mFadedEdgeDrawHelper != null) {
- mFadedEdgeDrawHelper.addViewCallback(view);
- }
-
- OnTouchListener noOpListener = new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- return true;
- }
- };
-
- view.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- mCallback.dismiss();
- }
- });
- // We don't want a click sound when we dimiss recents
- view.setSoundEffectsEnabled(false);
-
- OnClickListener launchAppListener = new OnClickListener() {
- public void onClick(View v) {
- mCallback.handleOnClick(view);
- }
- };
-
- RecentsPanelView.ViewHolder holder = (RecentsPanelView.ViewHolder) view.getTag();
- final View thumbnailView = holder.thumbnailView;
- OnLongClickListener longClickListener = new OnLongClickListener() {
- public boolean onLongClick(View v) {
- final View anchorView = view.findViewById(R.id.app_description);
- mCallback.handleLongPress(view, anchorView, thumbnailView);
- return true;
- }
- };
- thumbnailView.setClickable(true);
- thumbnailView.setOnClickListener(launchAppListener);
- thumbnailView.setOnLongClickListener(longClickListener);
-
- // We don't want to dismiss recents if a user clicks on the app title
- // (we also don't want to launch the app either, though, because the
- // app title is a small target and doesn't have great click feedback)
- final View appTitle = view.findViewById(R.id.app_label);
- appTitle.setContentDescription(" ");
- appTitle.setOnTouchListener(noOpListener);
- final View calloutLine = view.findViewById(R.id.recents_callout_line);
- if (calloutLine != null) {
- calloutLine.setOnTouchListener(noOpListener);
- }
-
- mLinearLayout.addView(view);
- }
- setLayoutTransition(transitioner);
-
- // Scroll to end after initial layout.
- final OnGlobalLayoutListener updateScroll = new OnGlobalLayoutListener() {
- public void onGlobalLayout() {
- mLastScrollPosition = scrollPositionOfMostRecent();
- scrollTo(0, mLastScrollPosition);
- final ViewTreeObserver observer = getViewTreeObserver();
- if (observer.isAlive()) {
- observer.removeOnGlobalLayoutListener(this);
- }
- }
- };
- getViewTreeObserver().addOnGlobalLayoutListener(updateScroll);
- }
-
- @Override
- public void removeViewInLayout(final View view) {
- dismissChild(view);
- }
-
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- if (DEBUG) Log.v(TAG, "onInterceptTouchEvent()");
- return mSwipeHelper.onInterceptTouchEvent(ev) ||
- super.onInterceptTouchEvent(ev);
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- return mSwipeHelper.onTouchEvent(ev) ||
- super.onTouchEvent(ev);
- }
-
- public boolean canChildBeDismissed(View v) {
- return true;
- }
-
- @Override
- public boolean isAntiFalsingNeeded() {
- return false;
- }
-
- @Override
- public float getFalsingThresholdFactor() {
- return 1.0f;
- }
-
- public void dismissChild(View v) {
- mSwipeHelper.dismissChild(v, 0);
- }
-
- public void onChildDismissed(View v) {
- addToRecycledViews(v);
- mLinearLayout.removeView(v);
- mCallback.handleSwipe(v);
- // Restore the alpha/translation parameters to what they were before swiping
- // (for when these items are recycled)
- View contentView = getChildContentView(v);
- contentView.setAlpha(1f);
- contentView.setTranslationX(0);
- }
-
- public void onBeginDrag(View v) {
- // We do this so the underlying ScrollView knows that it won't get
- // the chance to intercept events anymore
- requestDisallowInterceptTouchEvent(true);
- }
-
- public void onDragCancelled(View v) {
- }
-
- @Override
- public void onChildSnappedBack(View animView) {
- }
-
- @Override
- public boolean updateSwipeProgress(View animView, boolean dismissable, float swipeProgress) {
- return false;
- }
-
- public View getChildAtPosition(MotionEvent ev) {
- final float x = ev.getX() + getScrollX();
- final float y = ev.getY() + getScrollY();
- for (int i = 0; i < mLinearLayout.getChildCount(); i++) {
- View item = mLinearLayout.getChildAt(i);
- if (item.getVisibility() == View.VISIBLE
- && x >= item.getLeft() && x < item.getRight()
- && y >= item.getTop() && y < item.getBottom()) {
- return item;
- }
- }
- return null;
- }
-
- public View getChildContentView(View v) {
- return v.findViewById(R.id.recent_item);
- }
-
- @Override
- public void drawFadedEdges(Canvas canvas, int left, int right, int top, int bottom) {
- if (mFadedEdgeDrawHelper != null) {
- final boolean offsetRequired = isPaddingOffsetRequired();
- mFadedEdgeDrawHelper.drawCallback(canvas,
- left, right, top + getFadeTop(offsetRequired), bottom, getScrollX(), getScrollY(),
- getTopFadingEdgeStrength(), getBottomFadingEdgeStrength(),
- 0, 0, getPaddingTop());
- }
- }
-
- @Override
- protected void onScrollChanged(int l, int t, int oldl, int oldt) {
- super.onScrollChanged(l, t, oldl, oldt);
- if (mOnScrollListener != null) {
- mOnScrollListener.run();
- }
- }
-
- public void setOnScrollListener(Runnable listener) {
- mOnScrollListener = listener;
- }
-
- @Override
- public int getVerticalFadingEdgeLength() {
- if (mFadedEdgeDrawHelper != null) {
- return mFadedEdgeDrawHelper.getVerticalFadingEdgeLength();
- } else {
- return super.getVerticalFadingEdgeLength();
- }
- }
-
- @Override
- public int getHorizontalFadingEdgeLength() {
- if (mFadedEdgeDrawHelper != null) {
- return mFadedEdgeDrawHelper.getHorizontalFadingEdgeLength();
- } else {
- return super.getHorizontalFadingEdgeLength();
- }
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- setScrollbarFadingEnabled(true);
- mLinearLayout = (LinearLayout) findViewById(R.id.recents_linear_layout);
- final int leftPadding = getContext().getResources()
- .getDimensionPixelOffset(R.dimen.status_bar_recents_thumbnail_left_margin);
- setOverScrollEffectPadding(leftPadding, 0);
- }
-
- @Override
- public void onAttachedToWindow() {
- if (mFadedEdgeDrawHelper != null) {
- mFadedEdgeDrawHelper.onAttachedToWindowCallback(mLinearLayout, isHardwareAccelerated());
- }
- }
-
- @Override
- protected void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- float densityScale = getResources().getDisplayMetrics().density;
- mSwipeHelper.setDensityScale(densityScale);
- float pagingTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop();
- mSwipeHelper.setPagingTouchSlop(pagingTouchSlop);
- }
-
- private void setOverScrollEffectPadding(int leftPadding, int i) {
- // TODO Add to (Vertical)ScrollView
- }
-
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- super.onSizeChanged(w, h, oldw, oldh);
-
- // Skip this work if a transition is running; it sets the scroll values independently
- // and should not have those animated values clobbered by this logic
- LayoutTransition transition = mLinearLayout.getLayoutTransition();
- if (transition != null && transition.isRunning()) {
- return;
- }
- // Keep track of the last visible item in the list so we can restore it
- // to the bottom when the orientation changes.
- mLastScrollPosition = scrollPositionOfMostRecent();
-
- // This has to happen post-layout, so run it "in the future"
- post(new Runnable() {
- public void run() {
- // Make sure we're still not clobbering the transition-set values, since this
- // runnable launches asynchronously
- LayoutTransition transition = mLinearLayout.getLayoutTransition();
- if (transition == null || !transition.isRunning()) {
- scrollTo(0, mLastScrollPosition);
- }
- }
- });
- }
-
- public void setAdapter(TaskDescriptionAdapter adapter) {
- mAdapter = adapter;
- mAdapter.registerDataSetObserver(new DataSetObserver() {
- public void onChanged() {
- update();
- }
-
- public void onInvalidated() {
- update();
- }
- });
-
- DisplayMetrics dm = getResources().getDisplayMetrics();
- int childWidthMeasureSpec =
- MeasureSpec.makeMeasureSpec(dm.widthPixels, MeasureSpec.AT_MOST);
- int childheightMeasureSpec =
- MeasureSpec.makeMeasureSpec(dm.heightPixels, MeasureSpec.AT_MOST);
- View child = mAdapter.createView(mLinearLayout);
- child.measure(childWidthMeasureSpec, childheightMeasureSpec);
- mNumItemsInOneScreenful =
- (int) Math.ceil(dm.heightPixels / (double) child.getMeasuredHeight());
- addToRecycledViews(child);
-
- for (int i = 0; i < mNumItemsInOneScreenful - 1; i++) {
- addToRecycledViews(mAdapter.createView(mLinearLayout));
- }
- }
-
- public int numItemsInOneScreenful() {
- return mNumItemsInOneScreenful;
- }
-
- @Override
- public void setLayoutTransition(LayoutTransition transition) {
- // The layout transition applies to our embedded LinearLayout
- mLinearLayout.setLayoutTransition(transition);
- }
-
- public void setCallback(RecentsCallback callback) {
- mCallback = callback;
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/ScreenPinningRequest.java b/packages/SystemUI/src/com/android/systemui/recent/ScreenPinningRequest.java
deleted file mode 100644
index 2fa0b58..0000000
--- a/packages/SystemUI/src/com/android/systemui/recent/ScreenPinningRequest.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.recent;
-
-import android.animation.ArgbEvaluator;
-import android.animation.ValueAnimator;
-import android.app.ActivityManager;
-import android.app.ActivityManagerNative;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Configuration;
-import android.graphics.PixelFormat;
-import android.graphics.drawable.ColorDrawable;
-import android.os.RemoteException;
-import android.util.DisplayMetrics;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.view.accessibility.AccessibilityManager;
-import android.view.animation.DecelerateInterpolator;
-import android.widget.Button;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.android.systemui.R;
-import com.android.systemui.recents.model.RecentsTaskLoader;
-
-import java.util.ArrayList;
-
-public class ScreenPinningRequest implements View.OnClickListener {
- private final Context mContext;
-
- private final AccessibilityManager mAccessibilityService;
- private final WindowManager mWindowManager;
-
- private RequestWindowView mRequestWindow;
-
- public ScreenPinningRequest(Context context) {
- mContext = context;
- mAccessibilityService = (AccessibilityManager)
- mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
- mWindowManager = (WindowManager)
- mContext.getSystemService(Context.WINDOW_SERVICE);
- }
-
- public void clearPrompt() {
- if (mRequestWindow != null) {
- mWindowManager.removeView(mRequestWindow);
- mRequestWindow = null;
- }
- }
-
- public void showPrompt(boolean allowCancel) {
- clearPrompt();
-
- mRequestWindow = new RequestWindowView(mContext, allowCancel);
-
- mRequestWindow.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
-
- // show the confirmation
- WindowManager.LayoutParams lp = getWindowLayoutParams();
- mWindowManager.addView(mRequestWindow, lp);
- }
-
- public void onConfigurationChanged() {
- if (mRequestWindow != null) {
- mRequestWindow.onConfigurationChanged();
- }
- }
-
- private WindowManager.LayoutParams getWindowLayoutParams() {
- final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT,
- WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
- 0
- | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
- | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
- ,
- PixelFormat.TRANSLUCENT);
- lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
- lp.setTitle("ScreenPinningConfirmation");
- lp.gravity = Gravity.FILL;
- return lp;
- }
-
- @Override
- public void onClick(View v) {
- if (v.getId() == R.id.screen_pinning_ok_button || mRequestWindow == v) {
- try {
- ActivityManagerNative.getDefault().startLockTaskModeOnCurrent();
- } catch (RemoteException e) {}
- }
- clearPrompt();
- }
-
- public FrameLayout.LayoutParams getRequestLayoutParams(boolean isLandscape) {
- return new FrameLayout.LayoutParams(
- ViewGroup.LayoutParams.WRAP_CONTENT,
- ViewGroup.LayoutParams.WRAP_CONTENT,
- isLandscape ? (Gravity.CENTER_VERTICAL | Gravity.RIGHT)
- : (Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM));
- }
-
- private class RequestWindowView extends FrameLayout {
- private static final int OFFSET_DP = 96;
-
- private final ColorDrawable mColor = new ColorDrawable(0);
- private ValueAnimator mColorAnim;
- private ViewGroup mLayout;
- private boolean mShowCancel;
-
- public RequestWindowView(Context context, boolean showCancel) {
- super(context);
- setClickable(true);
- setOnClickListener(ScreenPinningRequest.this);
- setBackground(mColor);
- mShowCancel = showCancel;
- }
-
- @Override
- public void onAttachedToWindow() {
- DisplayMetrics metrics = new DisplayMetrics();
- mWindowManager.getDefaultDisplay().getMetrics(metrics);
- float density = metrics.density;
- boolean isLandscape = isLandscapePhone(mContext);
-
- inflateView(isLandscape);
- int bgColor = mContext.getResources().getColor(
- R.color.screen_pinning_request_window_bg);
- if (ActivityManager.isHighEndGfx()) {
- mLayout.setAlpha(0f);
- if (isLandscape) {
- mLayout.setTranslationX(OFFSET_DP * density);
- } else {
- mLayout.setTranslationY(OFFSET_DP * density);
- }
- mLayout.animate()
- .alpha(1f)
- .translationX(0)
- .translationY(0)
- .setDuration(300)
- .setInterpolator(new DecelerateInterpolator())
- .start();
-
- mColorAnim = ValueAnimator.ofObject(new ArgbEvaluator(), 0, bgColor);
- mColorAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- final int c = (Integer) animation.getAnimatedValue();
- mColor.setColor(c);
- }
- });
- mColorAnim.setDuration(1000);
- mColorAnim.start();
- } else {
- mColor.setColor(bgColor);
- }
-
- IntentFilter filter = new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED);
- filter.addAction(Intent.ACTION_USER_SWITCHED);
- filter.addAction(Intent.ACTION_SCREEN_OFF);
- mContext.registerReceiver(mReceiver, filter);
- }
-
- private boolean isLandscapePhone(Context context) {
- Configuration config = mContext.getResources().getConfiguration();
- return config.orientation == Configuration.ORIENTATION_LANDSCAPE
- && config.smallestScreenWidthDp < 600;
- }
-
- private void inflateView(boolean isLandscape) {
- // We only want this landscape orientation on <600dp, so rather than handle
- // resource overlay for -land and -sw600dp-land, just inflate this
- // other view for this single case.
- mLayout = (ViewGroup) View.inflate(getContext(), isLandscape
- ? R.layout.screen_pinning_request_land_phone : R.layout.screen_pinning_request,
- null);
- // Catch touches so they don't trigger cancel/activate, like outside does.
- mLayout.setClickable(true);
- // Status bar is always on the right.
- mLayout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
- // Buttons and text do switch sides though.
- View buttons = mLayout.findViewById(R.id.screen_pinning_buttons);
- buttons.setLayoutDirection(View.LAYOUT_DIRECTION_LOCALE);
- mLayout.findViewById(R.id.screen_pinning_text_area)
- .setLayoutDirection(View.LAYOUT_DIRECTION_LOCALE);
- swapChildrenIfRtlAndVertical(buttons);
-
- ((Button) mLayout.findViewById(R.id.screen_pinning_ok_button))
- .setOnClickListener(ScreenPinningRequest.this);
- if (mShowCancel) {
- ((Button) mLayout.findViewById(R.id.screen_pinning_cancel_button))
- .setOnClickListener(ScreenPinningRequest.this);
- } else {
- ((Button) mLayout.findViewById(R.id.screen_pinning_cancel_button))
- .setVisibility(View.INVISIBLE);
- }
-
- final int description = mAccessibilityService.isEnabled()
- ? R.string.screen_pinning_description_accessible
- : R.string.screen_pinning_description;
- ((TextView) mLayout.findViewById(R.id.screen_pinning_description))
- .setText(description);
- final int backBgVisibility =
- mAccessibilityService.isEnabled() ? View.INVISIBLE : View.VISIBLE;
- mLayout.findViewById(R.id.screen_pinning_back_bg).setVisibility(backBgVisibility);
- mLayout.findViewById(R.id.screen_pinning_back_bg_light).setVisibility(backBgVisibility);
-
- addView(mLayout, getRequestLayoutParams(isLandscape));
- }
-
- private void swapChildrenIfRtlAndVertical(View group) {
- if (mContext.getResources().getConfiguration().getLayoutDirection()
- != View.LAYOUT_DIRECTION_RTL) {
- return;
- }
- LinearLayout linearLayout = (LinearLayout) group;
- if (linearLayout.getOrientation() == LinearLayout.VERTICAL) {
- int childCount = linearLayout.getChildCount();
- ArrayList<View> childList = new ArrayList<>(childCount);
- for (int i = 0; i < childCount; i++) {
- childList.add(linearLayout.getChildAt(i));
- }
- linearLayout.removeAllViews();
- for (int i = childCount - 1; i >= 0; i--) {
- linearLayout.addView(childList.get(i));
- }
- }
- }
-
- @Override
- public void onDetachedFromWindow() {
- mContext.unregisterReceiver(mReceiver);
- }
-
- protected void onConfigurationChanged() {
- removeAllViews();
- inflateView(isLandscapePhone(mContext));
- }
-
- private final Runnable mUpdateLayoutRunnable = new Runnable() {
- @Override
- public void run() {
- if (mLayout != null && mLayout.getParent() != null) {
- mLayout.setLayoutParams(getRequestLayoutParams(isLandscapePhone(mContext)));
- }
- }
- };
-
- private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
- post(mUpdateLayoutRunnable);
- } else if (intent.getAction().equals(Intent.ACTION_USER_SWITCHED)
- || intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
- clearPrompt();
- }
- }
- };
- }
-
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/TaskDescription.java b/packages/SystemUI/src/com/android/systemui/recent/TaskDescription.java
deleted file mode 100644
index 5ad965f..0000000
--- a/packages/SystemUI/src/com/android/systemui/recent/TaskDescription.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * 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 com.android.systemui.recent;
-
-import android.os.UserHandle;
-import android.content.Intent;
-import android.content.pm.ResolveInfo;
-import android.graphics.drawable.Drawable;
-
-public final class TaskDescription {
- final ResolveInfo resolveInfo;
- final int taskId; // application task id for curating apps
- final int persistentTaskId; // persistent id
- final Intent intent; // launch intent for application
- final String packageName; // used to override animations (see onClick())
- final CharSequence description;
- final int userId;
-
- private Drawable mThumbnail; // generated by Activity.onCreateThumbnail()
- private Drawable mIcon; // application package icon
- private CharSequence mLabel; // application package label
- private boolean mLoaded;
-
- public TaskDescription(int _taskId, int _persistentTaskId,
- ResolveInfo _resolveInfo, Intent _intent,
- String _packageName, CharSequence _description, int _userId) {
- resolveInfo = _resolveInfo;
- intent = _intent;
- taskId = _taskId;
- persistentTaskId = _persistentTaskId;
-
- description = _description;
- packageName = _packageName;
- userId = _userId;
- }
-
- public TaskDescription() {
- resolveInfo = null;
- intent = null;
- taskId = -1;
- persistentTaskId = -1;
-
- description = null;
- packageName = null;
- userId = UserHandle.USER_NULL;
- }
-
- public void setLoaded(boolean loaded) {
- mLoaded = loaded;
- }
-
- public boolean isLoaded() {
- return mLoaded;
- }
-
- public boolean isNull() {
- return resolveInfo == null;
- }
-
- // mark all these as locked?
- public CharSequence getLabel() {
- return mLabel;
- }
-
- public void setLabel(CharSequence label) {
- mLabel = label;
- }
-
- public Drawable getIcon() {
- return mIcon;
- }
-
- public void setIcon(Drawable icon) {
- mIcon = icon;
- }
-
- public void setThumbnail(Drawable thumbnail) {
- mThumbnail = thumbnail;
- }
-
- public Drawable getThumbnail() {
- return mThumbnail;
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
deleted file mode 100644
index 10618e0..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
+++ /dev/null
@@ -1,814 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.recents;
-
-import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.ActivityOptions;
-import android.app.ITaskStackListener;
-import android.appwidget.AppWidgetHost;
-import android.appwidget.AppWidgetProviderInfo;
-import android.content.ActivityNotFoundException;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.os.Handler;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.util.Pair;
-import android.view.LayoutInflater;
-import android.view.View;
-import com.android.systemui.R;
-import com.android.systemui.RecentsComponent;
-import com.android.systemui.recents.misc.Console;
-import com.android.systemui.recents.misc.SystemServicesProxy;
-import com.android.systemui.recents.model.RecentsTaskLoadPlan;
-import com.android.systemui.recents.model.RecentsTaskLoader;
-import com.android.systemui.recents.model.Task;
-import com.android.systemui.recents.model.TaskGrouping;
-import com.android.systemui.recents.model.TaskStack;
-import com.android.systemui.recents.views.TaskStackView;
-import com.android.systemui.recents.views.TaskStackViewLayoutAlgorithm;
-import com.android.systemui.recents.views.TaskViewHeader;
-import com.android.systemui.recents.views.TaskViewTransform;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * Annotation for a method that is only called from the primary user's SystemUI process and will be
- * proxied to the current user.
- */
-@interface ProxyFromPrimaryToCurrentUser {}
-/**
- * Annotation for a method that may be called from any user's SystemUI process and will be proxied
- * to the primary user.
- */
-@interface ProxyFromAnyToPrimaryUser {}
-
-/** A proxy implementation for the recents component */
-public class AlternateRecentsComponent implements ActivityOptions.OnAnimationStartedListener {
-
- final public static String EXTRA_TRIGGERED_FROM_ALT_TAB = "triggeredFromAltTab";
- final public static String EXTRA_TRIGGERED_FROM_HOME_KEY = "triggeredFromHomeKey";
- final public static String EXTRA_RECENTS_VISIBILITY = "recentsVisibility";
-
- // Owner proxy events
- final public static String ACTION_PROXY_NOTIFY_RECENTS_VISIBLITY_TO_OWNER =
- "action_notify_recents_visibility_change";
-
- final public static String ACTION_START_ENTER_ANIMATION = "action_start_enter_animation";
- final public static String ACTION_TOGGLE_RECENTS_ACTIVITY = "action_toggle_recents_activity";
- final public static String ACTION_HIDE_RECENTS_ACTIVITY = "action_hide_recents_activity";
-
- final static int sMinToggleDelay = 350;
-
- final static String sToggleRecentsAction = "com.android.systemui.recents.SHOW_RECENTS";
- final static String sRecentsPackage = "com.android.systemui";
- final static String sRecentsActivity = "com.android.systemui.recents.RecentsActivity";
-
- /**
- * An implementation of ITaskStackListener, that allows us to listen for changes to the system
- * task stacks and update recents accordingly.
- */
- class TaskStackListenerImpl extends ITaskStackListener.Stub implements Runnable {
- Handler mHandler;
-
- public TaskStackListenerImpl(Handler handler) {
- mHandler = handler;
- }
-
- @Override
- public void onTaskStackChanged() {
- // Debounce any task stack changes
- mHandler.removeCallbacks(this);
- mHandler.post(this);
- }
-
- /** Preloads the next task */
- public void run() {
- RecentsConfiguration config = RecentsConfiguration.getInstance();
- if (config.svelteLevel == RecentsConfiguration.SVELTE_NONE) {
- ActivityManager.RunningTaskInfo runningTaskInfo = getTopMostTask();
-
- // Load the next task only if we aren't svelte
- RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
- RecentsTaskLoadPlan plan = loader.createLoadPlan(mContext);
- loader.preloadTasks(plan, true /* isTopTaskHome */);
- RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options();
- // This callback is made when a new activity is launched and the old one is paused
- // so ignore the current activity and try and preload the thumbnail for the
- // previous one.
- if (runningTaskInfo != null) {
- launchOpts.runningTaskId = runningTaskInfo.id;
- }
- launchOpts.numVisibleTasks = 2;
- launchOpts.numVisibleTaskThumbnails = 2;
- launchOpts.onlyLoadForCache = true;
- launchOpts.onlyLoadPausedActivities = true;
- loader.loadTasks(mContext, plan, launchOpts);
- }
- }
- }
-
- /**
- * A proxy for Recents events which happens strictly for the owner.
- */
- class RecentsOwnerEventProxyReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- switch (intent.getAction()) {
- case ACTION_PROXY_NOTIFY_RECENTS_VISIBLITY_TO_OWNER:
- visibilityChanged(intent.getBooleanExtra(EXTRA_RECENTS_VISIBILITY, false));
- break;
- }
- }
- }
-
- static RecentsComponent.Callbacks sRecentsComponentCallbacks;
- static RecentsTaskLoadPlan sInstanceLoadPlan;
-
- Context mContext;
- LayoutInflater mInflater;
- SystemServicesProxy mSystemServicesProxy;
- Handler mHandler;
- TaskStackListenerImpl mTaskStackListener;
- RecentsOwnerEventProxyReceiver mProxyBroadcastReceiver;
- boolean mBootCompleted;
- boolean mStartAnimationTriggered;
- boolean mCanReuseTaskStackViews = true;
-
- // Task launching
- RecentsConfiguration mConfig;
- Rect mWindowRect = new Rect();
- Rect mTaskStackBounds = new Rect();
- Rect mSystemInsets = new Rect();
- TaskViewTransform mTmpTransform = new TaskViewTransform();
- int mStatusBarHeight;
- int mNavBarHeight;
- int mNavBarWidth;
-
- // Header (for transition)
- TaskViewHeader mHeaderBar;
- TaskStackView mDummyStackView;
-
- // Variables to keep track of if we need to start recents after binding
- boolean mTriggeredFromAltTab;
- long mLastToggleTime;
-
- public AlternateRecentsComponent(Context context) {
- RecentsTaskLoader.initialize(context);
- mInflater = LayoutInflater.from(context);
- mContext = context;
- mSystemServicesProxy = new SystemServicesProxy(context);
- mHandler = new Handler();
- mTaskStackBounds = new Rect();
-
- // Register the task stack listener
- mTaskStackListener = new TaskStackListenerImpl(mHandler);
- mSystemServicesProxy.registerTaskStackListener(mTaskStackListener);
-
- // Only the owner has the callback to update the SysUI visibility flags, so all non-owner
- // instances of AlternateRecentsComponent needs to notify the owner when the visibility
- // changes.
- if (mSystemServicesProxy.isForegroundUserOwner()) {
- mProxyBroadcastReceiver = new RecentsOwnerEventProxyReceiver();
- IntentFilter filter = new IntentFilter();
- filter.addAction(AlternateRecentsComponent.ACTION_PROXY_NOTIFY_RECENTS_VISIBLITY_TO_OWNER);
- mContext.registerReceiverAsUser(mProxyBroadcastReceiver, UserHandle.CURRENT, filter,
- null, mHandler);
- }
- }
-
- /** Creates a new broadcast intent */
- static Intent createLocalBroadcastIntent(Context context, String action) {
- Intent intent = new Intent(action);
- intent.setPackage(context.getPackageName());
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT |
- Intent.FLAG_RECEIVER_FOREGROUND);
- return intent;
- }
-
- /** Initializes the Recents. */
- @ProxyFromPrimaryToCurrentUser
- public void onStart() {
- // Initialize some static datastructures
- TaskStackViewLayoutAlgorithm.initializeCurve();
- // Load the header bar layout
- reloadHeaderBarLayout(true);
-
- // When we start, preload the data associated with the previous recent tasks.
- // We can use a new plan since the caches will be the same.
- RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
- RecentsTaskLoadPlan plan = loader.createLoadPlan(mContext);
- loader.preloadTasks(plan, true /* isTopTaskHome */);
- RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options();
- launchOpts.numVisibleTasks = loader.getApplicationIconCacheSize();
- launchOpts.numVisibleTaskThumbnails = loader.getThumbnailCacheSize();
- launchOpts.onlyLoadForCache = true;
- loader.loadTasks(mContext, plan, launchOpts);
- }
-
- public void onBootCompleted() {
- mBootCompleted = true;
- }
-
- /** Shows the Recents. */
- @ProxyFromPrimaryToCurrentUser
- public void onShowRecents(boolean triggeredFromAltTab) {
- if (mSystemServicesProxy.isForegroundUserOwner()) {
- showRecents(triggeredFromAltTab);
- } else {
- Intent intent = createLocalBroadcastIntent(mContext,
- RecentsUserEventProxyReceiver.ACTION_PROXY_SHOW_RECENTS_TO_USER);
- intent.putExtra(EXTRA_TRIGGERED_FROM_ALT_TAB, triggeredFromAltTab);
- mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
- }
- }
- void showRecents(boolean triggeredFromAltTab) {
- mTriggeredFromAltTab = triggeredFromAltTab;
-
- try {
- startRecentsActivity();
- } catch (ActivityNotFoundException e) {
- Console.logRawError("Failed to launch RecentAppsIntent", e);
- }
- }
-
- /** Hides the Recents. */
- @ProxyFromPrimaryToCurrentUser
- public void onHideRecents(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) {
- if (mSystemServicesProxy.isForegroundUserOwner()) {
- hideRecents(triggeredFromAltTab, triggeredFromHomeKey);
- } else {
- Intent intent = createLocalBroadcastIntent(mContext,
- RecentsUserEventProxyReceiver.ACTION_PROXY_HIDE_RECENTS_TO_USER);
- intent.putExtra(EXTRA_TRIGGERED_FROM_ALT_TAB, triggeredFromAltTab);
- intent.putExtra(EXTRA_TRIGGERED_FROM_HOME_KEY, triggeredFromHomeKey);
- mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
- }
- }
- void hideRecents(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) {
- if (mBootCompleted) {
- ActivityManager.RunningTaskInfo topTask = getTopMostTask();
- if (topTask != null && isRecentsTopMost(topTask, null)) {
- // Notify recents to hide itself
- Intent intent = createLocalBroadcastIntent(mContext, ACTION_HIDE_RECENTS_ACTIVITY);
- intent.putExtra(EXTRA_TRIGGERED_FROM_ALT_TAB, triggeredFromAltTab);
- intent.putExtra(EXTRA_TRIGGERED_FROM_HOME_KEY, triggeredFromHomeKey);
- mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
- }
- }
- }
-
- /** Toggles the Recents activity. */
- @ProxyFromPrimaryToCurrentUser
- public void onToggleRecents() {
- if (mSystemServicesProxy.isForegroundUserOwner()) {
- toggleRecents();
- } else {
- Intent intent = createLocalBroadcastIntent(mContext,
- RecentsUserEventProxyReceiver.ACTION_PROXY_TOGGLE_RECENTS_TO_USER);
- mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
- }
- }
- void toggleRecents() {
- mTriggeredFromAltTab = false;
-
- try {
- toggleRecentsActivity();
- } catch (ActivityNotFoundException e) {
- Console.logRawError("Failed to launch RecentAppsIntent", e);
- }
- }
-
- /** Preloads info for the Recents activity. */
- @ProxyFromPrimaryToCurrentUser
- public void onPreloadRecents() {
- if (mSystemServicesProxy.isForegroundUserOwner()) {
- preloadRecents();
- } else {
- Intent intent = createLocalBroadcastIntent(mContext,
- RecentsUserEventProxyReceiver.ACTION_PROXY_PRELOAD_RECENTS_TO_USER);
- mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
- }
- }
- void preloadRecents() {
- // Preload only the raw task list into a new load plan (which will be consumed by the
- // RecentsActivity)
- RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
- sInstanceLoadPlan = loader.createLoadPlan(mContext);
- sInstanceLoadPlan.preloadRawTasks(true);
- }
-
- public void onCancelPreloadingRecents() {
- // Do nothing
- }
-
- void showRelativeAffiliatedTask(boolean showNextTask) {
- RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
- RecentsTaskLoadPlan plan = loader.createLoadPlan(mContext);
- loader.preloadTasks(plan, true /* isTopTaskHome */);
- TaskStack stack = plan.getTaskStack();
-
- // Return early if there are no tasks
- if (stack.getTaskCount() == 0) return;
-
- ActivityManager.RunningTaskInfo runningTask = getTopMostTask();
- // Return early if there is no running task (can't determine affiliated tasks in this case)
- if (runningTask == null) return;
- // Return early if the running task is in the home stack (optimization)
- if (mSystemServicesProxy.isInHomeStack(runningTask.id)) return;
-
- // Find the task in the recents list
- ArrayList<Task> tasks = stack.getTasks();
- Task toTask = null;
- ActivityOptions launchOpts = null;
- int taskCount = tasks.size();
- int numAffiliatedTasks = 0;
- for (int i = 0; i < taskCount; i++) {
- Task task = tasks.get(i);
- if (task.key.id == runningTask.id) {
- TaskGrouping group = task.group;
- Task.TaskKey toTaskKey;
- if (showNextTask) {
- toTaskKey = group.getNextTaskInGroup(task);
- launchOpts = ActivityOptions.makeCustomAnimation(mContext,
- R.anim.recents_launch_next_affiliated_task_target,
- R.anim.recents_launch_next_affiliated_task_source);
- } else {
- toTaskKey = group.getPrevTaskInGroup(task);
- launchOpts = ActivityOptions.makeCustomAnimation(mContext,
- R.anim.recents_launch_prev_affiliated_task_target,
- R.anim.recents_launch_prev_affiliated_task_source);
- }
- if (toTaskKey != null) {
- toTask = stack.findTaskWithId(toTaskKey.id);
- }
- numAffiliatedTasks = group.getTaskCount();
- break;
- }
- }
-
- // Return early if there is no next task
- if (toTask == null) {
- if (numAffiliatedTasks > 1) {
- if (showNextTask) {
- mSystemServicesProxy.startInPlaceAnimationOnFrontMostApplication(
- ActivityOptions.makeCustomInPlaceAnimation(mContext,
- R.anim.recents_launch_next_affiliated_task_bounce));
- } else {
- mSystemServicesProxy.startInPlaceAnimationOnFrontMostApplication(
- ActivityOptions.makeCustomInPlaceAnimation(mContext,
- R.anim.recents_launch_prev_affiliated_task_bounce));
- }
- }
- return;
- }
-
- // Launch the task
- if (toTask.isActive) {
- // Bring an active task to the foreground
- mSystemServicesProxy.moveTaskToFront(toTask.key.id, launchOpts);
- } else {
- mSystemServicesProxy.startActivityFromRecents(mContext, toTask.key.id,
- toTask.activityLabel, launchOpts);
- }
- }
-
- public void onShowNextAffiliatedTask() {
- showRelativeAffiliatedTask(true);
- }
-
- public void onShowPrevAffiliatedTask() {
- showRelativeAffiliatedTask(false);
- }
-
- /** Updates on configuration change. */
- @ProxyFromPrimaryToCurrentUser
- public void onConfigurationChanged(Configuration newConfig) {
- if (mSystemServicesProxy.isForegroundUserOwner()) {
- configurationChanged();
- } else {
- Intent intent = createLocalBroadcastIntent(mContext,
- RecentsUserEventProxyReceiver.ACTION_PROXY_CONFIG_CHANGE_TO_USER);
- mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
- }
- }
- void configurationChanged() {
- // Don't reuse task stack views if the configuration changes
- mCanReuseTaskStackViews = false;
- // Reload the header bar layout
- reloadHeaderBarLayout(false);
- }
-
- /** Prepares the header bar layout. */
- void reloadHeaderBarLayout(boolean reloadWidget) {
- Resources res = mContext.getResources();
- mWindowRect = mSystemServicesProxy.getWindowRect();
- mStatusBarHeight = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height);
- mNavBarHeight = res.getDimensionPixelSize(com.android.internal.R.dimen.navigation_bar_height);
- mNavBarWidth = res.getDimensionPixelSize(com.android.internal.R.dimen.navigation_bar_width);
- mConfig = RecentsConfiguration.reinitialize(mContext, mSystemServicesProxy);
- mConfig.updateOnConfigurationChange();
- if (reloadWidget) {
- // Reload the widget id before we get the task stack bounds
- reloadSearchBarAppWidget(mContext, mSystemServicesProxy);
- }
- mConfig.getTaskStackBounds(mWindowRect.width(), mWindowRect.height(), mStatusBarHeight,
- (mConfig.hasTransposedNavBar ? mNavBarWidth : 0), mTaskStackBounds);
- if (mConfig.isLandscape && mConfig.hasTransposedNavBar) {
- mSystemInsets.set(0, mStatusBarHeight, mNavBarWidth, 0);
- } else {
- mSystemInsets.set(0, mStatusBarHeight, 0, mNavBarHeight);
- }
-
- // Inflate the header bar layout so that we can rebind and draw it for the transition
- TaskStack stack = new TaskStack();
- mDummyStackView = new TaskStackView(mContext, stack);
- TaskStackViewLayoutAlgorithm algo = mDummyStackView.getStackAlgorithm();
- Rect taskStackBounds = new Rect(mTaskStackBounds);
- taskStackBounds.bottom -= mSystemInsets.bottom;
- algo.computeRects(mWindowRect.width(), mWindowRect.height(), taskStackBounds);
- Rect taskViewSize = algo.getUntransformedTaskViewSize();
- int taskBarHeight = res.getDimensionPixelSize(R.dimen.recents_task_bar_height);
- mHeaderBar = (TaskViewHeader) mInflater.inflate(R.layout.recents_task_view_header, null,
- false);
- mHeaderBar.measure(
- View.MeasureSpec.makeMeasureSpec(taskViewSize.width(), View.MeasureSpec.EXACTLY),
- View.MeasureSpec.makeMeasureSpec(taskBarHeight, View.MeasureSpec.EXACTLY));
- mHeaderBar.layout(0, 0, taskViewSize.width(), taskBarHeight);
- }
-
- /** Prepares the search bar app widget */
- void reloadSearchBarAppWidget(Context context, SystemServicesProxy ssp) {
- // Try and pre-emptively bind the search widget on startup to ensure that we
- // have the right thumbnail bounds to animate to.
- if (Constants.DebugFlags.App.EnableSearchLayout) {
- // If there is no id, then bind a new search app widget
- if (mConfig.searchBarAppWidgetId < 0) {
- AppWidgetHost host = new RecentsAppWidgetHost(context,
- Constants.Values.App.AppWidgetHostId);
- Pair<Integer, AppWidgetProviderInfo> widgetInfo = ssp.bindSearchAppWidget(host);
- if (widgetInfo != null) {
- // Save the app widget id into the settings
- mConfig.updateSearchBarAppWidgetId(context, widgetInfo.first);
- }
- }
- }
- }
-
- /** Gets the top task. */
- ActivityManager.RunningTaskInfo getTopMostTask() {
- SystemServicesProxy ssp = mSystemServicesProxy;
- List<ActivityManager.RunningTaskInfo> tasks = ssp.getRunningTasks(1);
- if (!tasks.isEmpty()) {
- return tasks.get(0);
- }
- return null;
- }
-
- /** Returns whether the recents is currently running */
- boolean isRecentsTopMost(ActivityManager.RunningTaskInfo topTask, AtomicBoolean isHomeTopMost) {
- SystemServicesProxy ssp = mSystemServicesProxy;
- if (topTask != null) {
- ComponentName topActivity = topTask.topActivity;
-
- // Check if the front most activity is recents
- if (topActivity.getPackageName().equals(sRecentsPackage) &&
- topActivity.getClassName().equals(sRecentsActivity)) {
- if (isHomeTopMost != null) {
- isHomeTopMost.set(false);
- }
- return true;
- }
-
- if (isHomeTopMost != null) {
- isHomeTopMost.set(ssp.isInHomeStack(topTask.id));
- }
- }
- return false;
- }
-
- /** Toggles the recents activity */
- void toggleRecentsActivity() {
- // If the user has toggled it too quickly, then just eat up the event here (it's better than
- // showing a janky screenshot).
- // NOTE: Ideally, the screenshot mechanism would take the window transform into account
- if ((SystemClock.elapsedRealtime() - mLastToggleTime) < sMinToggleDelay) {
- return;
- }
-
- // If Recents is the front most activity, then we should just communicate with it directly
- // to launch the first task or dismiss itself
- ActivityManager.RunningTaskInfo topTask = getTopMostTask();
- AtomicBoolean isTopTaskHome = new AtomicBoolean(true);
- if (topTask != null && isRecentsTopMost(topTask, isTopTaskHome)) {
- // Notify recents to toggle itself
- Intent intent = createLocalBroadcastIntent(mContext, ACTION_TOGGLE_RECENTS_ACTIVITY);
- mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
- mLastToggleTime = SystemClock.elapsedRealtime();
- return;
- } else {
- // Otherwise, start the recents activity
- startRecentsActivity(topTask, isTopTaskHome.get());
- }
- }
-
- /** Starts the recents activity if it is not already running */
- void startRecentsActivity() {
- // Check if the top task is in the home stack, and start the recents activity
- ActivityManager.RunningTaskInfo topTask = getTopMostTask();
- AtomicBoolean isTopTaskHome = new AtomicBoolean(true);
- if (topTask == null || !isRecentsTopMost(topTask, isTopTaskHome)) {
- startRecentsActivity(topTask, isTopTaskHome.get());
- }
- }
-
- /**
- * Creates the activity options for a unknown state->recents transition.
- */
- ActivityOptions getUnknownTransitionActivityOptions() {
- mStartAnimationTriggered = false;
- return ActivityOptions.makeCustomAnimation(mContext,
- R.anim.recents_from_unknown_enter,
- R.anim.recents_from_unknown_exit,
- mHandler, this);
- }
-
- /**
- * Creates the activity options for a home->recents transition.
- */
- ActivityOptions getHomeTransitionActivityOptions(boolean fromSearchHome) {
- mStartAnimationTriggered = false;
- if (fromSearchHome) {
- return ActivityOptions.makeCustomAnimation(mContext,
- R.anim.recents_from_search_launcher_enter,
- R.anim.recents_from_search_launcher_exit,
- mHandler, this);
- }
- return ActivityOptions.makeCustomAnimation(mContext,
- R.anim.recents_from_launcher_enter,
- R.anim.recents_from_launcher_exit,
- mHandler, this);
- }
-
- /**
- * Creates the activity options for an app->recents transition.
- */
- ActivityOptions getThumbnailTransitionActivityOptions(ActivityManager.RunningTaskInfo topTask,
- TaskStack stack, TaskStackView stackView) {
- // Update the destination rect
- Task toTask = new Task();
- TaskViewTransform toTransform = getThumbnailTransitionTransform(stack, stackView,
- topTask.id, toTask);
- if (toTransform != null && toTask.key != null) {
- Rect toTaskRect = toTransform.rect;
- int toHeaderWidth = (int) (mHeaderBar.getMeasuredWidth() * toTransform.scale);
- int toHeaderHeight = (int) (mHeaderBar.getMeasuredHeight() * toTransform.scale);
- Bitmap thumbnail = Bitmap.createBitmap(toHeaderWidth, toHeaderHeight,
- Bitmap.Config.ARGB_8888);
- if (Constants.DebugFlags.App.EnableTransitionThumbnailDebugMode) {
- thumbnail.eraseColor(0xFFff0000);
- } else {
- Canvas c = new Canvas(thumbnail);
- c.scale(toTransform.scale, toTransform.scale);
- mHeaderBar.rebindToTask(toTask);
- mHeaderBar.draw(c);
- c.setBitmap(null);
- }
-
- mStartAnimationTriggered = false;
- return ActivityOptions.makeThumbnailAspectScaleDownAnimation(mDummyStackView,
- thumbnail, toTaskRect.left, toTaskRect.top, toTaskRect.width(),
- toTaskRect.height(), mHandler, this);
- }
-
- // If both the screenshot and thumbnail fails, then just fall back to the default transition
- return getUnknownTransitionActivityOptions();
- }
-
- /** Returns the transition rect for the given task id. */
- TaskViewTransform getThumbnailTransitionTransform(TaskStack stack, TaskStackView stackView,
- int runningTaskId, Task runningTaskOut) {
- // Find the running task in the TaskStack
- Task task = null;
- ArrayList<Task> tasks = stack.getTasks();
- if (runningTaskId != -1) {
- // Otherwise, try and find the task with the
- int taskCount = tasks.size();
- for (int i = taskCount - 1; i >= 0; i--) {
- Task t = tasks.get(i);
- if (t.key.id == runningTaskId) {
- task = t;
- runningTaskOut.copyFrom(t);
- break;
- }
- }
- }
- if (task == null) {
- // If no task is specified or we can not find the task just use the front most one
- task = tasks.get(tasks.size() - 1);
- }
-
- // Get the transform for the running task
- stackView.getScroller().setStackScrollToInitialState();
- mTmpTransform = stackView.getStackAlgorithm().getStackTransform(task,
- stackView.getScroller().getStackScroll(), mTmpTransform, null);
- return mTmpTransform;
- }
-
- /** Starts the recents activity */
- void startRecentsActivity(ActivityManager.RunningTaskInfo topTask, boolean isTopTaskHome) {
- if (sInstanceLoadPlan == null) {
- // Create a new load plan if onPreloadRecents() was never triggered
- RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
- sInstanceLoadPlan = loader.createLoadPlan(mContext);
- }
- RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
- loader.preloadTasks(sInstanceLoadPlan, isTopTaskHome);
- TaskStack stack = sInstanceLoadPlan.getTaskStack();
-
- // Prepare the dummy stack for the transition
- mDummyStackView.updateMinMaxScrollForStack(stack, mTriggeredFromAltTab, isTopTaskHome);
- TaskStackViewLayoutAlgorithm.VisibilityReport stackVr =
- mDummyStackView.computeStackVisibilityReport();
- boolean hasRecentTasks = stack.getTaskCount() > 0;
- boolean useThumbnailTransition = (topTask != null) && !isTopTaskHome && hasRecentTasks;
-
- if (useThumbnailTransition) {
- // Ensure that we load the running task's icon
- RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options();
- launchOpts.runningTaskId = topTask.id;
- launchOpts.loadThumbnails = false;
- launchOpts.onlyLoadForCache = true;
- loader.loadTasks(mContext, sInstanceLoadPlan, launchOpts);
-
- // Try starting with a thumbnail transition
- ActivityOptions opts = getThumbnailTransitionActivityOptions(topTask, stack,
- mDummyStackView);
- if (opts != null) {
- startAlternateRecentsActivity(topTask, opts, false /* fromHome */,
- false /* fromSearchHome */, true /* fromThumbnail */, stackVr);
- } else {
- // Fall through below to the non-thumbnail transition
- useThumbnailTransition = false;
- }
- }
-
- if (!useThumbnailTransition) {
- // If there is no thumbnail transition, but is launching from home into recents, then
- // use a quick home transition and do the animation from home
- if (hasRecentTasks) {
- // Get the home activity info
- String homeActivityPackage = mSystemServicesProxy.getHomeActivityPackageName();
- // Get the search widget info
- AppWidgetProviderInfo searchWidget = null;
- String searchWidgetPackage = null;
- if (mConfig.hasSearchBarAppWidget()) {
- searchWidget = mSystemServicesProxy.getAppWidgetInfo(
- mConfig.searchBarAppWidgetId);
- } else {
- searchWidget = mSystemServicesProxy.resolveSearchAppWidget();
- }
- if (searchWidget != null && searchWidget.provider != null) {
- searchWidgetPackage = searchWidget.provider.getPackageName();
- }
- // Determine whether we are coming from a search owned home activity
- boolean fromSearchHome = false;
- if (homeActivityPackage != null && searchWidgetPackage != null &&
- homeActivityPackage.equals(searchWidgetPackage)) {
- fromSearchHome = true;
- }
-
- ActivityOptions opts = getHomeTransitionActivityOptions(fromSearchHome);
- startAlternateRecentsActivity(topTask, opts, true /* fromHome */, fromSearchHome,
- false /* fromThumbnail */, stackVr);
- } else {
- // Otherwise we do the normal fade from an unknown source
- ActivityOptions opts = getUnknownTransitionActivityOptions();
- startAlternateRecentsActivity(topTask, opts, true /* fromHome */,
- false /* fromSearchHome */, false /* fromThumbnail */, stackVr);
- }
- }
- mLastToggleTime = SystemClock.elapsedRealtime();
- }
-
- /** Starts the recents activity */
- void startAlternateRecentsActivity(ActivityManager.RunningTaskInfo topTask,
- ActivityOptions opts, boolean fromHome, boolean fromSearchHome, boolean fromThumbnail,
- TaskStackViewLayoutAlgorithm.VisibilityReport vr) {
- // Update the configuration based on the launch options
- mConfig.launchedFromHome = fromSearchHome || fromHome;
- mConfig.launchedFromSearchHome = fromSearchHome;
- mConfig.launchedFromAppWithThumbnail = fromThumbnail;
- mConfig.launchedToTaskId = (topTask != null) ? topTask.id : -1;
- mConfig.launchedWithAltTab = mTriggeredFromAltTab;
- mConfig.launchedReuseTaskStackViews = mCanReuseTaskStackViews;
- mConfig.launchedNumVisibleTasks = vr.numVisibleTasks;
- mConfig.launchedNumVisibleThumbnails = vr.numVisibleThumbnails;
- mConfig.launchedHasConfigurationChanged = false;
-
- Intent intent = new Intent(sToggleRecentsAction);
- intent.setClassName(sRecentsPackage, sRecentsActivity);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
- if (opts != null) {
- mContext.startActivityAsUser(intent, opts.toBundle(), UserHandle.CURRENT);
- } else {
- mContext.startActivityAsUser(intent, UserHandle.CURRENT);
- }
- mCanReuseTaskStackViews = true;
- }
-
- /** Sets the RecentsComponent callbacks. */
- public void setRecentsComponentCallback(RecentsComponent.Callbacks cb) {
- sRecentsComponentCallbacks = cb;
- }
-
- /** Notifies the callbacks that the visibility of Recents has changed. */
- @ProxyFromAnyToPrimaryUser
- public static void notifyVisibilityChanged(Context context, SystemServicesProxy ssp,
- boolean visible) {
- if (ssp.isForegroundUserOwner()) {
- visibilityChanged(visible);
- } else {
- Intent intent = createLocalBroadcastIntent(context,
- ACTION_PROXY_NOTIFY_RECENTS_VISIBLITY_TO_OWNER);
- intent.putExtra(EXTRA_RECENTS_VISIBILITY, visible);
- context.sendBroadcastAsUser(intent, UserHandle.OWNER);
- }
- }
- static void visibilityChanged(boolean visible) {
- if (sRecentsComponentCallbacks != null) {
- sRecentsComponentCallbacks.onVisibilityChanged(visible);
- }
- }
-
- /**
- * Returns the preloaded load plan and invalidates it.
- */
- public static RecentsTaskLoadPlan consumeInstanceLoadPlan() {
- RecentsTaskLoadPlan plan = sInstanceLoadPlan;
- sInstanceLoadPlan = null;
- return plan;
- }
-
- /**** OnAnimationStartedListener Implementation ****/
-
- @Override
- public void onAnimationStarted() {
- // Notify recents to start the enter animation
- if (!mStartAnimationTriggered) {
- // There can be a race condition between the start animation callback and
- // the start of the new activity (where we register the receiver that listens
- // to this broadcast, so we add our own receiver and if that gets called, then
- // we know the activity has not yet started and we can retry sending the broadcast.
- BroadcastReceiver fallbackReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (getResultCode() == Activity.RESULT_OK) {
- mStartAnimationTriggered = true;
- return;
- }
-
- // Schedule for the broadcast to be sent again after some time
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- onAnimationStarted();
- }
- }, 25);
- }
- };
-
- // Send the broadcast to notify Recents that the animation has started
- Intent intent = createLocalBroadcastIntent(mContext, ACTION_START_ENTER_ANIMATION);
- mContext.sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT, null,
- fallbackReceiver, null, Activity.RESULT_CANCELED, null, null);
- }
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
new file mode 100644
index 0000000..7d7766b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
@@ -0,0 +1,850 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.recents;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.ActivityOptions;
+import android.app.ITaskStackListener;
+import android.appwidget.AppWidgetHost;
+import android.appwidget.AppWidgetProviderInfo;
+import android.content.ActivityNotFoundException;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.os.UserHandle;
+import android.util.Pair;
+import android.view.Display;
+import android.view.LayoutInflater;
+import android.view.View;
+import com.android.systemui.R;
+import com.android.systemui.RecentsComponent;
+import com.android.systemui.SystemUI;
+import com.android.systemui.recents.misc.Console;
+import com.android.systemui.recents.misc.SystemServicesProxy;
+import com.android.systemui.recents.model.RecentsTaskLoadPlan;
+import com.android.systemui.recents.model.RecentsTaskLoader;
+import com.android.systemui.recents.model.Task;
+import com.android.systemui.recents.model.TaskGrouping;
+import com.android.systemui.recents.model.TaskStack;
+import com.android.systemui.recents.views.TaskStackView;
+import com.android.systemui.recents.views.TaskStackViewLayoutAlgorithm;
+import com.android.systemui.recents.views.TaskViewHeader;
+import com.android.systemui.recents.views.TaskViewTransform;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Annotation for a method that is only called from the primary user's SystemUI process and will be
+ * proxied to the current user.
+ */
+@interface ProxyFromPrimaryToCurrentUser {}
+/**
+ * Annotation for a method that may be called from any user's SystemUI process and will be proxied
+ * to the primary user.
+ */
+@interface ProxyFromAnyToPrimaryUser {}
+
+/** A proxy implementation for the recents component */
+public class Recents extends SystemUI
+ implements ActivityOptions.OnAnimationStartedListener, RecentsComponent {
+
+ final public static String EXTRA_TRIGGERED_FROM_ALT_TAB = "triggeredFromAltTab";
+ final public static String EXTRA_TRIGGERED_FROM_HOME_KEY = "triggeredFromHomeKey";
+ final public static String EXTRA_RECENTS_VISIBILITY = "recentsVisibility";
+
+ // Owner proxy events
+ final public static String ACTION_PROXY_NOTIFY_RECENTS_VISIBLITY_TO_OWNER =
+ "action_notify_recents_visibility_change";
+
+ final public static String ACTION_START_ENTER_ANIMATION = "action_start_enter_animation";
+ final public static String ACTION_TOGGLE_RECENTS_ACTIVITY = "action_toggle_recents_activity";
+ final public static String ACTION_HIDE_RECENTS_ACTIVITY = "action_hide_recents_activity";
+
+ final static int sMinToggleDelay = 350;
+
+ final static String sToggleRecentsAction = "com.android.systemui.recents.SHOW_RECENTS";
+ final static String sRecentsPackage = "com.android.systemui";
+ final static String sRecentsActivity = "com.android.systemui.recents.RecentsActivity";
+
+ /**
+ * An implementation of ITaskStackListener, that allows us to listen for changes to the system
+ * task stacks and update recents accordingly.
+ */
+ class TaskStackListenerImpl extends ITaskStackListener.Stub implements Runnable {
+ Handler mHandler;
+
+ public TaskStackListenerImpl(Handler handler) {
+ mHandler = handler;
+ }
+
+ @Override
+ public void onTaskStackChanged() {
+ // Debounce any task stack changes
+ mHandler.removeCallbacks(this);
+ mHandler.post(this);
+ }
+
+ /** Preloads the next task */
+ public void run() {
+ RecentsConfiguration config = RecentsConfiguration.getInstance();
+ if (config.svelteLevel == RecentsConfiguration.SVELTE_NONE) {
+ ActivityManager.RunningTaskInfo runningTaskInfo = getTopMostTask();
+
+ // Load the next task only if we aren't svelte
+ RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
+ RecentsTaskLoadPlan plan = loader.createLoadPlan(mContext);
+ loader.preloadTasks(plan, true /* isTopTaskHome */);
+ RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options();
+ // This callback is made when a new activity is launched and the old one is paused
+ // so ignore the current activity and try and preload the thumbnail for the
+ // previous one.
+ if (runningTaskInfo != null) {
+ launchOpts.runningTaskId = runningTaskInfo.id;
+ }
+ launchOpts.numVisibleTasks = 2;
+ launchOpts.numVisibleTaskThumbnails = 2;
+ launchOpts.onlyLoadForCache = true;
+ launchOpts.onlyLoadPausedActivities = true;
+ loader.loadTasks(mContext, plan, launchOpts);
+ }
+ }
+ }
+
+ /**
+ * A proxy for Recents events which happens strictly for the owner.
+ */
+ class RecentsOwnerEventProxyReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ switch (intent.getAction()) {
+ case ACTION_PROXY_NOTIFY_RECENTS_VISIBLITY_TO_OWNER:
+ visibilityChanged(intent.getBooleanExtra(EXTRA_RECENTS_VISIBILITY, false));
+ break;
+ }
+ }
+ }
+
+ static RecentsComponent.Callbacks sRecentsComponentCallbacks;
+ static RecentsTaskLoadPlan sInstanceLoadPlan;
+ static Recents sInstance;
+
+ LayoutInflater mInflater;
+ SystemServicesProxy mSystemServicesProxy;
+ Handler mHandler;
+ TaskStackListenerImpl mTaskStackListener;
+ RecentsOwnerEventProxyReceiver mProxyBroadcastReceiver;
+ boolean mBootCompleted;
+ boolean mStartAnimationTriggered;
+ boolean mCanReuseTaskStackViews = true;
+
+ // Task launching
+ RecentsConfiguration mConfig;
+ Rect mWindowRect = new Rect();
+ Rect mTaskStackBounds = new Rect();
+ Rect mSystemInsets = new Rect();
+ TaskViewTransform mTmpTransform = new TaskViewTransform();
+ int mStatusBarHeight;
+ int mNavBarHeight;
+ int mNavBarWidth;
+
+ // Header (for transition)
+ TaskViewHeader mHeaderBar;
+ TaskStackView mDummyStackView;
+
+ // Variables to keep track of if we need to start recents after binding
+ boolean mTriggeredFromAltTab;
+ long mLastToggleTime;
+
+ public Recents() {
+ }
+
+ /**
+ * Gets the singleton instance and starts it if needed. On the primary user on the device, this
+ * component gets started as a normal {@link SystemUI} component. On a secondary user, this
+ * lifecycle doesn't exist, so we need to start it manually here if needed.
+ */
+ public static Recents getInstanceAndStartIfNeeded(Context ctx) {
+ if (sInstance == null) {
+ sInstance = new Recents();
+ sInstance.mContext = ctx;
+ sInstance.start();
+ sInstance.onBootCompleted();
+ }
+ return sInstance;
+ }
+
+ /** Creates a new broadcast intent */
+ static Intent createLocalBroadcastIntent(Context context, String action) {
+ Intent intent = new Intent(action);
+ intent.setPackage(context.getPackageName());
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT |
+ Intent.FLAG_RECEIVER_FOREGROUND);
+ return intent;
+ }
+
+ /** Initializes the Recents. */
+ @ProxyFromPrimaryToCurrentUser
+ @Override
+ public void start() {
+ if (sInstance == null) {
+ sInstance = this;
+ }
+ RecentsTaskLoader.initialize(mContext);
+ mInflater = LayoutInflater.from(mContext);
+ mSystemServicesProxy = new SystemServicesProxy(mContext);
+ mHandler = new Handler();
+ mTaskStackBounds = new Rect();
+
+ // Register the task stack listener
+ mTaskStackListener = new TaskStackListenerImpl(mHandler);
+ mSystemServicesProxy.registerTaskStackListener(mTaskStackListener);
+
+ // Only the owner has the callback to update the SysUI visibility flags, so all non-owner
+ // instances of AlternateRecentsComponent needs to notify the owner when the visibility
+ // changes.
+ if (mSystemServicesProxy.isForegroundUserOwner()) {
+ mProxyBroadcastReceiver = new RecentsOwnerEventProxyReceiver();
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Recents.ACTION_PROXY_NOTIFY_RECENTS_VISIBLITY_TO_OWNER);
+ mContext.registerReceiverAsUser(mProxyBroadcastReceiver, UserHandle.CURRENT, filter,
+ null, mHandler);
+ }
+
+ // Initialize some static datastructures
+ TaskStackViewLayoutAlgorithm.initializeCurve();
+ // Load the header bar layout
+ reloadHeaderBarLayout(true);
+
+ // When we start, preload the data associated with the previous recent tasks.
+ // We can use a new plan since the caches will be the same.
+ RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
+ RecentsTaskLoadPlan plan = loader.createLoadPlan(mContext);
+ loader.preloadTasks(plan, true /* isTopTaskHome */);
+ RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options();
+ launchOpts.numVisibleTasks = loader.getApplicationIconCacheSize();
+ launchOpts.numVisibleTaskThumbnails = loader.getThumbnailCacheSize();
+ launchOpts.onlyLoadForCache = true;
+ loader.loadTasks(mContext, plan, launchOpts);
+ putComponent(Recents.class, this);
+ }
+
+ @Override
+ public void onBootCompleted() {
+ mBootCompleted = true;
+ }
+
+ /** Shows the Recents. */
+ @ProxyFromPrimaryToCurrentUser
+ @Override
+ public void showRecents(boolean triggeredFromAltTab, View statusBarView) {
+ if (mSystemServicesProxy.isForegroundUserOwner()) {
+ showRecentsInternal(triggeredFromAltTab);
+ } else {
+ Intent intent = createLocalBroadcastIntent(mContext,
+ RecentsUserEventProxyReceiver.ACTION_PROXY_SHOW_RECENTS_TO_USER);
+ intent.putExtra(EXTRA_TRIGGERED_FROM_ALT_TAB, triggeredFromAltTab);
+ mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
+ }
+ }
+
+ void showRecentsInternal(boolean triggeredFromAltTab) {
+ mTriggeredFromAltTab = triggeredFromAltTab;
+
+ try {
+ startRecentsActivity();
+ } catch (ActivityNotFoundException e) {
+ Console.logRawError("Failed to launch RecentAppsIntent", e);
+ }
+ }
+
+ /** Hides the Recents. */
+ @ProxyFromPrimaryToCurrentUser
+ @Override
+ public void hideRecents(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) {
+ if (mSystemServicesProxy.isForegroundUserOwner()) {
+ hideRecentsInternal(triggeredFromAltTab, triggeredFromHomeKey);
+ } else {
+ Intent intent = createLocalBroadcastIntent(mContext,
+ RecentsUserEventProxyReceiver.ACTION_PROXY_HIDE_RECENTS_TO_USER);
+ intent.putExtra(EXTRA_TRIGGERED_FROM_ALT_TAB, triggeredFromAltTab);
+ intent.putExtra(EXTRA_TRIGGERED_FROM_HOME_KEY, triggeredFromHomeKey);
+ mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
+ }
+ }
+
+ void hideRecentsInternal(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) {
+ if (mBootCompleted) {
+ ActivityManager.RunningTaskInfo topTask = getTopMostTask();
+ if (topTask != null && isRecentsTopMost(topTask, null)) {
+ // Notify recents to hide itself
+ Intent intent = createLocalBroadcastIntent(mContext, ACTION_HIDE_RECENTS_ACTIVITY);
+ intent.putExtra(EXTRA_TRIGGERED_FROM_ALT_TAB, triggeredFromAltTab);
+ intent.putExtra(EXTRA_TRIGGERED_FROM_HOME_KEY, triggeredFromHomeKey);
+ mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
+ }
+ }
+ }
+
+ /** Toggles the Recents activity. */
+ @ProxyFromPrimaryToCurrentUser
+ @Override
+ public void toggleRecents(Display display, int layoutDirection, View statusBarView) {
+ if (mSystemServicesProxy.isForegroundUserOwner()) {
+ toggleRecentsInternal();
+ } else {
+ Intent intent = createLocalBroadcastIntent(mContext,
+ RecentsUserEventProxyReceiver.ACTION_PROXY_TOGGLE_RECENTS_TO_USER);
+ mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
+ }
+ }
+
+ void toggleRecentsInternal() {
+ mTriggeredFromAltTab = false;
+
+ try {
+ toggleRecentsActivity();
+ } catch (ActivityNotFoundException e) {
+ Console.logRawError("Failed to launch RecentAppsIntent", e);
+ }
+ }
+
+ /** Preloads info for the Recents activity. */
+ @ProxyFromPrimaryToCurrentUser
+ @Override
+ public void preloadRecents() {
+ if (mSystemServicesProxy.isForegroundUserOwner()) {
+ preloadRecentsInternal();
+ } else {
+ Intent intent = createLocalBroadcastIntent(mContext,
+ RecentsUserEventProxyReceiver.ACTION_PROXY_PRELOAD_RECENTS_TO_USER);
+ mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
+ }
+ }
+
+ void preloadRecentsInternal() {
+ // Preload only the raw task list into a new load plan (which will be consumed by the
+ // RecentsActivity)
+ RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
+ sInstanceLoadPlan = loader.createLoadPlan(mContext);
+ sInstanceLoadPlan.preloadRawTasks(true);
+ }
+
+ @Override
+ public void cancelPreloadingRecents() {
+ // Do nothing
+ }
+
+ void showRelativeAffiliatedTask(boolean showNextTask) {
+ RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
+ RecentsTaskLoadPlan plan = loader.createLoadPlan(mContext);
+ loader.preloadTasks(plan, true /* isTopTaskHome */);
+ TaskStack stack = plan.getTaskStack();
+
+ // Return early if there are no tasks
+ if (stack.getTaskCount() == 0) return;
+
+ ActivityManager.RunningTaskInfo runningTask = getTopMostTask();
+ // Return early if there is no running task (can't determine affiliated tasks in this case)
+ if (runningTask == null) return;
+ // Return early if the running task is in the home stack (optimization)
+ if (mSystemServicesProxy.isInHomeStack(runningTask.id)) return;
+
+ // Find the task in the recents list
+ ArrayList<Task> tasks = stack.getTasks();
+ Task toTask = null;
+ ActivityOptions launchOpts = null;
+ int taskCount = tasks.size();
+ int numAffiliatedTasks = 0;
+ for (int i = 0; i < taskCount; i++) {
+ Task task = tasks.get(i);
+ if (task.key.id == runningTask.id) {
+ TaskGrouping group = task.group;
+ Task.TaskKey toTaskKey;
+ if (showNextTask) {
+ toTaskKey = group.getNextTaskInGroup(task);
+ launchOpts = ActivityOptions.makeCustomAnimation(mContext,
+ R.anim.recents_launch_next_affiliated_task_target,
+ R.anim.recents_launch_next_affiliated_task_source);
+ } else {
+ toTaskKey = group.getPrevTaskInGroup(task);
+ launchOpts = ActivityOptions.makeCustomAnimation(mContext,
+ R.anim.recents_launch_prev_affiliated_task_target,
+ R.anim.recents_launch_prev_affiliated_task_source);
+ }
+ if (toTaskKey != null) {
+ toTask = stack.findTaskWithId(toTaskKey.id);
+ }
+ numAffiliatedTasks = group.getTaskCount();
+ break;
+ }
+ }
+
+ // Return early if there is no next task
+ if (toTask == null) {
+ if (numAffiliatedTasks > 1) {
+ if (showNextTask) {
+ mSystemServicesProxy.startInPlaceAnimationOnFrontMostApplication(
+ ActivityOptions.makeCustomInPlaceAnimation(mContext,
+ R.anim.recents_launch_next_affiliated_task_bounce));
+ } else {
+ mSystemServicesProxy.startInPlaceAnimationOnFrontMostApplication(
+ ActivityOptions.makeCustomInPlaceAnimation(mContext,
+ R.anim.recents_launch_prev_affiliated_task_bounce));
+ }
+ }
+ return;
+ }
+
+ // Launch the task
+ if (toTask.isActive) {
+ // Bring an active task to the foreground
+ mSystemServicesProxy.moveTaskToFront(toTask.key.id, launchOpts);
+ } else {
+ mSystemServicesProxy.startActivityFromRecents(mContext, toTask.key.id,
+ toTask.activityLabel, launchOpts);
+ }
+ }
+
+ @Override
+ public void showNextAffiliatedTask() {
+ showRelativeAffiliatedTask(true);
+ }
+
+ @Override
+ public void showPrevAffiliatedTask() {
+ showRelativeAffiliatedTask(false);
+ }
+
+ /** Updates on configuration change. */
+ @ProxyFromPrimaryToCurrentUser
+ public void onConfigurationChanged(Configuration newConfig) {
+ if (mSystemServicesProxy.isForegroundUserOwner()) {
+ configurationChanged();
+ } else {
+ Intent intent = createLocalBroadcastIntent(mContext,
+ RecentsUserEventProxyReceiver.ACTION_PROXY_CONFIG_CHANGE_TO_USER);
+ mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
+ }
+ }
+ void configurationChanged() {
+ // Don't reuse task stack views if the configuration changes
+ mCanReuseTaskStackViews = false;
+ // Reload the header bar layout
+ reloadHeaderBarLayout(false);
+ }
+
+ /** Prepares the header bar layout. */
+ void reloadHeaderBarLayout(boolean reloadWidget) {
+ Resources res = mContext.getResources();
+ mWindowRect = mSystemServicesProxy.getWindowRect();
+ mStatusBarHeight = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height);
+ mNavBarHeight = res.getDimensionPixelSize(com.android.internal.R.dimen.navigation_bar_height);
+ mNavBarWidth = res.getDimensionPixelSize(com.android.internal.R.dimen.navigation_bar_width);
+ mConfig = RecentsConfiguration.reinitialize(mContext, mSystemServicesProxy);
+ mConfig.updateOnConfigurationChange();
+ if (reloadWidget) {
+ // Reload the widget id before we get the task stack bounds
+ reloadSearchBarAppWidget(mContext, mSystemServicesProxy);
+ }
+ mConfig.getTaskStackBounds(mWindowRect.width(), mWindowRect.height(), mStatusBarHeight,
+ (mConfig.hasTransposedNavBar ? mNavBarWidth : 0), mTaskStackBounds);
+ if (mConfig.isLandscape && mConfig.hasTransposedNavBar) {
+ mSystemInsets.set(0, mStatusBarHeight, mNavBarWidth, 0);
+ } else {
+ mSystemInsets.set(0, mStatusBarHeight, 0, mNavBarHeight);
+ }
+
+ // Inflate the header bar layout so that we can rebind and draw it for the transition
+ TaskStack stack = new TaskStack();
+ mDummyStackView = new TaskStackView(mContext, stack);
+ TaskStackViewLayoutAlgorithm algo = mDummyStackView.getStackAlgorithm();
+ Rect taskStackBounds = new Rect(mTaskStackBounds);
+ taskStackBounds.bottom -= mSystemInsets.bottom;
+ algo.computeRects(mWindowRect.width(), mWindowRect.height(), taskStackBounds);
+ Rect taskViewSize = algo.getUntransformedTaskViewSize();
+ int taskBarHeight = res.getDimensionPixelSize(R.dimen.recents_task_bar_height);
+ mHeaderBar = (TaskViewHeader) mInflater.inflate(R.layout.recents_task_view_header, null,
+ false);
+ mHeaderBar.measure(
+ View.MeasureSpec.makeMeasureSpec(taskViewSize.width(), View.MeasureSpec.EXACTLY),
+ View.MeasureSpec.makeMeasureSpec(taskBarHeight, View.MeasureSpec.EXACTLY));
+ mHeaderBar.layout(0, 0, taskViewSize.width(), taskBarHeight);
+ }
+
+ /** Prepares the search bar app widget */
+ void reloadSearchBarAppWidget(Context context, SystemServicesProxy ssp) {
+ // Try and pre-emptively bind the search widget on startup to ensure that we
+ // have the right thumbnail bounds to animate to.
+ if (Constants.DebugFlags.App.EnableSearchLayout) {
+ // If there is no id, then bind a new search app widget
+ if (mConfig.searchBarAppWidgetId < 0) {
+ AppWidgetHost host = new RecentsAppWidgetHost(context,
+ Constants.Values.App.AppWidgetHostId);
+ Pair<Integer, AppWidgetProviderInfo> widgetInfo = ssp.bindSearchAppWidget(host);
+ if (widgetInfo != null) {
+ // Save the app widget id into the settings
+ mConfig.updateSearchBarAppWidgetId(context, widgetInfo.first);
+ }
+ }
+ }
+ }
+
+ /** Gets the top task. */
+ ActivityManager.RunningTaskInfo getTopMostTask() {
+ SystemServicesProxy ssp = mSystemServicesProxy;
+ List<ActivityManager.RunningTaskInfo> tasks = ssp.getRunningTasks(1);
+ if (!tasks.isEmpty()) {
+ return tasks.get(0);
+ }
+ return null;
+ }
+
+ /** Returns whether the recents is currently running */
+ boolean isRecentsTopMost(ActivityManager.RunningTaskInfo topTask, AtomicBoolean isHomeTopMost) {
+ SystemServicesProxy ssp = mSystemServicesProxy;
+ if (topTask != null) {
+ ComponentName topActivity = topTask.topActivity;
+
+ // Check if the front most activity is recents
+ if (topActivity.getPackageName().equals(sRecentsPackage) &&
+ topActivity.getClassName().equals(sRecentsActivity)) {
+ if (isHomeTopMost != null) {
+ isHomeTopMost.set(false);
+ }
+ return true;
+ }
+
+ if (isHomeTopMost != null) {
+ isHomeTopMost.set(ssp.isInHomeStack(topTask.id));
+ }
+ }
+ return false;
+ }
+
+ /** Toggles the recents activity */
+ void toggleRecentsActivity() {
+ // If the user has toggled it too quickly, then just eat up the event here (it's better than
+ // showing a janky screenshot).
+ // NOTE: Ideally, the screenshot mechanism would take the window transform into account
+ if ((SystemClock.elapsedRealtime() - mLastToggleTime) < sMinToggleDelay) {
+ return;
+ }
+
+ // If Recents is the front most activity, then we should just communicate with it directly
+ // to launch the first task or dismiss itself
+ ActivityManager.RunningTaskInfo topTask = getTopMostTask();
+ AtomicBoolean isTopTaskHome = new AtomicBoolean(true);
+ if (topTask != null && isRecentsTopMost(topTask, isTopTaskHome)) {
+ // Notify recents to toggle itself
+ Intent intent = createLocalBroadcastIntent(mContext, ACTION_TOGGLE_RECENTS_ACTIVITY);
+ mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
+ mLastToggleTime = SystemClock.elapsedRealtime();
+ return;
+ } else {
+ // Otherwise, start the recents activity
+ startRecentsActivity(topTask, isTopTaskHome.get());
+ }
+ }
+
+ /** Starts the recents activity if it is not already running */
+ void startRecentsActivity() {
+ // Check if the top task is in the home stack, and start the recents activity
+ ActivityManager.RunningTaskInfo topTask = getTopMostTask();
+ AtomicBoolean isTopTaskHome = new AtomicBoolean(true);
+ if (topTask == null || !isRecentsTopMost(topTask, isTopTaskHome)) {
+ startRecentsActivity(topTask, isTopTaskHome.get());
+ }
+ }
+
+ /**
+ * Creates the activity options for a unknown state->recents transition.
+ */
+ ActivityOptions getUnknownTransitionActivityOptions() {
+ mStartAnimationTriggered = false;
+ return ActivityOptions.makeCustomAnimation(mContext,
+ R.anim.recents_from_unknown_enter,
+ R.anim.recents_from_unknown_exit,
+ mHandler, this);
+ }
+
+ /**
+ * Creates the activity options for a home->recents transition.
+ */
+ ActivityOptions getHomeTransitionActivityOptions(boolean fromSearchHome) {
+ mStartAnimationTriggered = false;
+ if (fromSearchHome) {
+ return ActivityOptions.makeCustomAnimation(mContext,
+ R.anim.recents_from_search_launcher_enter,
+ R.anim.recents_from_search_launcher_exit,
+ mHandler, this);
+ }
+ return ActivityOptions.makeCustomAnimation(mContext,
+ R.anim.recents_from_launcher_enter,
+ R.anim.recents_from_launcher_exit,
+ mHandler, this);
+ }
+
+ /**
+ * Creates the activity options for an app->recents transition.
+ */
+ ActivityOptions getThumbnailTransitionActivityOptions(ActivityManager.RunningTaskInfo topTask,
+ TaskStack stack, TaskStackView stackView) {
+ // Update the destination rect
+ Task toTask = new Task();
+ TaskViewTransform toTransform = getThumbnailTransitionTransform(stack, stackView,
+ topTask.id, toTask);
+ if (toTransform != null && toTask.key != null) {
+ Rect toTaskRect = toTransform.rect;
+ int toHeaderWidth = (int) (mHeaderBar.getMeasuredWidth() * toTransform.scale);
+ int toHeaderHeight = (int) (mHeaderBar.getMeasuredHeight() * toTransform.scale);
+ Bitmap thumbnail = Bitmap.createBitmap(toHeaderWidth, toHeaderHeight,
+ Bitmap.Config.ARGB_8888);
+ if (Constants.DebugFlags.App.EnableTransitionThumbnailDebugMode) {
+ thumbnail.eraseColor(0xFFff0000);
+ } else {
+ Canvas c = new Canvas(thumbnail);
+ c.scale(toTransform.scale, toTransform.scale);
+ mHeaderBar.rebindToTask(toTask);
+ mHeaderBar.draw(c);
+ c.setBitmap(null);
+ }
+
+ mStartAnimationTriggered = false;
+ return ActivityOptions.makeThumbnailAspectScaleDownAnimation(mDummyStackView,
+ thumbnail, toTaskRect.left, toTaskRect.top, toTaskRect.width(),
+ toTaskRect.height(), mHandler, this);
+ }
+
+ // If both the screenshot and thumbnail fails, then just fall back to the default transition
+ return getUnknownTransitionActivityOptions();
+ }
+
+ /** Returns the transition rect for the given task id. */
+ TaskViewTransform getThumbnailTransitionTransform(TaskStack stack, TaskStackView stackView,
+ int runningTaskId, Task runningTaskOut) {
+ // Find the running task in the TaskStack
+ Task task = null;
+ ArrayList<Task> tasks = stack.getTasks();
+ if (runningTaskId != -1) {
+ // Otherwise, try and find the task with the
+ int taskCount = tasks.size();
+ for (int i = taskCount - 1; i >= 0; i--) {
+ Task t = tasks.get(i);
+ if (t.key.id == runningTaskId) {
+ task = t;
+ runningTaskOut.copyFrom(t);
+ break;
+ }
+ }
+ }
+ if (task == null) {
+ // If no task is specified or we can not find the task just use the front most one
+ task = tasks.get(tasks.size() - 1);
+ }
+
+ // Get the transform for the running task
+ stackView.getScroller().setStackScrollToInitialState();
+ mTmpTransform = stackView.getStackAlgorithm().getStackTransform(task,
+ stackView.getScroller().getStackScroll(), mTmpTransform, null);
+ return mTmpTransform;
+ }
+
+ /** Starts the recents activity */
+ void startRecentsActivity(ActivityManager.RunningTaskInfo topTask, boolean isTopTaskHome) {
+ if (sInstanceLoadPlan == null) {
+ // Create a new load plan if onPreloadRecents() was never triggered
+ RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
+ sInstanceLoadPlan = loader.createLoadPlan(mContext);
+ }
+ RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
+ loader.preloadTasks(sInstanceLoadPlan, isTopTaskHome);
+ TaskStack stack = sInstanceLoadPlan.getTaskStack();
+
+ // Prepare the dummy stack for the transition
+ mDummyStackView.updateMinMaxScrollForStack(stack, mTriggeredFromAltTab, isTopTaskHome);
+ TaskStackViewLayoutAlgorithm.VisibilityReport stackVr =
+ mDummyStackView.computeStackVisibilityReport();
+ boolean hasRecentTasks = stack.getTaskCount() > 0;
+ boolean useThumbnailTransition = (topTask != null) && !isTopTaskHome && hasRecentTasks;
+
+ if (useThumbnailTransition) {
+ // Ensure that we load the running task's icon
+ RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options();
+ launchOpts.runningTaskId = topTask.id;
+ launchOpts.loadThumbnails = false;
+ launchOpts.onlyLoadForCache = true;
+ loader.loadTasks(mContext, sInstanceLoadPlan, launchOpts);
+
+ // Try starting with a thumbnail transition
+ ActivityOptions opts = getThumbnailTransitionActivityOptions(topTask, stack,
+ mDummyStackView);
+ if (opts != null) {
+ startAlternateRecentsActivity(topTask, opts, false /* fromHome */,
+ false /* fromSearchHome */, true /* fromThumbnail */, stackVr);
+ } else {
+ // Fall through below to the non-thumbnail transition
+ useThumbnailTransition = false;
+ }
+ }
+
+ if (!useThumbnailTransition) {
+ // If there is no thumbnail transition, but is launching from home into recents, then
+ // use a quick home transition and do the animation from home
+ if (hasRecentTasks) {
+ // Get the home activity info
+ String homeActivityPackage = mSystemServicesProxy.getHomeActivityPackageName();
+ // Get the search widget info
+ AppWidgetProviderInfo searchWidget = null;
+ String searchWidgetPackage = null;
+ if (mConfig.hasSearchBarAppWidget()) {
+ searchWidget = mSystemServicesProxy.getAppWidgetInfo(
+ mConfig.searchBarAppWidgetId);
+ } else {
+ searchWidget = mSystemServicesProxy.resolveSearchAppWidget();
+ }
+ if (searchWidget != null && searchWidget.provider != null) {
+ searchWidgetPackage = searchWidget.provider.getPackageName();
+ }
+ // Determine whether we are coming from a search owned home activity
+ boolean fromSearchHome = false;
+ if (homeActivityPackage != null && searchWidgetPackage != null &&
+ homeActivityPackage.equals(searchWidgetPackage)) {
+ fromSearchHome = true;
+ }
+
+ ActivityOptions opts = getHomeTransitionActivityOptions(fromSearchHome);
+ startAlternateRecentsActivity(topTask, opts, true /* fromHome */, fromSearchHome,
+ false /* fromThumbnail */, stackVr);
+ } else {
+ // Otherwise we do the normal fade from an unknown source
+ ActivityOptions opts = getUnknownTransitionActivityOptions();
+ startAlternateRecentsActivity(topTask, opts, true /* fromHome */,
+ false /* fromSearchHome */, false /* fromThumbnail */, stackVr);
+ }
+ }
+ mLastToggleTime = SystemClock.elapsedRealtime();
+ }
+
+ /** Starts the recents activity */
+ void startAlternateRecentsActivity(ActivityManager.RunningTaskInfo topTask,
+ ActivityOptions opts, boolean fromHome, boolean fromSearchHome, boolean fromThumbnail,
+ TaskStackViewLayoutAlgorithm.VisibilityReport vr) {
+ // Update the configuration based on the launch options
+ mConfig.launchedFromHome = fromSearchHome || fromHome;
+ mConfig.launchedFromSearchHome = fromSearchHome;
+ mConfig.launchedFromAppWithThumbnail = fromThumbnail;
+ mConfig.launchedToTaskId = (topTask != null) ? topTask.id : -1;
+ mConfig.launchedWithAltTab = mTriggeredFromAltTab;
+ mConfig.launchedReuseTaskStackViews = mCanReuseTaskStackViews;
+ mConfig.launchedNumVisibleTasks = vr.numVisibleTasks;
+ mConfig.launchedNumVisibleThumbnails = vr.numVisibleThumbnails;
+ mConfig.launchedHasConfigurationChanged = false;
+
+ Intent intent = new Intent(sToggleRecentsAction);
+ intent.setClassName(sRecentsPackage, sRecentsActivity);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
+ | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
+ if (opts != null) {
+ mContext.startActivityAsUser(intent, opts.toBundle(), UserHandle.CURRENT);
+ } else {
+ mContext.startActivityAsUser(intent, UserHandle.CURRENT);
+ }
+ mCanReuseTaskStackViews = true;
+ }
+
+ /** Sets the RecentsComponent callbacks. */
+ @Override
+ public void setCallback(RecentsComponent.Callbacks cb) {
+ sRecentsComponentCallbacks = cb;
+ }
+
+ /** Notifies the callbacks that the visibility of Recents has changed. */
+ @ProxyFromAnyToPrimaryUser
+ public static void notifyVisibilityChanged(Context context, SystemServicesProxy ssp,
+ boolean visible) {
+ if (ssp.isForegroundUserOwner()) {
+ visibilityChanged(visible);
+ } else {
+ Intent intent = createLocalBroadcastIntent(context,
+ ACTION_PROXY_NOTIFY_RECENTS_VISIBLITY_TO_OWNER);
+ intent.putExtra(EXTRA_RECENTS_VISIBILITY, visible);
+ context.sendBroadcastAsUser(intent, UserHandle.OWNER);
+ }
+ }
+ static void visibilityChanged(boolean visible) {
+ if (sRecentsComponentCallbacks != null) {
+ sRecentsComponentCallbacks.onVisibilityChanged(visible);
+ }
+ }
+
+ /**
+ * Returns the preloaded load plan and invalidates it.
+ */
+ public static RecentsTaskLoadPlan consumeInstanceLoadPlan() {
+ RecentsTaskLoadPlan plan = sInstanceLoadPlan;
+ sInstanceLoadPlan = null;
+ return plan;
+ }
+
+ /**** OnAnimationStartedListener Implementation ****/
+
+ @Override
+ public void onAnimationStarted() {
+ // Notify recents to start the enter animation
+ if (!mStartAnimationTriggered) {
+ // There can be a race condition between the start animation callback and
+ // the start of the new activity (where we register the receiver that listens
+ // to this broadcast, so we add our own receiver and if that gets called, then
+ // we know the activity has not yet started and we can retry sending the broadcast.
+ BroadcastReceiver fallbackReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (getResultCode() == Activity.RESULT_OK) {
+ mStartAnimationTriggered = true;
+ return;
+ }
+
+ // Schedule for the broadcast to be sent again after some time
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ onAnimationStarted();
+ }
+ }, 25);
+ }
+ };
+
+ // Send the broadcast to notify Recents that the animation has started
+ Intent intent = createLocalBroadcastIntent(mContext, ACTION_START_ENTER_ANIMATION);
+ mContext.sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT, null,
+ fallbackReceiver, null, Activity.RESULT_CANCELED, null, null);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index ee631f5..95f2b7d 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -130,20 +130,20 @@
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
- if (action.equals(AlternateRecentsComponent.ACTION_HIDE_RECENTS_ACTIVITY)) {
- if (intent.getBooleanExtra(AlternateRecentsComponent.EXTRA_TRIGGERED_FROM_ALT_TAB, false)) {
+ if (action.equals(Recents.ACTION_HIDE_RECENTS_ACTIVITY)) {
+ if (intent.getBooleanExtra(Recents.EXTRA_TRIGGERED_FROM_ALT_TAB, false)) {
// If we are hiding from releasing Alt-Tab, dismiss Recents to the focused app
dismissRecentsToFocusedTaskOrHome(false);
- } else if (intent.getBooleanExtra(AlternateRecentsComponent.EXTRA_TRIGGERED_FROM_HOME_KEY, false)) {
+ } else if (intent.getBooleanExtra(Recents.EXTRA_TRIGGERED_FROM_HOME_KEY, false)) {
// Otherwise, dismiss Recents to Home
dismissRecentsToHome(true);
} else {
// Do nothing, another activity is being launched on top of Recents
}
- } else if (action.equals(AlternateRecentsComponent.ACTION_TOGGLE_RECENTS_ACTIVITY)) {
+ } else if (action.equals(Recents.ACTION_TOGGLE_RECENTS_ACTIVITY)) {
// If we are toggling Recents, then first unfilter any filtered stacks first
dismissRecentsToFocusedTaskOrHome(true);
- } else if (action.equals(AlternateRecentsComponent.ACTION_START_ENTER_ANIMATION)) {
+ } else if (action.equals(Recents.ACTION_START_ENTER_ANIMATION)) {
// Trigger the enter animation
onEnterAnimationTriggered();
// Notify the fallback receiver that we have successfully got the broadcast
@@ -185,7 +185,7 @@
// If AlternateRecentsComponent has preloaded a load plan, then use that to prevent
// reconstructing the task stack
RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
- RecentsTaskLoadPlan plan = AlternateRecentsComponent.consumeInstanceLoadPlan();
+ RecentsTaskLoadPlan plan = Recents.consumeInstanceLoadPlan();
if (plan == null) {
plan = loader.createLoadPlan(this);
}
@@ -436,13 +436,13 @@
mVisible = true;
RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
SystemServicesProxy ssp = loader.getSystemServicesProxy();
- AlternateRecentsComponent.notifyVisibilityChanged(this, ssp, true);
+ Recents.notifyVisibilityChanged(this, ssp, true);
// Register the broadcast receiver to handle messages from our service
IntentFilter filter = new IntentFilter();
- filter.addAction(AlternateRecentsComponent.ACTION_HIDE_RECENTS_ACTIVITY);
- filter.addAction(AlternateRecentsComponent.ACTION_TOGGLE_RECENTS_ACTIVITY);
- filter.addAction(AlternateRecentsComponent.ACTION_START_ENTER_ANIMATION);
+ filter.addAction(Recents.ACTION_HIDE_RECENTS_ACTIVITY);
+ filter.addAction(Recents.ACTION_TOGGLE_RECENTS_ACTIVITY);
+ filter.addAction(Recents.ACTION_START_ENTER_ANIMATION);
registerReceiver(mServiceBroadcastReceiver, filter);
// Register any broadcast receivers for the task loader
@@ -458,7 +458,7 @@
mVisible = false;
RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
SystemServicesProxy ssp = loader.getSystemServicesProxy();
- AlternateRecentsComponent.notifyVisibilityChanged(this, ssp, false);
+ Recents.notifyVisibilityChanged(this, ssp, false);
// Notify the views that we are no longer visible
mRecentsView.onRecentsHidden();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsUserEventProxyReceiver.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsUserEventProxyReceiver.java
index 236da5d..5eefbc7 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsUserEventProxyReceiver.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsUserEventProxyReceiver.java
@@ -19,8 +19,6 @@
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import com.android.systemui.recent.Recents;
-
/**
* A proxy for Recents events which happens strictly for non-owner users.
@@ -39,28 +37,27 @@
@Override
public void onReceive(Context context, Intent intent) {
- AlternateRecentsComponent recents = Recents.getRecentsComponent(
- context.getApplicationContext(), true);
+ Recents recents = Recents.getInstanceAndStartIfNeeded(context);
switch (intent.getAction()) {
case ACTION_PROXY_SHOW_RECENTS_TO_USER: {
boolean triggeredFromAltTab = intent.getBooleanExtra(
- AlternateRecentsComponent.EXTRA_TRIGGERED_FROM_ALT_TAB, false);
- recents.showRecents(triggeredFromAltTab);
+ Recents.EXTRA_TRIGGERED_FROM_ALT_TAB, false);
+ recents.showRecentsInternal(triggeredFromAltTab);
break;
}
case ACTION_PROXY_HIDE_RECENTS_TO_USER: {
boolean triggeredFromAltTab = intent.getBooleanExtra(
- AlternateRecentsComponent.EXTRA_TRIGGERED_FROM_ALT_TAB, false);
+ Recents.EXTRA_TRIGGERED_FROM_ALT_TAB, false);
boolean triggeredFromHome = intent.getBooleanExtra(
- AlternateRecentsComponent.EXTRA_TRIGGERED_FROM_HOME_KEY, false);
- recents.hideRecents(triggeredFromAltTab, triggeredFromHome);
+ Recents.EXTRA_TRIGGERED_FROM_HOME_KEY, false);
+ recents.hideRecentsInternal(triggeredFromAltTab, triggeredFromHome);
break;
}
case ACTION_PROXY_TOGGLE_RECENTS_TO_USER:
- recents.toggleRecents();
+ recents.toggleRecentsInternal();
break;
case ACTION_PROXY_PRELOAD_RECENTS_TO_USER:
- recents.preloadRecents();
+ recents.preloadRecentsInternal();
break;
case ACTION_PROXY_CONFIG_CHANGE_TO_USER:
recents.configurationChanged();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
new file mode 100644
index 0000000..502862e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.recents;
+
+import android.animation.ArgbEvaluator;
+import android.animation.ValueAnimator;
+import android.app.ActivityManager;
+import android.app.ActivityManagerNative;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Configuration;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.ColorDrawable;
+import android.os.RemoteException;
+import android.util.DisplayMetrics;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.view.accessibility.AccessibilityManager;
+import android.view.animation.DecelerateInterpolator;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+
+import java.util.ArrayList;
+
+public class ScreenPinningRequest implements View.OnClickListener {
+ private final Context mContext;
+
+ private final AccessibilityManager mAccessibilityService;
+ private final WindowManager mWindowManager;
+
+ private RequestWindowView mRequestWindow;
+
+ public ScreenPinningRequest(Context context) {
+ mContext = context;
+ mAccessibilityService = (AccessibilityManager)
+ mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
+ mWindowManager = (WindowManager)
+ mContext.getSystemService(Context.WINDOW_SERVICE);
+ }
+
+ public void clearPrompt() {
+ if (mRequestWindow != null) {
+ mWindowManager.removeView(mRequestWindow);
+ mRequestWindow = null;
+ }
+ }
+
+ public void showPrompt(boolean allowCancel) {
+ clearPrompt();
+
+ mRequestWindow = new RequestWindowView(mContext, allowCancel);
+
+ mRequestWindow.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
+
+ // show the confirmation
+ WindowManager.LayoutParams lp = getWindowLayoutParams();
+ mWindowManager.addView(mRequestWindow, lp);
+ }
+
+ public void onConfigurationChanged() {
+ if (mRequestWindow != null) {
+ mRequestWindow.onConfigurationChanged();
+ }
+ }
+
+ private WindowManager.LayoutParams getWindowLayoutParams() {
+ final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
+ 0
+ | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
+ ,
+ PixelFormat.TRANSLUCENT);
+ lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+ lp.setTitle("ScreenPinningConfirmation");
+ lp.gravity = Gravity.FILL;
+ return lp;
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v.getId() == R.id.screen_pinning_ok_button || mRequestWindow == v) {
+ try {
+ ActivityManagerNative.getDefault().startLockTaskModeOnCurrent();
+ } catch (RemoteException e) {}
+ }
+ clearPrompt();
+ }
+
+ public FrameLayout.LayoutParams getRequestLayoutParams(boolean isLandscape) {
+ return new FrameLayout.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ isLandscape ? (Gravity.CENTER_VERTICAL | Gravity.RIGHT)
+ : (Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM));
+ }
+
+ private class RequestWindowView extends FrameLayout {
+ private static final int OFFSET_DP = 96;
+
+ private final ColorDrawable mColor = new ColorDrawable(0);
+ private ValueAnimator mColorAnim;
+ private ViewGroup mLayout;
+ private boolean mShowCancel;
+
+ public RequestWindowView(Context context, boolean showCancel) {
+ super(context);
+ setClickable(true);
+ setOnClickListener(ScreenPinningRequest.this);
+ setBackground(mColor);
+ mShowCancel = showCancel;
+ }
+
+ @Override
+ public void onAttachedToWindow() {
+ DisplayMetrics metrics = new DisplayMetrics();
+ mWindowManager.getDefaultDisplay().getMetrics(metrics);
+ float density = metrics.density;
+ boolean isLandscape = isLandscapePhone(mContext);
+
+ inflateView(isLandscape);
+ int bgColor = mContext.getResources().getColor(
+ R.color.screen_pinning_request_window_bg);
+ if (ActivityManager.isHighEndGfx()) {
+ mLayout.setAlpha(0f);
+ if (isLandscape) {
+ mLayout.setTranslationX(OFFSET_DP * density);
+ } else {
+ mLayout.setTranslationY(OFFSET_DP * density);
+ }
+ mLayout.animate()
+ .alpha(1f)
+ .translationX(0)
+ .translationY(0)
+ .setDuration(300)
+ .setInterpolator(new DecelerateInterpolator())
+ .start();
+
+ mColorAnim = ValueAnimator.ofObject(new ArgbEvaluator(), 0, bgColor);
+ mColorAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ final int c = (Integer) animation.getAnimatedValue();
+ mColor.setColor(c);
+ }
+ });
+ mColorAnim.setDuration(1000);
+ mColorAnim.start();
+ } else {
+ mColor.setColor(bgColor);
+ }
+
+ IntentFilter filter = new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED);
+ filter.addAction(Intent.ACTION_USER_SWITCHED);
+ filter.addAction(Intent.ACTION_SCREEN_OFF);
+ mContext.registerReceiver(mReceiver, filter);
+ }
+
+ private boolean isLandscapePhone(Context context) {
+ Configuration config = mContext.getResources().getConfiguration();
+ return config.orientation == Configuration.ORIENTATION_LANDSCAPE
+ && config.smallestScreenWidthDp < 600;
+ }
+
+ private void inflateView(boolean isLandscape) {
+ // We only want this landscape orientation on <600dp, so rather than handle
+ // resource overlay for -land and -sw600dp-land, just inflate this
+ // other view for this single case.
+ mLayout = (ViewGroup) View.inflate(getContext(), isLandscape
+ ? R.layout.screen_pinning_request_land_phone : R.layout.screen_pinning_request,
+ null);
+ // Catch touches so they don't trigger cancel/activate, like outside does.
+ mLayout.setClickable(true);
+ // Status bar is always on the right.
+ mLayout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
+ // Buttons and text do switch sides though.
+ View buttons = mLayout.findViewById(R.id.screen_pinning_buttons);
+ buttons.setLayoutDirection(View.LAYOUT_DIRECTION_LOCALE);
+ mLayout.findViewById(R.id.screen_pinning_text_area)
+ .setLayoutDirection(View.LAYOUT_DIRECTION_LOCALE);
+ swapChildrenIfRtlAndVertical(buttons);
+
+ ((Button) mLayout.findViewById(R.id.screen_pinning_ok_button))
+ .setOnClickListener(ScreenPinningRequest.this);
+ if (mShowCancel) {
+ ((Button) mLayout.findViewById(R.id.screen_pinning_cancel_button))
+ .setOnClickListener(ScreenPinningRequest.this);
+ } else {
+ ((Button) mLayout.findViewById(R.id.screen_pinning_cancel_button))
+ .setVisibility(View.INVISIBLE);
+ }
+
+ final int description = mAccessibilityService.isEnabled()
+ ? R.string.screen_pinning_description_accessible
+ : R.string.screen_pinning_description;
+ ((TextView) mLayout.findViewById(R.id.screen_pinning_description))
+ .setText(description);
+ final int backBgVisibility =
+ mAccessibilityService.isEnabled() ? View.INVISIBLE : View.VISIBLE;
+ mLayout.findViewById(R.id.screen_pinning_back_bg).setVisibility(backBgVisibility);
+ mLayout.findViewById(R.id.screen_pinning_back_bg_light).setVisibility(backBgVisibility);
+
+ addView(mLayout, getRequestLayoutParams(isLandscape));
+ }
+
+ private void swapChildrenIfRtlAndVertical(View group) {
+ if (mContext.getResources().getConfiguration().getLayoutDirection()
+ != View.LAYOUT_DIRECTION_RTL) {
+ return;
+ }
+ LinearLayout linearLayout = (LinearLayout) group;
+ if (linearLayout.getOrientation() == LinearLayout.VERTICAL) {
+ int childCount = linearLayout.getChildCount();
+ ArrayList<View> childList = new ArrayList<>(childCount);
+ for (int i = 0; i < childCount; i++) {
+ childList.add(linearLayout.getChildAt(i));
+ }
+ linearLayout.removeAllViews();
+ for (int i = childCount - 1; i >= 0; i--) {
+ linearLayout.addView(childList.get(i));
+ }
+ }
+ }
+
+ @Override
+ public void onDetachedFromWindow() {
+ mContext.unregisterReceiver(mReceiver);
+ }
+
+ protected void onConfigurationChanged() {
+ removeAllViews();
+ inflateView(isLandscapePhone(mContext));
+ }
+
+ private final Runnable mUpdateLayoutRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (mLayout != null && mLayout.getParent() != null) {
+ mLayout.setLayoutParams(getRequestLayoutParams(isLandscapePhone(mContext)));
+ }
+ }
+ };
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
+ post(mUpdateLayoutRunnable);
+ } else if (intent.getAction().equals(Intent.ACTION_USER_SWITCHED)
+ || intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
+ clearPrompt();
+ }
+ }
+ };
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
index 465a141..e021cd4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
@@ -388,7 +388,7 @@
}
private void updateBackgroundTint() {
- int color = getBackgroundColor();
+ int color = getBgColor();
int rippleColor = getRippleColor();
if (color == mNormalColor) {
// We don't need to tint a normal notification
@@ -652,7 +652,7 @@
}
private void updateAppearAnimationAlpha() {
- int backgroundColor = getBackgroundColor();
+ int backgroundColor = getBgColor();
if (backgroundColor != -1) {
float contentAlphaProgress = mAppearAnimationFraction;
contentAlphaProgress = contentAlphaProgress / (1.0f - ALPHA_ANIMATION_END);
@@ -666,7 +666,7 @@
}
}
- private int getBackgroundColor() {
+ private int getBgColor() {
if (mBgTint != 0) {
return mBgTint;
} else if (mShowingLegacyBackground) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 2b6ac26..21d70ba 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -91,6 +91,7 @@
import com.android.systemui.SearchPanelView;
import com.android.systemui.SwipeHelper;
import com.android.systemui.SystemUI;
+import com.android.systemui.recents.Recents;
import com.android.systemui.statusbar.NotificationData.Entry;
import com.android.systemui.statusbar.phone.NavigationBarView;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
@@ -531,7 +532,7 @@
mBarService = IStatusBarService.Stub.asInterface(
ServiceManager.getService(Context.STATUS_BAR_SERVICE));
- mRecents = getComponent(RecentsComponent.class);
+ mRecents = getComponent(Recents.class);
mRecents.setCallback(this);
final Configuration currentConfig = mContext.getResources().getConfiguration();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 8ad8406..a52d0f6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -193,8 +193,8 @@
}
@Override
- public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) {
- if (super.onRequestSendAccessibilityEvent(child, event)) {
+ public boolean onRequestSendAccessibilityEventInternal(View child, AccessibilityEvent event) {
+ if (super.onRequestSendAccessibilityEventInternal(child, event)) {
// Add a record for the entire layout since its content is somehow small.
// The event comes from a leaf view that is interacted with.
AccessibilityEvent record = AccessibilityEvent.obtain();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index 8e35ee99..6310234 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -217,7 +217,7 @@
}
@Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
// Standard group layout onPopulateAccessibilityEvent() implementations
// ignore content description, so populate manually
if (mWifiVisible && mWifiGroup != null && mWifiGroup.getContentDescription() != null)
@@ -225,7 +225,7 @@
for (PhoneState state : mPhoneStates) {
state.populateAccessibilityEvent(event);
}
- return super.dispatchPopulateAccessibilityEvent(event);
+ return super.dispatchPopulateAccessibilityEventInternal(event);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java
index 6cb5bcc..44168bc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java
@@ -90,24 +90,12 @@
: 0;
updateSlot("alarm_clock", null, iconId);
}
- String sync = args.getString("sync");
- if (sync != null) {
- int iconId = sync.equals("show") ? R.drawable.stat_sys_sync
- : 0;
- updateSlot("sync_active", null, iconId);
- }
String tty = args.getString("tty");
if (tty != null) {
int iconId = tty.equals("show") ? R.drawable.stat_sys_tty_mode
: 0;
updateSlot("tty", null, iconId);
}
- String eri = args.getString("eri");
- if (eri != null) {
- int iconId = eri.equals("show") ? R.drawable.stat_sys_roaming_cdma_0
- : 0;
- updateSlot("cdma_eri", null, iconId);
- }
String mute = args.getString("mute");
if (mute != null) {
int iconId = mute.equals("show") ? android.R.drawable.stat_notify_call_mute
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
index 3292f9b..34400c4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -24,10 +24,9 @@
import android.view.ViewGroup;
import com.android.internal.widget.LockPatternUtils;
-import com.android.keyguard.KeyguardViewBase;
+import com.android.keyguard.KeyguardHostView;
import com.android.keyguard.R;
import com.android.keyguard.ViewMediatorCallback;
-import com.android.systemui.keyguard.KeyguardViewMediator;
import static com.android.keyguard.KeyguardHostView.OnDismissAction;
import static com.android.keyguard.KeyguardSecurityModel.SecurityMode;
@@ -42,7 +41,7 @@
private LockPatternUtils mLockPatternUtils;
private ViewGroup mContainer;
private StatusBarWindowManager mWindowManager;
- private KeyguardViewBase mKeyguardView;
+ private KeyguardHostView mKeyguardView;
private ViewGroup mRoot;
private boolean mShowingSoon;
private Choreographer mChoreographer = Choreographer.getInstance();
@@ -138,16 +137,6 @@
}
}
- public long getUserActivityTimeout() {
- if (mKeyguardView != null) {
- long timeout = mKeyguardView.getUserActivityTimeout();
- if (timeout >= 0) {
- return timeout;
- }
- }
- return KeyguardViewMediator.AWAKE_INTERVAL_DEFAULT_MS;
- }
-
public boolean isShowing() {
return mShowingSoon || (mRoot != null && mRoot.getVisibility() == View.VISIBLE);
}
@@ -169,7 +158,7 @@
private void inflateView() {
removeView();
mRoot = (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.keyguard_bouncer, null);
- mKeyguardView = (KeyguardViewBase) mRoot.findViewById(R.id.keyguard_host_view);
+ mKeyguardView = (KeyguardHostView) mRoot.findViewById(R.id.keyguard_host_view);
mKeyguardView.setLockPatternUtils(mLockPatternUtils);
mKeyguardView.setViewMediatorCallback(mCallback);
mContainer.addView(mRoot, mContainer.getChildCount());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 1b00e59..2a84b89 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -483,14 +483,14 @@
}
@Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
event.getText().add(getKeyguardOrLockScreenString());
mLastAnnouncementWasQuickSettings = false;
return true;
}
- return super.dispatchPopulateAccessibilityEvent(event);
+ return super.dispatchPopulateAccessibilityEventInternal(event);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index d6647af..5bff79a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -128,7 +128,7 @@
import com.android.systemui.doze.DozeLog;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.qs.QSPanel;
-import com.android.systemui.recent.ScreenPinningRequest;
+import com.android.systemui.recents.ScreenPinningRequest;
import com.android.systemui.statusbar.ActivatableNotificationView;
import com.android.systemui.statusbar.BackDropView;
import com.android.systemui.statusbar.BaseStatusBar;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
index 5c254a26..e8a000c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
@@ -46,16 +46,12 @@
private static final String TAG = "PhoneStatusBarPolicy";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- private static final boolean SHOW_SYNC_ICON = false;
-
- private static final String SLOT_SYNC_ACTIVE = "sync_active";
private static final String SLOT_CAST = "cast";
private static final String SLOT_HOTSPOT = "hotspot";
private static final String SLOT_BLUETOOTH = "bluetooth";
private static final String SLOT_TTY = "tty";
private static final String SLOT_ZEN = "zen";
private static final String SLOT_VOLUME = "volume";
- private static final String SLOT_CDMA_ERI = "cdma_eri";
private static final String SLOT_ALARM_CLOCK = "alarm_clock";
private final Context mContext;
@@ -83,9 +79,6 @@
if (action.equals(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED)) {
updateAlarm();
}
- else if (action.equals(Intent.ACTION_SYNC_STATE_CHANGED)) {
- updateSyncState(intent);
- }
else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED) ||
action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {
updateBluetooth();
@@ -115,7 +108,6 @@
// listen for broadcasts
IntentFilter filter = new IntentFilter();
filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
- filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED);
filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
@@ -129,10 +121,6 @@
mService.setIcon(SLOT_TTY, R.drawable.stat_sys_tty_mode, 0, null);
mService.setIconVisibility(SLOT_TTY, false);
- // Cdma Roaming Indicator, ERI
- mService.setIcon(SLOT_CDMA_ERI, R.drawable.stat_sys_roaming_cdma_0, 0, null);
- mService.setIconVisibility(SLOT_CDMA_ERI, false);
-
// bluetooth status
updateBluetooth();
@@ -140,11 +128,6 @@
mService.setIcon(SLOT_ALARM_CLOCK, R.drawable.stat_sys_alarm, 0, null);
mService.setIconVisibility(SLOT_ALARM_CLOCK, false);
- // Sync state
- mService.setIcon(SLOT_SYNC_ACTIVE, R.drawable.stat_sys_sync, 0, null);
- mService.setIconVisibility(SLOT_SYNC_ACTIVE, false);
- // "sync_failing" is obsolete: b/1297963
-
// zen
mService.setIcon(SLOT_ZEN, R.drawable.stat_sys_zen_important, 0, null);
mService.setIconVisibility(SLOT_ZEN, false);
@@ -172,16 +155,10 @@
private void updateAlarm() {
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
- boolean alarmSet = alarmManager.getNextAlarmClock(UserHandle.USER_CURRENT) != null;
+ boolean alarmSet = alarmManager.getNextAlarmClock(UserHandle.USER_CURRENT) != null;
mService.setIconVisibility(SLOT_ALARM_CLOCK, alarmSet);
}
- private final void updateSyncState(Intent intent) {
- if (!SHOW_SYNC_ICON) return;
- boolean isActive = intent.getBooleanExtra("active", false);
- mService.setIconVisibility(SLOT_SYNC_ACTIVE, isActive);
- }
-
private final void updateSimState(Intent intent) {
String stateExtra = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
if (IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
index 7cbf13f..701c57f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
@@ -77,8 +77,8 @@
}
@Override
- public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) {
- if (super.onRequestSendAccessibilityEvent(child, event)) {
+ public boolean onRequestSendAccessibilityEventInternal(View child, AccessibilityEvent event) {
+ if (super.onRequestSendAccessibilityEventInternal(child, event)) {
// The status bar is very small so augment the view that the user is touching
// with the content of the status bar a whole. This way an accessibility service
// may announce the current item as well as the entire content if appropriate.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index f4edab5..3155efb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -187,10 +187,6 @@
mStatusBarWindowManager.setKeyguardNeedsInput(needsInput);
}
- public void updateUserActivityTimeout() {
- mStatusBarWindowManager.setKeyguardUserActivityTimeout(mBouncer.getUserActivityTimeout());
- }
-
public void setOccluded(boolean occluded) {
if (occluded && !mOccluded && mShowing) {
if (mPhoneStatusBar.isInLaunchTransition()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
index 0dbdca1..eba7d9f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
@@ -27,6 +27,7 @@
import android.view.WindowManager;
import com.android.keyguard.R;
+import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.statusbar.BaseStatusBar;
import com.android.systemui.statusbar.StatusBarState;
@@ -144,7 +145,7 @@
if (state.isKeyguardShowingAndNotOccluded()
&& state.statusBarState == StatusBarState.KEYGUARD
&& !state.qsExpanded) {
- mLpChanged.userActivityTimeout = state.keyguardUserActivityTimeout;
+ mLpChanged.userActivityTimeout = KeyguardViewMediator.AWAKE_INTERVAL_DEFAULT_MS;
} else {
mLpChanged.userActivityTimeout = -1;
}
@@ -201,11 +202,6 @@
apply(mCurrentState);
}
- public void setKeyguardUserActivityTimeout(long timeout) {
- mCurrentState.keyguardUserActivityTimeout = timeout;
- apply(mCurrentState);
- }
-
public void setBouncerShowing(boolean showing) {
mCurrentState.bouncerShowing = showing;
apply(mCurrentState);
@@ -235,7 +231,6 @@
boolean keyguardNeedsInput;
boolean statusBarExpanded;
boolean statusBarFocusable;
- long keyguardUserActivityTimeout;
boolean bouncerShowing;
boolean keyguardFadingAway;
boolean qsExpanded;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
index b9cc0f9..51e1154 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
@@ -121,7 +121,7 @@
}
@Override
- public boolean performAccessibilityAction(int action, Bundle arguments) {
+ public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
if (action == ACTION_CLICK && mCode != 0) {
sendEvent(KeyEvent.ACTION_DOWN, 0, SystemClock.uptimeMillis());
sendEvent(KeyEvent.ACTION_UP, 0);
@@ -134,7 +134,7 @@
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_LONG_CLICKED);
return true;
}
- return super.performAccessibilityAction(action, arguments);
+ return super.performAccessibilityActionInternal(action, arguments);
}
public void setQuiescentAlpha(float alpha, boolean animate) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
new file mode 100644
index 0000000..ac5602c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
@@ -0,0 +1,545 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.statusbar.policy;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.NetworkCapabilities;
+import android.telephony.PhoneStateListener;
+import android.telephony.ServiceState;
+import android.telephony.SignalStrength;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+import android.util.SparseArray;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.IccCardConstants;
+import com.android.internal.telephony.TelephonyIntents;
+import com.android.internal.telephony.cdma.EriInfo;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
+import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config;
+import com.android.systemui.statusbar.policy.NetworkControllerImpl.SignalCluster;
+
+import java.io.PrintWriter;
+import java.util.List;
+import java.util.Objects;
+
+
+public class MobileSignalController extends SignalController<
+ MobileSignalController.MobileState, MobileSignalController.MobileIconGroup> {
+ private final TelephonyManager mPhone;
+ private final String mNetworkNameDefault;
+ private final String mNetworkNameSeparator;
+ @VisibleForTesting
+ final PhoneStateListener mPhoneStateListener;
+ // Save entire info for logging, we only use the id.
+ private final SubscriptionInfo mSubscriptionInfo;
+
+ // @VisibleForDemoMode
+ final SparseArray<MobileIconGroup> mNetworkToIconLookup;
+
+ // Since some pieces of the phone state are interdependent we store it locally,
+ // this could potentially become part of MobileState for simplification/complication
+ // of code.
+ private IccCardConstants.State mSimState = IccCardConstants.State.READY;
+ private int mDataNetType = TelephonyManager.NETWORK_TYPE_UNKNOWN;
+ private int mDataState = TelephonyManager.DATA_DISCONNECTED;
+ private ServiceState mServiceState;
+ private SignalStrength mSignalStrength;
+ private MobileIconGroup mDefaultIcons;
+ private Config mConfig;
+
+ // TODO: Reduce number of vars passed in, if we have the NetworkController, probably don't
+ // need listener lists anymore.
+ public MobileSignalController(Context context, Config config, boolean hasMobileData,
+ TelephonyManager phone, List<NetworkSignalChangedCallback> signalCallbacks,
+ List<SignalCluster> signalClusters, NetworkControllerImpl networkController,
+ SubscriptionInfo info) {
+ super("MobileSignalController(" + info.getSubscriptionId() + ")", context,
+ NetworkCapabilities.TRANSPORT_CELLULAR, signalCallbacks, signalClusters,
+ networkController);
+ mNetworkToIconLookup = new SparseArray<>();
+ mConfig = config;
+ mPhone = phone;
+ mSubscriptionInfo = info;
+ mPhoneStateListener = new MobilePhoneStateListener(info.getSubscriptionId());
+ mNetworkNameSeparator = getStringIfExists(R.string.status_bar_network_name_separator);
+ mNetworkNameDefault = getStringIfExists(
+ com.android.internal.R.string.lockscreen_carrier_default);
+
+ mapIconSets();
+
+ mLastState.networkName = mCurrentState.networkName = mNetworkNameDefault;
+ mLastState.enabled = mCurrentState.enabled = hasMobileData;
+ mLastState.iconGroup = mCurrentState.iconGroup = mDefaultIcons;
+ // Get initial data sim state.
+ updateDataSim();
+ }
+
+ public void setConfiguration(Config config) {
+ mConfig = config;
+ mapIconSets();
+ updateTelephony();
+ }
+
+ /**
+ * Get (the mobile parts of) the carrier string.
+ *
+ * @param currentLabel can be used for concatenation, currently just empty
+ * @param connected whether the device has connection to the internet at all
+ * @param isMobileLabel whether to always return the network or just when data is connected
+ */
+ public String getLabel(String currentLabel, boolean connected, boolean isMobileLabel) {
+ if (!mCurrentState.enabled) {
+ return "";
+ } else {
+ String mobileLabel = "";
+ // We want to show the carrier name if in service and either:
+ // - We are connected to mobile data, or
+ // - We are not connected to mobile data, as long as the *reason* packets are not
+ // being routed over that link is that we have better connectivity via wifi.
+ // If data is disconnected for some other reason but wifi (or ethernet/bluetooth)
+ // is connected, we show nothing.
+ // Otherwise (nothing connected) we show "No internet connection".
+ if (mCurrentState.dataConnected) {
+ mobileLabel = mCurrentState.networkName;
+ } else if (connected || mCurrentState.isEmergency) {
+ if (mCurrentState.connected || mCurrentState.isEmergency) {
+ // The isEmergencyOnly test covers the case of a phone with no SIM
+ mobileLabel = mCurrentState.networkName;
+ }
+ } else {
+ mobileLabel = mContext.getString(
+ R.string.status_bar_settings_signal_meter_disconnected);
+ }
+
+ if (currentLabel.length() != 0) {
+ currentLabel = currentLabel + mNetworkNameSeparator;
+ }
+ // Now for things that should only be shown when actually using mobile data.
+ if (isMobileLabel) {
+ return currentLabel + mobileLabel;
+ } else {
+ return currentLabel
+ + (mCurrentState.dataConnected ? mobileLabel : currentLabel);
+ }
+ }
+ }
+
+ public int getDataContentDescription() {
+ return getIcons().mDataContentDescription;
+ }
+
+ @VisibleForTesting
+ protected IccCardConstants.State getSimState() {
+ return mSimState;
+ }
+
+ public void setAirplaneMode(boolean airplaneMode) {
+ mCurrentState.airplaneMode = airplaneMode;
+ notifyListenersIfNecessary();
+ }
+
+ public void setInetCondition(int inetCondition, int inetConditionForNetwork) {
+ // For mobile data, use general inet condition for phone signal indexing,
+ // and network specific for data indexing (I think this might be a bug, but
+ // keeping for now).
+ // TODO: Update with explanation of why.
+ mCurrentState.inetForNetwork = inetConditionForNetwork;
+ setInetCondition(inetCondition);
+ }
+
+ /**
+ * Start listening for phone state changes.
+ */
+ public void registerListener() {
+ mPhone.listen(mPhoneStateListener,
+ PhoneStateListener.LISTEN_SERVICE_STATE
+ | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
+ | PhoneStateListener.LISTEN_CALL_STATE
+ | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
+ | PhoneStateListener.LISTEN_DATA_ACTIVITY);
+ }
+
+ /**
+ * Stop listening for phone state changes.
+ */
+ public void unregisterListener() {
+ mPhone.listen(mPhoneStateListener, 0);
+ }
+
+ /**
+ * Produce a mapping of data network types to icon groups for simple and quick use in
+ * updateTelephony.
+ */
+ private void mapIconSets() {
+ mNetworkToIconLookup.clear();
+
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EVDO_0, TelephonyIcons.THREE_G);
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EVDO_A, TelephonyIcons.THREE_G);
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EVDO_B, TelephonyIcons.THREE_G);
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EHRPD, TelephonyIcons.THREE_G);
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_UMTS, TelephonyIcons.THREE_G);
+
+ if (!mConfig.showAtLeast3G) {
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_UNKNOWN,
+ TelephonyIcons.UNKNOWN);
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EDGE, TelephonyIcons.E);
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_CDMA, TelephonyIcons.ONE_X);
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_1xRTT, TelephonyIcons.ONE_X);
+
+ mDefaultIcons = TelephonyIcons.G;
+ } else {
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_UNKNOWN,
+ TelephonyIcons.THREE_G);
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EDGE,
+ TelephonyIcons.THREE_G);
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_CDMA,
+ TelephonyIcons.THREE_G);
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_1xRTT,
+ TelephonyIcons.THREE_G);
+ mDefaultIcons = TelephonyIcons.THREE_G;
+ }
+
+ MobileIconGroup hGroup = TelephonyIcons.THREE_G;
+ if (mConfig.hspaDataDistinguishable) {
+ hGroup = TelephonyIcons.H;
+ }
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSDPA, hGroup);
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSUPA, hGroup);
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSPA, hGroup);
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSPAP, hGroup);
+
+ if (mConfig.show4gForLte) {
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE, TelephonyIcons.FOUR_G);
+ } else {
+ mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE, TelephonyIcons.LTE);
+ }
+ }
+
+ @Override
+ public void notifyListeners() {
+ MobileIconGroup icons = getIcons();
+
+ String contentDescription = getStringIfExists(getContentDescription());
+ String dataContentDescription = getStringIfExists(icons.mDataContentDescription);
+ // Only send data sim callbacks to QS.
+ if (mCurrentState.dataSim) {
+ int qsTypeIcon = mCurrentState.dataConnected ?
+ icons.mQsDataType[mCurrentState.inetForNetwork] : 0;
+ int length = mSignalsChangedCallbacks.size();
+ for (int i = 0; i < length; i++) {
+ mSignalsChangedCallbacks.get(i).onMobileDataSignalChanged(mCurrentState.enabled
+ && !mCurrentState.isEmergency,
+ getQsCurrentIconId(), contentDescription,
+ qsTypeIcon,
+ mCurrentState.dataConnected && mCurrentState.activityIn,
+ mCurrentState.dataConnected && mCurrentState.activityOut,
+ dataContentDescription,
+ mCurrentState.isEmergency ? null : mCurrentState.networkName,
+ // Only wide if actually showing something.
+ icons.mIsWide && qsTypeIcon != 0);
+ }
+ }
+ boolean showDataIcon = mCurrentState.dataConnected && mCurrentState.inetForNetwork != 0
+ || mCurrentState.iconGroup == TelephonyIcons.ROAMING;
+ int typeIcon = showDataIcon ? icons.mDataType : 0;
+ int signalClustersLength = mSignalClusters.size();
+ for (int i = 0; i < signalClustersLength; i++) {
+ mSignalClusters.get(i).setMobileDataIndicators(
+ mCurrentState.enabled && !mCurrentState.airplaneMode,
+ getCurrentIconId(),
+ typeIcon,
+ contentDescription,
+ dataContentDescription,
+ // Only wide if actually showing something.
+ icons.mIsWide && typeIcon != 0,
+ mSubscriptionInfo.getSubscriptionId());
+ }
+ }
+
+ @Override
+ protected MobileState cleanState() {
+ return new MobileState();
+ }
+
+ private boolean hasService() {
+ if (mServiceState != null) {
+ // Consider the device to be in service if either voice or data
+ // service is available. Some SIM cards are marketed as data-only
+ // and do not support voice service, and on these SIM cards, we
+ // want to show signal bars for data service as well as the "no
+ // service" or "emergency calls only" text that indicates that voice
+ // is not available.
+ switch (mServiceState.getVoiceRegState()) {
+ case ServiceState.STATE_POWER_OFF:
+ return false;
+ case ServiceState.STATE_OUT_OF_SERVICE:
+ case ServiceState.STATE_EMERGENCY_ONLY:
+ return mServiceState.getDataRegState() == ServiceState.STATE_IN_SERVICE;
+ default:
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ private boolean isCdma() {
+ return (mSignalStrength != null) && !mSignalStrength.isGsm();
+ }
+
+ public boolean isEmergencyOnly() {
+ return (mServiceState != null && mServiceState.isEmergencyOnly());
+ }
+
+ private boolean isRoaming() {
+ if (isCdma()) {
+ final int iconMode = mServiceState.getCdmaEriIconMode();
+ return mServiceState.getCdmaEriIconIndex() != EriInfo.ROAMING_INDICATOR_OFF
+ && (iconMode == EriInfo.ROAMING_ICON_MODE_NORMAL
+ || iconMode == EriInfo.ROAMING_ICON_MODE_FLASH);
+ } else {
+ return mServiceState != null && mServiceState.getRoaming();
+ }
+ }
+
+ public void handleBroadcast(Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION)) {
+ updateNetworkName(intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_SPN, false),
+ intent.getStringExtra(TelephonyIntents.EXTRA_SPN),
+ intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_PLMN, false),
+ intent.getStringExtra(TelephonyIntents.EXTRA_PLMN));
+ notifyListenersIfNecessary();
+ } else if (action.equals(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED)) {
+ updateDataSim();
+ }
+ }
+
+ private void updateDataSim() {
+ int defaultDataSub = SubscriptionManager.getDefaultDataSubId();
+ if (SubscriptionManager.isValidSubscriptionId(defaultDataSub)) {
+ mCurrentState.dataSim = defaultDataSub == mSubscriptionInfo.getSubscriptionId();
+ } else {
+ // There doesn't seem to be a data sim selected, however if
+ // there isn't a MobileSignalController with dataSim set, then
+ // QS won't get any callbacks and will be blank. Instead
+ // lets just assume we are the data sim (which will basically
+ // show one at random) in QS until one is selected. The user
+ // should pick one soon after, so we shouldn't be in this state
+ // for long.
+ mCurrentState.dataSim = true;
+ }
+ notifyListenersIfNecessary();
+ }
+
+ /**
+ * Updates the network's name based on incoming spn and plmn.
+ */
+ void updateNetworkName(boolean showSpn, String spn, boolean showPlmn, String plmn) {
+ if (CHATTY) {
+ Log.d("CarrierLabel", "updateNetworkName showSpn=" + showSpn + " spn=" + spn
+ + " showPlmn=" + showPlmn + " plmn=" + plmn);
+ }
+ StringBuilder str = new StringBuilder();
+ if (showPlmn && plmn != null) {
+ str.append(plmn);
+ }
+ if (showSpn && spn != null) {
+ if (str.length() != 0) {
+ str.append(mNetworkNameSeparator);
+ }
+ str.append(spn);
+ }
+ if (str.length() != 0) {
+ mCurrentState.networkName = str.toString();
+ } else {
+ mCurrentState.networkName = mNetworkNameDefault;
+ }
+ }
+
+ /**
+ * Updates the current state based on mServiceState, mSignalStrength, mDataNetType,
+ * mDataState, and mSimState. It should be called any time one of these is updated.
+ * This will call listeners if necessary.
+ */
+ private final void updateTelephony() {
+ if (DEBUG) {
+ Log.d(mTag, "updateTelephonySignalStrength: hasService=" + hasService()
+ + " ss=" + mSignalStrength);
+ }
+ mCurrentState.connected = hasService() && mSignalStrength != null;
+ if (mCurrentState.connected) {
+ if (!mSignalStrength.isGsm() && mConfig.alwaysShowCdmaRssi) {
+ mCurrentState.level = mSignalStrength.getCdmaLevel();
+ } else {
+ mCurrentState.level = mSignalStrength.getLevel();
+ }
+ }
+ if (mNetworkToIconLookup.indexOfKey(mDataNetType) >= 0) {
+ mCurrentState.iconGroup = mNetworkToIconLookup.get(mDataNetType);
+ } else {
+ mCurrentState.iconGroup = mDefaultIcons;
+ }
+ mCurrentState.dataConnected = mCurrentState.connected
+ && mDataState == TelephonyManager.DATA_CONNECTED;
+
+ if (isRoaming()) {
+ mCurrentState.iconGroup = TelephonyIcons.ROAMING;
+ }
+ if (isEmergencyOnly() != mCurrentState.isEmergency) {
+ mCurrentState.isEmergency = isEmergencyOnly();
+ mNetworkController.recalculateEmergency();
+ }
+ // Fill in the network name if we think we have it.
+ if (mCurrentState.networkName == mNetworkNameDefault && mServiceState != null
+ && mServiceState.getOperatorAlphaShort() != null) {
+ mCurrentState.networkName = mServiceState.getOperatorAlphaShort();
+ }
+ notifyListenersIfNecessary();
+ }
+
+ @VisibleForTesting
+ void setActivity(int activity) {
+ mCurrentState.activityIn = activity == TelephonyManager.DATA_ACTIVITY_INOUT
+ || activity == TelephonyManager.DATA_ACTIVITY_IN;
+ mCurrentState.activityOut = activity == TelephonyManager.DATA_ACTIVITY_INOUT
+ || activity == TelephonyManager.DATA_ACTIVITY_OUT;
+ notifyListenersIfNecessary();
+ }
+
+ @Override
+ public void dump(PrintWriter pw) {
+ super.dump(pw);
+ pw.println(" mSubscription=" + mSubscriptionInfo + ",");
+ pw.println(" mServiceState=" + mServiceState + ",");
+ pw.println(" mSignalStrength=" + mSignalStrength + ",");
+ pw.println(" mDataState=" + mDataState + ",");
+ pw.println(" mDataNetType=" + mDataNetType + ",");
+ }
+
+ class MobilePhoneStateListener extends PhoneStateListener {
+ public MobilePhoneStateListener(int subId) {
+ super(subId);
+ }
+
+ @Override
+ public void onSignalStrengthsChanged(SignalStrength signalStrength) {
+ if (DEBUG) {
+ Log.d(mTag, "onSignalStrengthsChanged signalStrength=" + signalStrength +
+ ((signalStrength == null) ? "" : (" level=" + signalStrength.getLevel())));
+ }
+ mSignalStrength = signalStrength;
+ updateTelephony();
+ }
+
+ @Override
+ public void onServiceStateChanged(ServiceState state) {
+ if (DEBUG) {
+ Log.d(mTag, "onServiceStateChanged voiceState=" + state.getVoiceRegState()
+ + " dataState=" + state.getDataRegState());
+ }
+ mServiceState = state;
+ updateTelephony();
+ }
+
+ @Override
+ public void onDataConnectionStateChanged(int state, int networkType) {
+ if (DEBUG) {
+ Log.d(mTag, "onDataConnectionStateChanged: state=" + state
+ + " type=" + networkType);
+ }
+ mDataState = state;
+ mDataNetType = networkType;
+ updateTelephony();
+ }
+
+ @Override
+ public void onDataActivity(int direction) {
+ if (DEBUG) {
+ Log.d(mTag, "onDataActivity: direction=" + direction);
+ }
+ setActivity(direction);
+ }
+ };
+
+ static class MobileIconGroup extends SignalController.IconGroup {
+ final int mDataContentDescription; // mContentDescriptionDataType
+ final int mDataType;
+ final boolean mIsWide;
+ final int[] mQsDataType;
+
+ public MobileIconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc,
+ int sbNullState, int qsNullState, int sbDiscState, int qsDiscState,
+ int discContentDesc, int dataContentDesc, int dataType, boolean isWide,
+ int[] qsDataType) {
+ super(name, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState, sbDiscState,
+ qsDiscState, discContentDesc);
+ mDataContentDescription = dataContentDesc;
+ mDataType = dataType;
+ mIsWide = isWide;
+ mQsDataType = qsDataType;
+ }
+ }
+
+ static class MobileState extends SignalController.State {
+ String networkName;
+ boolean dataSim;
+ boolean dataConnected;
+ boolean isEmergency;
+ boolean airplaneMode;
+ int inetForNetwork;
+
+ @Override
+ public void copyFrom(State s) {
+ super.copyFrom(s);
+ MobileState state = (MobileState) s;
+ dataSim = state.dataSim;
+ networkName = state.networkName;
+ dataConnected = state.dataConnected;
+ inetForNetwork = state.inetForNetwork;
+ isEmergency = state.isEmergency;
+ airplaneMode = state.airplaneMode;
+ }
+
+ @Override
+ protected void toString(StringBuilder builder) {
+ super.toString(builder);
+ builder.append(',');
+ builder.append("dataSim=").append(dataSim).append(',');
+ builder.append("networkName=").append(networkName).append(',');
+ builder.append("dataConnected=").append(dataConnected).append(',');
+ builder.append("inetForNetwork=").append(inetForNetwork).append(',');
+ builder.append("isEmergency=").append(isEmergency).append(',');
+ builder.append("airplaneMode=").append(airplaneMode);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ return super.equals(o)
+ && Objects.equals(((MobileState) o).networkName, networkName)
+ && ((MobileState) o).dataSim == dataSim
+ && ((MobileState) o).dataConnected == dataConnected
+ && ((MobileState) o).isEmergency == isEmergency
+ && ((MobileState) o).airplaneMode == airplaneMode
+ && ((MobileState) o).inetForNetwork == inetForNetwork;
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index 3642eae..1d37ee3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -18,9 +18,8 @@
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
import static android.net.NetworkCapabilities.TRANSPORT_BLUETOOTH;
-import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET;
-import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -28,34 +27,20 @@
import android.content.res.Resources;
import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
-import android.net.NetworkInfo;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Messenger;
import android.provider.Settings;
-import android.telephony.PhoneStateListener;
-import android.telephony.ServiceState;
-import android.telephony.SignalStrength;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
-import android.text.format.DateFormat;
import android.util.Log;
-import android.util.SparseArray;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.TelephonyIntents;
-import com.android.internal.telephony.cdma.EriInfo;
-import com.android.internal.util.AsyncChannel;
import com.android.systemui.DemoMode;
import com.android.systemui.R;
@@ -69,7 +54,6 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
-import java.util.Objects;
/** Platform implementation of the network controller. **/
public class NetworkControllerImpl extends BroadcastReceiver
@@ -79,12 +63,6 @@
static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
// additional diagnostics, but not logspew
static final boolean CHATTY = Log.isLoggable(TAG + ".Chat", Log.DEBUG);
- // Save the previous SignalController.States of all SignalControllers for dumps.
- static final boolean RECORD_HISTORY = true;
- // If RECORD_HISTORY how many to save, must be a power of 2.
- static final int HISTORY_SIZE = 16;
-
- private static final int INET_CONDITION_THRESHOLD = 50;
private final Context mContext;
private final TelephonyManager mPhone;
@@ -195,7 +173,7 @@
for (MobileSignalController mobileSignalController : mMobileSignalControllers.values()) {
mobileSignalController.registerListener();
}
- mSubscriptionManager.registerOnSubscriptionsChangedListener(mSubscriptionListener);
+ mSubscriptionManager.addOnSubscriptionsChangedListener(mSubscriptionListener);
// broadcasts
IntentFilter filter = new IntentFilter();
@@ -221,7 +199,7 @@
for (MobileSignalController mobileSignalController : mMobileSignalControllers.values()) {
mobileSignalController.unregisterListener();
}
- mSubscriptionManager.unregisterOnSubscriptionsChangedListener(mSubscriptionListener);
+ mSubscriptionManager.removeOnSubscriptionsChangedListener(mSubscriptionListener);
mContext.unregisterReceiver(this);
}
@@ -821,969 +799,6 @@
};
};
- // TODO: Move to its own file.
- static class WifiSignalController extends
- SignalController<WifiSignalController.WifiState, SignalController.IconGroup> {
- private final WifiManager mWifiManager;
- private final AsyncChannel mWifiChannel;
- private final boolean mHasMobileData;
-
- public WifiSignalController(Context context, boolean hasMobileData,
- List<NetworkSignalChangedCallback> signalCallbacks,
- List<SignalCluster> signalClusters, NetworkControllerImpl networkController) {
- super("WifiSignalController", context, NetworkCapabilities.TRANSPORT_WIFI,
- signalCallbacks, signalClusters, networkController);
- mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
- mHasMobileData = hasMobileData;
- Handler handler = new WifiHandler();
- mWifiChannel = new AsyncChannel();
- Messenger wifiMessenger = mWifiManager.getWifiServiceMessenger();
- if (wifiMessenger != null) {
- mWifiChannel.connect(context, handler, wifiMessenger);
- }
- // WiFi only has one state.
- mCurrentState.iconGroup = mLastState.iconGroup = new IconGroup(
- "Wi-Fi Icons",
- WifiIcons.WIFI_SIGNAL_STRENGTH,
- WifiIcons.QS_WIFI_SIGNAL_STRENGTH,
- AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH,
- WifiIcons.WIFI_NO_NETWORK,
- WifiIcons.QS_WIFI_NO_NETWORK,
- WifiIcons.WIFI_NO_NETWORK,
- WifiIcons.QS_WIFI_NO_NETWORK,
- AccessibilityContentDescriptions.WIFI_NO_CONNECTION
- );
- }
-
- @Override
- protected WifiState cleanState() {
- return new WifiState();
- }
-
- @Override
- public void notifyListeners() {
- // only show wifi in the cluster if connected or if wifi-only
- boolean wifiVisible = mCurrentState.enabled
- && (mCurrentState.connected || !mHasMobileData);
- String wifiDesc = wifiVisible ? mCurrentState.ssid : null;
- boolean ssidPresent = wifiVisible && mCurrentState.ssid != null;
- String contentDescription = getStringIfExists(getContentDescription());
- int length = mSignalsChangedCallbacks.size();
- for (int i = 0; i < length; i++) {
- mSignalsChangedCallbacks.get(i).onWifiSignalChanged(mCurrentState.enabled,
- mCurrentState.connected, getQsCurrentIconId(),
- ssidPresent && mCurrentState.activityIn,
- ssidPresent && mCurrentState.activityOut, contentDescription, wifiDesc);
- }
-
- int signalClustersLength = mSignalClusters.size();
- for (int i = 0; i < signalClustersLength; i++) {
- mSignalClusters.get(i).setWifiIndicators(wifiVisible, getCurrentIconId(),
- contentDescription);
- }
- }
-
- /**
- * Extract wifi state directly from broadcasts about changes in wifi state.
- */
- public void handleBroadcast(Intent intent) {
- String action = intent.getAction();
- if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
- mCurrentState.enabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
- WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED;
- } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
- final NetworkInfo networkInfo = (NetworkInfo)
- intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
- mCurrentState.connected = networkInfo != null && networkInfo.isConnected();
- // If Connected grab the signal strength and ssid.
- if (mCurrentState.connected) {
- // try getting it out of the intent first
- WifiInfo info = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO) != null
- ? (WifiInfo) intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO)
- : mWifiManager.getConnectionInfo();
- if (info != null) {
- mCurrentState.ssid = getSsid(info);
- } else {
- mCurrentState.ssid = null;
- }
- } else if (!mCurrentState.connected) {
- mCurrentState.ssid = null;
- }
- } else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
- // Default to -200 as its below WifiManager.MIN_RSSI.
- mCurrentState.rssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
- mCurrentState.level = WifiManager.calculateSignalLevel(
- mCurrentState.rssi, WifiIcons.WIFI_LEVEL_COUNT);
- }
-
- notifyListenersIfNecessary();
- }
-
- private String getSsid(WifiInfo info) {
- String ssid = info.getSSID();
- if (ssid != null) {
- return ssid;
- }
- // OK, it's not in the connectionInfo; we have to go hunting for it
- List<WifiConfiguration> networks = mWifiManager.getConfiguredNetworks();
- int length = networks.size();
- for (int i = 0; i < length; i++) {
- if (networks.get(i).networkId == info.getNetworkId()) {
- return networks.get(i).SSID;
- }
- }
- return null;
- }
-
- @VisibleForTesting
- void setActivity(int wifiActivity) {
- mCurrentState.activityIn = wifiActivity == WifiManager.DATA_ACTIVITY_INOUT
- || wifiActivity == WifiManager.DATA_ACTIVITY_IN;
- mCurrentState.activityOut = wifiActivity == WifiManager.DATA_ACTIVITY_INOUT
- || wifiActivity == WifiManager.DATA_ACTIVITY_OUT;
- notifyListenersIfNecessary();
- }
-
- /**
- * Handler to receive the data activity on wifi.
- */
- class WifiHandler extends Handler {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED:
- if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) {
- mWifiChannel.sendMessage(Message.obtain(this,
- AsyncChannel.CMD_CHANNEL_FULL_CONNECTION));
- } else {
- Log.e(mTag, "Failed to connect to wifi");
- }
- break;
- case WifiManager.DATA_ACTIVITY_NOTIFICATION:
- setActivity(msg.arg1);
- break;
- default:
- // Ignore
- break;
- }
- }
- }
-
- static class WifiState extends SignalController.State {
- String ssid;
-
- @Override
- public void copyFrom(State s) {
- super.copyFrom(s);
- WifiState state = (WifiState) s;
- ssid = state.ssid;
- }
-
- @Override
- protected void toString(StringBuilder builder) {
- super.toString(builder);
- builder.append(',').append("ssid=").append(ssid);
- }
-
- @Override
- public boolean equals(Object o) {
- return super.equals(o)
- && Objects.equals(((WifiState) o).ssid, ssid);
- }
- }
- }
-
- // TODO: Move to its own file.
- public static class MobileSignalController extends SignalController<
- MobileSignalController.MobileState, MobileSignalController.MobileIconGroup> {
- private final TelephonyManager mPhone;
- private final String mNetworkNameDefault;
- private final String mNetworkNameSeparator;
- @VisibleForTesting
- final PhoneStateListener mPhoneStateListener;
- // Save entire info for logging, we only use the id.
- private final SubscriptionInfo mSubscriptionInfo;
-
- // @VisibleForDemoMode
- final SparseArray<MobileIconGroup> mNetworkToIconLookup;
-
- // Since some pieces of the phone state are interdependent we store it locally,
- // this could potentially become part of MobileState for simplification/complication
- // of code.
- private IccCardConstants.State mSimState = IccCardConstants.State.READY;
- private int mDataNetType = TelephonyManager.NETWORK_TYPE_UNKNOWN;
- private int mDataState = TelephonyManager.DATA_DISCONNECTED;
- private ServiceState mServiceState;
- private SignalStrength mSignalStrength;
- private MobileIconGroup mDefaultIcons;
- private Config mConfig;
-
- // TODO: Reduce number of vars passed in, if we have the NetworkController, probably don't
- // need listener lists anymore.
- public MobileSignalController(Context context, Config config, boolean hasMobileData,
- TelephonyManager phone, List<NetworkSignalChangedCallback> signalCallbacks,
- List<SignalCluster> signalClusters, NetworkControllerImpl networkController,
- SubscriptionInfo info) {
- super("MobileSignalController(" + info.getSubscriptionId() + ")", context,
- NetworkCapabilities.TRANSPORT_CELLULAR, signalCallbacks, signalClusters,
- networkController);
- mNetworkToIconLookup = new SparseArray<>();
- mConfig = config;
- mPhone = phone;
- mSubscriptionInfo = info;
- mPhoneStateListener = new MobilePhoneStateListener(info.getSubscriptionId());
- mNetworkNameSeparator = getStringIfExists(R.string.status_bar_network_name_separator);
- mNetworkNameDefault = getStringIfExists(
- com.android.internal.R.string.lockscreen_carrier_default);
-
- mapIconSets();
-
- mLastState.networkName = mCurrentState.networkName = mNetworkNameDefault;
- mLastState.enabled = mCurrentState.enabled = hasMobileData;
- mLastState.iconGroup = mCurrentState.iconGroup = mDefaultIcons;
- // Get initial data sim state.
- updateDataSim();
- }
-
- public void setConfiguration(Config config) {
- mConfig = config;
- mapIconSets();
- updateTelephony();
- }
-
- /**
- * Get (the mobile parts of) the carrier string.
- *
- * @param currentLabel can be used for concatenation, currently just empty
- * @param connected whether the device has connection to the internet at all
- * @param isMobileLabel whether to always return the network or just when data is connected
- */
- public String getLabel(String currentLabel, boolean connected, boolean isMobileLabel) {
- if (!mCurrentState.enabled) {
- return "";
- } else {
- String mobileLabel = "";
- // We want to show the carrier name if in service and either:
- // - We are connected to mobile data, or
- // - We are not connected to mobile data, as long as the *reason* packets are not
- // being routed over that link is that we have better connectivity via wifi.
- // If data is disconnected for some other reason but wifi (or ethernet/bluetooth)
- // is connected, we show nothing.
- // Otherwise (nothing connected) we show "No internet connection".
- if (mCurrentState.dataConnected) {
- mobileLabel = mCurrentState.networkName;
- } else if (connected || mCurrentState.isEmergency) {
- if (mCurrentState.connected || mCurrentState.isEmergency) {
- // The isEmergencyOnly test covers the case of a phone with no SIM
- mobileLabel = mCurrentState.networkName;
- }
- } else {
- mobileLabel = mContext.getString(
- R.string.status_bar_settings_signal_meter_disconnected);
- }
-
- if (currentLabel.length() != 0) {
- currentLabel = currentLabel + mNetworkNameSeparator;
- }
- // Now for things that should only be shown when actually using mobile data.
- if (isMobileLabel) {
- return currentLabel + mobileLabel;
- } else {
- return currentLabel
- + (mCurrentState.dataConnected ? mobileLabel : currentLabel);
- }
- }
- }
-
- public int getDataContentDescription() {
- return getIcons().mDataContentDescription;
- }
-
- @VisibleForTesting
- protected IccCardConstants.State getSimState() {
- return mSimState;
- }
-
- public void setAirplaneMode(boolean airplaneMode) {
- mCurrentState.airplaneMode = airplaneMode;
- notifyListenersIfNecessary();
- }
-
- public void setInetCondition(int inetCondition, int inetConditionForNetwork) {
- // For mobile data, use general inet condition for phone signal indexing,
- // and network specific for data indexing (I think this might be a bug, but
- // keeping for now).
- // TODO: Update with explanation of why.
- mCurrentState.inetForNetwork = inetConditionForNetwork;
- setInetCondition(inetCondition);
- }
-
- /**
- * Start listening for phone state changes.
- */
- public void registerListener() {
- mPhone.listen(mPhoneStateListener,
- PhoneStateListener.LISTEN_SERVICE_STATE
- | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
- | PhoneStateListener.LISTEN_CALL_STATE
- | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
- | PhoneStateListener.LISTEN_DATA_ACTIVITY);
- }
-
- /**
- * Stop listening for phone state changes.
- */
- public void unregisterListener() {
- mPhone.listen(mPhoneStateListener, 0);
- }
-
- /**
- * Produce a mapping of data network types to icon groups for simple and quick use in
- * updateTelephony.
- */
- private void mapIconSets() {
- mNetworkToIconLookup.clear();
-
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EVDO_0, TelephonyIcons.THREE_G);
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EVDO_A, TelephonyIcons.THREE_G);
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EVDO_B, TelephonyIcons.THREE_G);
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EHRPD, TelephonyIcons.THREE_G);
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_UMTS, TelephonyIcons.THREE_G);
-
- if (!mConfig.showAtLeast3G) {
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_UNKNOWN,
- TelephonyIcons.UNKNOWN);
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EDGE, TelephonyIcons.E);
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_CDMA, TelephonyIcons.ONE_X);
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_1xRTT, TelephonyIcons.ONE_X);
-
- mDefaultIcons = TelephonyIcons.G;
- } else {
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_UNKNOWN,
- TelephonyIcons.THREE_G);
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EDGE,
- TelephonyIcons.THREE_G);
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_CDMA,
- TelephonyIcons.THREE_G);
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_1xRTT,
- TelephonyIcons.THREE_G);
- mDefaultIcons = TelephonyIcons.THREE_G;
- }
-
- MobileIconGroup hGroup = TelephonyIcons.THREE_G;
- if (mConfig.hspaDataDistinguishable) {
- hGroup = TelephonyIcons.H;
- }
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSDPA, hGroup);
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSUPA, hGroup);
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSPA, hGroup);
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSPAP, hGroup);
-
- if (mConfig.show4gForLte) {
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE, TelephonyIcons.FOUR_G);
- } else {
- mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE, TelephonyIcons.LTE);
- }
- }
-
- @Override
- public void notifyListeners() {
- MobileIconGroup icons = getIcons();
-
- String contentDescription = getStringIfExists(getContentDescription());
- String dataContentDescription = getStringIfExists(icons.mDataContentDescription);
- // Only send data sim callbacks to QS.
- if (mCurrentState.dataSim) {
- int qsTypeIcon = mCurrentState.dataConnected ?
- icons.mQsDataType[mCurrentState.inetForNetwork] : 0;
- int length = mSignalsChangedCallbacks.size();
- for (int i = 0; i < length; i++) {
- mSignalsChangedCallbacks.get(i).onMobileDataSignalChanged(mCurrentState.enabled
- && !mCurrentState.isEmergency && !mCurrentState.airplaneMode,
- getQsCurrentIconId(), contentDescription,
- qsTypeIcon,
- mCurrentState.dataConnected && mCurrentState.activityIn,
- mCurrentState.dataConnected && mCurrentState.activityOut,
- dataContentDescription,
- mCurrentState.isEmergency ? null : mCurrentState.networkName,
- // Only wide if actually showing something.
- icons.mIsWide && qsTypeIcon != 0);
- }
- }
- boolean showDataIcon = mCurrentState.dataConnected && mCurrentState.inetForNetwork != 0
- || mCurrentState.iconGroup == TelephonyIcons.ROAMING;
- int typeIcon = showDataIcon ? icons.mDataType : 0;
- int signalClustersLength = mSignalClusters.size();
- for (int i = 0; i < signalClustersLength; i++) {
- mSignalClusters.get(i).setMobileDataIndicators(
- mCurrentState.enabled && !mCurrentState.airplaneMode,
- getCurrentIconId(),
- typeIcon,
- contentDescription,
- dataContentDescription,
- // Only wide if actually showing something.
- icons.mIsWide && typeIcon != 0,
- mSubscriptionInfo.getSubscriptionId());
- }
- }
-
- @Override
- protected MobileState cleanState() {
- return new MobileState();
- }
-
- private boolean hasService() {
- if (mServiceState != null) {
- // Consider the device to be in service if either voice or data
- // service is available. Some SIM cards are marketed as data-only
- // and do not support voice service, and on these SIM cards, we
- // want to show signal bars for data service as well as the "no
- // service" or "emergency calls only" text that indicates that voice
- // is not available.
- switch (mServiceState.getVoiceRegState()) {
- case ServiceState.STATE_POWER_OFF:
- return false;
- case ServiceState.STATE_OUT_OF_SERVICE:
- case ServiceState.STATE_EMERGENCY_ONLY:
- return mServiceState.getDataRegState() == ServiceState.STATE_IN_SERVICE;
- default:
- return true;
- }
- } else {
- return false;
- }
- }
-
- private boolean isCdma() {
- return (mSignalStrength != null) && !mSignalStrength.isGsm();
- }
-
- public boolean isEmergencyOnly() {
- return (mServiceState != null && mServiceState.isEmergencyOnly());
- }
-
- private boolean isRoaming() {
- if (isCdma()) {
- final int iconMode = mServiceState.getCdmaEriIconMode();
- return mServiceState.getCdmaEriIconIndex() != EriInfo.ROAMING_INDICATOR_OFF
- && (iconMode == EriInfo.ROAMING_ICON_MODE_NORMAL
- || iconMode == EriInfo.ROAMING_ICON_MODE_FLASH);
- } else {
- return mServiceState != null && mServiceState.getRoaming();
- }
- }
-
- public void handleBroadcast(Intent intent) {
- String action = intent.getAction();
- if (action.equals(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION)) {
- updateNetworkName(intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_SPN, false),
- intent.getStringExtra(TelephonyIntents.EXTRA_SPN),
- intent.getBooleanExtra(TelephonyIntents.EXTRA_SHOW_PLMN, false),
- intent.getStringExtra(TelephonyIntents.EXTRA_PLMN));
- notifyListenersIfNecessary();
- } else if (action.equals(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED)) {
- updateDataSim();
- }
- }
-
- private void updateDataSim() {
- int defaultDataSub = SubscriptionManager.getDefaultDataSubId();
- if (SubscriptionManager.isValidSubscriptionId(defaultDataSub)) {
- mCurrentState.dataSim = defaultDataSub == mSubscriptionInfo.getSubscriptionId();
- } else {
- // There doesn't seem to be a data sim selected, however if
- // there isn't a MobileSignalController with dataSim set, then
- // QS won't get any callbacks and will be blank. Instead
- // lets just assume we are the data sim (which will basically
- // show one at random) in QS until one is selected. The user
- // should pick one soon after, so we shouldn't be in this state
- // for long.
- mCurrentState.dataSim = true;
- }
- notifyListenersIfNecessary();
- }
-
- /**
- * Updates the network's name based on incoming spn and plmn.
- */
- void updateNetworkName(boolean showSpn, String spn, boolean showPlmn, String plmn) {
- if (CHATTY) {
- Log.d("CarrierLabel", "updateNetworkName showSpn=" + showSpn + " spn=" + spn
- + " showPlmn=" + showPlmn + " plmn=" + plmn);
- }
- StringBuilder str = new StringBuilder();
- if (showPlmn && plmn != null) {
- str.append(plmn);
- }
- if (showSpn && spn != null) {
- if (str.length() != 0) {
- str.append(mNetworkNameSeparator);
- }
- str.append(spn);
- }
- if (str.length() != 0) {
- mCurrentState.networkName = str.toString();
- } else {
- mCurrentState.networkName = mNetworkNameDefault;
- }
- }
-
- /**
- * Updates the current state based on mServiceState, mSignalStrength, mDataNetType,
- * mDataState, and mSimState. It should be called any time one of these is updated.
- * This will call listeners if necessary.
- */
- private final void updateTelephony() {
- if (DEBUG) {
- Log.d(TAG, "updateTelephonySignalStrength: hasService=" + hasService()
- + " ss=" + mSignalStrength);
- }
- mCurrentState.connected = hasService() && mSignalStrength != null;
- if (mCurrentState.connected) {
- if (!mSignalStrength.isGsm() && mConfig.alwaysShowCdmaRssi) {
- mCurrentState.level = mSignalStrength.getCdmaLevel();
- } else {
- mCurrentState.level = mSignalStrength.getLevel();
- }
- }
- if (mNetworkToIconLookup.indexOfKey(mDataNetType) >= 0) {
- mCurrentState.iconGroup = mNetworkToIconLookup.get(mDataNetType);
- } else {
- mCurrentState.iconGroup = mDefaultIcons;
- }
- mCurrentState.dataConnected = mCurrentState.connected
- && mDataState == TelephonyManager.DATA_CONNECTED;
-
- if (isRoaming()) {
- mCurrentState.iconGroup = TelephonyIcons.ROAMING;
- }
- if (isEmergencyOnly() != mCurrentState.isEmergency) {
- mCurrentState.isEmergency = isEmergencyOnly();
- mNetworkController.recalculateEmergency();
- }
- // Fill in the network name if we think we have it.
- if (mCurrentState.networkName == mNetworkNameDefault && mServiceState != null
- && mServiceState.getOperatorAlphaShort() != null) {
- mCurrentState.networkName = mServiceState.getOperatorAlphaShort();
- }
- notifyListenersIfNecessary();
- }
-
- @VisibleForTesting
- void setActivity(int activity) {
- mCurrentState.activityIn = activity == TelephonyManager.DATA_ACTIVITY_INOUT
- || activity == TelephonyManager.DATA_ACTIVITY_IN;
- mCurrentState.activityOut = activity == TelephonyManager.DATA_ACTIVITY_INOUT
- || activity == TelephonyManager.DATA_ACTIVITY_OUT;
- notifyListenersIfNecessary();
- }
-
- @Override
- public void dump(PrintWriter pw) {
- super.dump(pw);
- pw.println(" mSubscription=" + mSubscriptionInfo + ",");
- pw.println(" mServiceState=" + mServiceState + ",");
- pw.println(" mSignalStrength=" + mSignalStrength + ",");
- pw.println(" mDataState=" + mDataState + ",");
- pw.println(" mDataNetType=" + mDataNetType + ",");
- }
-
- class MobilePhoneStateListener extends PhoneStateListener {
- public MobilePhoneStateListener(int subId) {
- super(subId);
- }
-
- @Override
- public void onSignalStrengthsChanged(SignalStrength signalStrength) {
- if (DEBUG) {
- Log.d(mTag, "onSignalStrengthsChanged signalStrength=" + signalStrength +
- ((signalStrength == null) ? "" : (" level=" + signalStrength.getLevel())));
- }
- mSignalStrength = signalStrength;
- updateTelephony();
- }
-
- @Override
- public void onServiceStateChanged(ServiceState state) {
- if (DEBUG) {
- Log.d(mTag, "onServiceStateChanged voiceState=" + state.getVoiceRegState()
- + " dataState=" + state.getDataRegState());
- }
- mServiceState = state;
- updateTelephony();
- }
-
- @Override
- public void onDataConnectionStateChanged(int state, int networkType) {
- if (DEBUG) {
- Log.d(mTag, "onDataConnectionStateChanged: state=" + state
- + " type=" + networkType);
- }
- mDataState = state;
- mDataNetType = networkType;
- updateTelephony();
- }
-
- @Override
- public void onDataActivity(int direction) {
- if (DEBUG) {
- Log.d(mTag, "onDataActivity: direction=" + direction);
- }
- setActivity(direction);
- }
- };
-
- static class MobileIconGroup extends SignalController.IconGroup {
- final int mDataContentDescription; // mContentDescriptionDataType
- final int mDataType;
- final boolean mIsWide;
- final int[] mQsDataType;
-
- public MobileIconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc,
- int sbNullState, int qsNullState, int sbDiscState, int qsDiscState,
- int discContentDesc, int dataContentDesc, int dataType, boolean isWide,
- int[] qsDataType) {
- super(name, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState, sbDiscState,
- qsDiscState, discContentDesc);
- mDataContentDescription = dataContentDesc;
- mDataType = dataType;
- mIsWide = isWide;
- mQsDataType = qsDataType;
- }
- }
-
- static class MobileState extends SignalController.State {
- String networkName;
- boolean dataSim;
- boolean dataConnected;
- boolean isEmergency;
- boolean airplaneMode;
- int inetForNetwork;
-
- @Override
- public void copyFrom(State s) {
- super.copyFrom(s);
- MobileState state = (MobileState) s;
- dataSim = state.dataSim;
- networkName = state.networkName;
- dataConnected = state.dataConnected;
- inetForNetwork = state.inetForNetwork;
- isEmergency = state.isEmergency;
- airplaneMode = state.airplaneMode;
- }
-
- @Override
- protected void toString(StringBuilder builder) {
- super.toString(builder);
- builder.append(',');
- builder.append("dataSim=").append(dataSim).append(',');
- builder.append("networkName=").append(networkName).append(',');
- builder.append("dataConnected=").append(dataConnected).append(',');
- builder.append("inetForNetwork=").append(inetForNetwork).append(',');
- builder.append("isEmergency=").append(isEmergency).append(',');
- builder.append("airplaneMode=").append(airplaneMode);
- }
-
- @Override
- public boolean equals(Object o) {
- return super.equals(o)
- && Objects.equals(((MobileState) o).networkName, networkName)
- && ((MobileState) o).dataSim == dataSim
- && ((MobileState) o).dataConnected == dataConnected
- && ((MobileState) o).isEmergency == isEmergency
- && ((MobileState) o).airplaneMode == airplaneMode
- && ((MobileState) o).inetForNetwork == inetForNetwork;
- }
- }
- }
-
- /**
- * Common base class for handling signal for both wifi and mobile data.
- */
- static abstract class SignalController<T extends SignalController.State,
- I extends SignalController.IconGroup> {
- protected final String mTag;
- protected final T mCurrentState;
- protected final T mLastState;
- protected final int mTransportType;
- protected final Context mContext;
- // The owner of the SignalController (i.e. NetworkController will maintain the following
- // lists and call notifyListeners whenever the list has changed to ensure everyone
- // is aware of current state.
- protected final List<NetworkSignalChangedCallback> mSignalsChangedCallbacks;
- protected final List<SignalCluster> mSignalClusters;
- protected final NetworkControllerImpl mNetworkController;
-
- // Save the previous HISTORY_SIZE states for logging.
- private final State[] mHistory;
- // Where to copy the next state into.
- private int mHistoryIndex;
-
- public SignalController(String tag, Context context, int type,
- List<NetworkSignalChangedCallback> signalCallbacks,
- List<SignalCluster> signalClusters, NetworkControllerImpl networkController) {
- mTag = TAG + "." + tag;
- mNetworkController = networkController;
- mTransportType = type;
- mContext = context;
- mSignalsChangedCallbacks = signalCallbacks;
- mSignalClusters = signalClusters;
- mCurrentState = cleanState();
- mLastState = cleanState();
- if (RECORD_HISTORY) {
- mHistory = new State[HISTORY_SIZE];
- for (int i = 0; i < HISTORY_SIZE; i++) {
- mHistory[i] = cleanState();
- }
- }
- }
-
- public T getState() {
- return mCurrentState;
- }
-
- public int getTransportType() {
- return mTransportType;
- }
-
- public void setInetCondition(int inetCondition) {
- mCurrentState.inetCondition = inetCondition;
- notifyListenersIfNecessary();
- }
-
- /**
- * Used at the end of demo mode to clear out any ugly state that it has created.
- * Since we haven't had any callbacks, then isDirty will not have been triggered,
- * so we can just take the last good state directly from there.
- *
- * Used for demo mode.
- */
- void resetLastState() {
- mCurrentState.copyFrom(mLastState);
- }
-
- /**
- * Determines if the state of this signal controller has changed and
- * needs to trigger callbacks related to it.
- */
- public boolean isDirty() {
- if (!mLastState.equals(mCurrentState)) {
- if (DEBUG) {
- Log.d(mTag, "Change in state from: " + mLastState + "\n"
- + "\tto: " + mCurrentState);
- }
- return true;
- }
- return false;
- }
-
- public void saveLastState() {
- if (RECORD_HISTORY) {
- recordLastState();
- }
- // Updates the current time.
- mCurrentState.time = System.currentTimeMillis();
- mLastState.copyFrom(mCurrentState);
- }
-
- /**
- * Gets the signal icon for QS based on current state of connected, enabled, and level.
- */
- public int getQsCurrentIconId() {
- if (mCurrentState.connected) {
- return getIcons().mQsIcons[mCurrentState.inetCondition][mCurrentState.level];
- } else if (mCurrentState.enabled) {
- return getIcons().mQsDiscState;
- } else {
- return getIcons().mQsNullState;
- }
- }
-
- /**
- * Gets the signal icon for SB based on current state of connected, enabled, and level.
- */
- public int getCurrentIconId() {
- if (mCurrentState.connected) {
- return getIcons().mSbIcons[mCurrentState.inetCondition][mCurrentState.level];
- } else if (mCurrentState.enabled) {
- return getIcons().mSbDiscState;
- } else {
- return getIcons().mSbNullState;
- }
- }
-
- /**
- * Gets the content description id for the signal based on current state of connected and
- * level.
- */
- public int getContentDescription() {
- if (mCurrentState.connected) {
- return getIcons().mContentDesc[mCurrentState.level];
- } else {
- return getIcons().mDiscContentDesc;
- }
- }
-
- public void notifyListenersIfNecessary() {
- if (isDirty()) {
- saveLastState();
- notifyListeners();
- mNetworkController.refreshCarrierLabel();
- }
- }
-
- /**
- * Returns the resource if resId is not 0, and an empty string otherwise.
- */
- protected String getStringIfExists(int resId) {
- return resId != 0 ? mContext.getString(resId) : "";
- }
-
- protected I getIcons() {
- return (I) mCurrentState.iconGroup;
- }
-
- /**
- * Saves the last state of any changes, so we can log the current
- * and last value of any state data.
- */
- protected void recordLastState() {
- mHistory[mHistoryIndex++ & (HISTORY_SIZE - 1)].copyFrom(mLastState);
- }
-
- public void dump(PrintWriter pw) {
- pw.println(" - " + mTag + " -----");
- pw.println(" Current State: " + mCurrentState);
- if (RECORD_HISTORY) {
- // Count up the states that actually contain time stamps, and only display those.
- int size = 0;
- for (int i = 0; i < HISTORY_SIZE; i++) {
- if (mHistory[i].time != 0) size++;
- }
- // Print out the previous states in ordered number.
- for (int i = mHistoryIndex + HISTORY_SIZE - 1;
- i >= mHistoryIndex + HISTORY_SIZE - size; i--) {
- pw.println(" Previous State(" + (mHistoryIndex + HISTORY_SIZE - i) + ": "
- + mHistory[i & (HISTORY_SIZE - 1)]);
- }
- }
- }
-
- /**
- * Trigger callbacks based on current state. The callbacks should be completely
- * based on current state, and only need to be called in the scenario where
- * mCurrentState != mLastState.
- */
- public abstract void notifyListeners();
-
- /**
- * Generate a blank T.
- */
- protected abstract T cleanState();
-
- /*
- * Holds icons for a given state. Arrays are generally indexed as inet
- * state (full connectivity or not) first, and second dimension as
- * signal strength.
- */
- static class IconGroup {
- final int[][] mSbIcons;
- final int[][] mQsIcons;
- final int[] mContentDesc;
- final int mSbNullState;
- final int mQsNullState;
- final int mSbDiscState;
- final int mQsDiscState;
- final int mDiscContentDesc;
- // For logging.
- final String mName;
-
- public IconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc,
- int sbNullState, int qsNullState, int sbDiscState, int qsDiscState,
- int discContentDesc) {
- mName = name;
- mSbIcons = sbIcons;
- mQsIcons = qsIcons;
- mContentDesc = contentDesc;
- mSbNullState = sbNullState;
- mQsNullState = qsNullState;
- mSbDiscState = sbDiscState;
- mQsDiscState = qsDiscState;
- mDiscContentDesc = discContentDesc;
- }
-
- @Override
- public String toString() {
- return "IconGroup(" + mName + ")";
- }
- }
-
- static class State {
- boolean connected;
- boolean enabled;
- boolean activityIn;
- boolean activityOut;
- int level;
- IconGroup iconGroup;
- int inetCondition;
- int rssi; // Only for logging.
-
- // Not used for comparison, just used for logging.
- long time;
-
- public void copyFrom(State state) {
- connected = state.connected;
- enabled = state.enabled;
- level = state.level;
- iconGroup = state.iconGroup;
- inetCondition = state.inetCondition;
- activityIn = state.activityIn;
- activityOut = state.activityOut;
- rssi = state.rssi;
- time = state.time;
- }
-
- @Override
- public String toString() {
- if (time != 0) {
- StringBuilder builder = new StringBuilder();
- toString(builder);
- return builder.toString();
- } else {
- return "Empty " + getClass().getSimpleName();
- }
- }
-
- protected void toString(StringBuilder builder) {
- builder.append("connected=").append(connected).append(',')
- .append("enabled=").append(enabled).append(',')
- .append("level=").append(level).append(',')
- .append("inetCondition=").append(inetCondition).append(',')
- .append("iconGroup=").append(iconGroup).append(',')
- .append("activityIn=").append(activityIn).append(',')
- .append("activityOut=").append(activityOut).append(',')
- .append("rssi=").append(rssi).append(',')
- .append("lastModified=").append(DateFormat.format("MM-dd hh:mm:ss", time));
- }
-
- @Override
- public boolean equals(Object o) {
- if (!o.getClass().equals(getClass())) {
- return false;
- }
- State other = (State) o;
- return other.connected == connected
- && other.enabled == enabled
- && other.level == level
- && other.inetCondition == inetCondition
- && other.iconGroup == iconGroup
- && other.activityIn == activityIn
- && other.activityOut == activityOut
- && other.rssi == rssi;
- }
- }
- }
-
public interface SignalCluster {
void setWifiIndicators(boolean visible, int strengthIcon, String contentDescription);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java
new file mode 100644
index 0000000..14c3d9c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java
@@ -0,0 +1,324 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.statusbar.policy;
+
+import static com.android.systemui.statusbar.policy.NetworkControllerImpl.TAG;
+
+import android.content.Context;
+import android.text.format.DateFormat;
+import android.util.Log;
+
+import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
+import com.android.systemui.statusbar.policy.NetworkControllerImpl.SignalCluster;
+
+import java.io.PrintWriter;
+import java.util.List;
+
+
+/**
+ * Common base class for handling signal for both wifi and mobile data.
+ */
+public abstract class SignalController<T extends SignalController.State,
+ I extends SignalController.IconGroup> {
+ // Save the previous SignalController.States of all SignalControllers for dumps.
+ static final boolean RECORD_HISTORY = true;
+ // If RECORD_HISTORY how many to save, must be a power of 2.
+ static final int HISTORY_SIZE = 16;
+
+ protected static final boolean DEBUG = NetworkControllerImpl.DEBUG;
+ protected static final boolean CHATTY = NetworkControllerImpl.CHATTY;
+
+ protected final String mTag;
+ protected final T mCurrentState;
+ protected final T mLastState;
+ protected final int mTransportType;
+ protected final Context mContext;
+ // The owner of the SignalController (i.e. NetworkController will maintain the following
+ // lists and call notifyListeners whenever the list has changed to ensure everyone
+ // is aware of current state.
+ protected final List<NetworkSignalChangedCallback> mSignalsChangedCallbacks;
+ protected final List<SignalCluster> mSignalClusters;
+ protected final NetworkControllerImpl mNetworkController;
+
+ // Save the previous HISTORY_SIZE states for logging.
+ private final State[] mHistory;
+ // Where to copy the next state into.
+ private int mHistoryIndex;
+
+ public SignalController(String tag, Context context, int type,
+ List<NetworkSignalChangedCallback> signalCallbacks,
+ List<SignalCluster> signalClusters, NetworkControllerImpl networkController) {
+ mTag = TAG + "." + tag;
+ mNetworkController = networkController;
+ mTransportType = type;
+ mContext = context;
+ mSignalsChangedCallbacks = signalCallbacks;
+ mSignalClusters = signalClusters;
+ mCurrentState = cleanState();
+ mLastState = cleanState();
+ if (RECORD_HISTORY) {
+ mHistory = new State[HISTORY_SIZE];
+ for (int i = 0; i < HISTORY_SIZE; i++) {
+ mHistory[i] = cleanState();
+ }
+ }
+ }
+
+ public T getState() {
+ return mCurrentState;
+ }
+
+ public int getTransportType() {
+ return mTransportType;
+ }
+
+ public void setInetCondition(int inetCondition) {
+ mCurrentState.inetCondition = inetCondition;
+ notifyListenersIfNecessary();
+ }
+
+ /**
+ * Used at the end of demo mode to clear out any ugly state that it has created.
+ * Since we haven't had any callbacks, then isDirty will not have been triggered,
+ * so we can just take the last good state directly from there.
+ *
+ * Used for demo mode.
+ */
+ public void resetLastState() {
+ mCurrentState.copyFrom(mLastState);
+ }
+
+ /**
+ * Determines if the state of this signal controller has changed and
+ * needs to trigger callbacks related to it.
+ */
+ public boolean isDirty() {
+ if (!mLastState.equals(mCurrentState)) {
+ if (DEBUG) {
+ Log.d(mTag, "Change in state from: " + mLastState + "\n"
+ + "\tto: " + mCurrentState);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public void saveLastState() {
+ if (RECORD_HISTORY) {
+ recordLastState();
+ }
+ // Updates the current time.
+ mCurrentState.time = System.currentTimeMillis();
+ mLastState.copyFrom(mCurrentState);
+ }
+
+ /**
+ * Gets the signal icon for QS based on current state of connected, enabled, and level.
+ */
+ public int getQsCurrentIconId() {
+ if (mCurrentState.connected) {
+ return getIcons().mQsIcons[mCurrentState.inetCondition][mCurrentState.level];
+ } else if (mCurrentState.enabled) {
+ return getIcons().mQsDiscState;
+ } else {
+ return getIcons().mQsNullState;
+ }
+ }
+
+ /**
+ * Gets the signal icon for SB based on current state of connected, enabled, and level.
+ */
+ public int getCurrentIconId() {
+ if (mCurrentState.connected) {
+ return getIcons().mSbIcons[mCurrentState.inetCondition][mCurrentState.level];
+ } else if (mCurrentState.enabled) {
+ return getIcons().mSbDiscState;
+ } else {
+ return getIcons().mSbNullState;
+ }
+ }
+
+ /**
+ * Gets the content description id for the signal based on current state of connected and
+ * level.
+ */
+ public int getContentDescription() {
+ if (mCurrentState.connected) {
+ return getIcons().mContentDesc[mCurrentState.level];
+ } else {
+ return getIcons().mDiscContentDesc;
+ }
+ }
+
+ public void notifyListenersIfNecessary() {
+ if (isDirty()) {
+ saveLastState();
+ notifyListeners();
+ mNetworkController.refreshCarrierLabel();
+ }
+ }
+
+ /**
+ * Returns the resource if resId is not 0, and an empty string otherwise.
+ */
+ protected String getStringIfExists(int resId) {
+ return resId != 0 ? mContext.getString(resId) : "";
+ }
+
+ protected I getIcons() {
+ return (I) mCurrentState.iconGroup;
+ }
+
+ /**
+ * Saves the last state of any changes, so we can log the current
+ * and last value of any state data.
+ */
+ protected void recordLastState() {
+ mHistory[mHistoryIndex++ & (HISTORY_SIZE - 1)].copyFrom(mLastState);
+ }
+
+ public void dump(PrintWriter pw) {
+ pw.println(" - " + mTag + " -----");
+ pw.println(" Current State: " + mCurrentState);
+ if (RECORD_HISTORY) {
+ // Count up the states that actually contain time stamps, and only display those.
+ int size = 0;
+ for (int i = 0; i < HISTORY_SIZE; i++) {
+ if (mHistory[i].time != 0) size++;
+ }
+ // Print out the previous states in ordered number.
+ for (int i = mHistoryIndex + HISTORY_SIZE - 1;
+ i >= mHistoryIndex + HISTORY_SIZE - size; i--) {
+ pw.println(" Previous State(" + (mHistoryIndex + HISTORY_SIZE - i) + "): "
+ + mHistory[i & (HISTORY_SIZE - 1)]);
+ }
+ }
+ }
+
+ /**
+ * Trigger callbacks based on current state. The callbacks should be completely
+ * based on current state, and only need to be called in the scenario where
+ * mCurrentState != mLastState.
+ */
+ public abstract void notifyListeners();
+
+ /**
+ * Generate a blank T.
+ */
+ protected abstract T cleanState();
+
+ /*
+ * Holds icons for a given state. Arrays are generally indexed as inet
+ * state (full connectivity or not) first, and second dimension as
+ * signal strength.
+ */
+ static class IconGroup {
+ final int[][] mSbIcons;
+ final int[][] mQsIcons;
+ final int[] mContentDesc;
+ final int mSbNullState;
+ final int mQsNullState;
+ final int mSbDiscState;
+ final int mQsDiscState;
+ final int mDiscContentDesc;
+ // For logging.
+ final String mName;
+
+ public IconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc,
+ int sbNullState, int qsNullState, int sbDiscState, int qsDiscState,
+ int discContentDesc) {
+ mName = name;
+ mSbIcons = sbIcons;
+ mQsIcons = qsIcons;
+ mContentDesc = contentDesc;
+ mSbNullState = sbNullState;
+ mQsNullState = qsNullState;
+ mSbDiscState = sbDiscState;
+ mQsDiscState = qsDiscState;
+ mDiscContentDesc = discContentDesc;
+ }
+
+ @Override
+ public String toString() {
+ return "IconGroup(" + mName + ")";
+ }
+ }
+
+ static class State {
+ boolean connected;
+ boolean enabled;
+ boolean activityIn;
+ boolean activityOut;
+ int level;
+ IconGroup iconGroup;
+ int inetCondition;
+ int rssi; // Only for logging.
+
+ // Not used for comparison, just used for logging.
+ long time;
+
+ public void copyFrom(State state) {
+ connected = state.connected;
+ enabled = state.enabled;
+ level = state.level;
+ iconGroup = state.iconGroup;
+ inetCondition = state.inetCondition;
+ activityIn = state.activityIn;
+ activityOut = state.activityOut;
+ rssi = state.rssi;
+ time = state.time;
+ }
+
+ @Override
+ public String toString() {
+ if (time != 0) {
+ StringBuilder builder = new StringBuilder();
+ toString(builder);
+ return builder.toString();
+ } else {
+ return "Empty " + getClass().getSimpleName();
+ }
+ }
+
+ protected void toString(StringBuilder builder) {
+ builder.append("connected=").append(connected).append(',')
+ .append("enabled=").append(enabled).append(',')
+ .append("level=").append(level).append(',')
+ .append("inetCondition=").append(inetCondition).append(',')
+ .append("iconGroup=").append(iconGroup).append(',')
+ .append("activityIn=").append(activityIn).append(',')
+ .append("activityOut=").append(activityOut).append(',')
+ .append("rssi=").append(rssi).append(',')
+ .append("lastModified=").append(DateFormat.format("MM-dd hh:mm:ss", time));
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!o.getClass().equals(getClass())) {
+ return false;
+ }
+ State other = (State) o;
+ return other.connected == connected
+ && other.enabled == enabled
+ && other.level == level
+ && other.inetCondition == inetCondition
+ && other.iconGroup == iconGroup
+ && other.activityIn == activityIn
+ && other.activityOut == activityOut
+ && other.rssi == rssi;
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
index 4091619..d266ed8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
@@ -17,7 +17,7 @@
package com.android.systemui.statusbar.policy;
import com.android.systemui.R;
-import com.android.systemui.statusbar.policy.NetworkControllerImpl.MobileSignalController.MobileIconGroup;
+import com.android.systemui.statusbar.policy.MobileSignalController.MobileIconGroup;
class TelephonyIcons {
//***** Signal strength icons
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
new file mode 100644
index 0000000..a97ca50
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.statusbar.policy;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Messenger;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.AsyncChannel;
+import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
+import com.android.systemui.statusbar.policy.NetworkControllerImpl.SignalCluster;
+
+import java.util.List;
+import java.util.Objects;
+
+
+public class WifiSignalController extends
+ SignalController<WifiSignalController.WifiState, SignalController.IconGroup> {
+ private final WifiManager mWifiManager;
+ private final AsyncChannel mWifiChannel;
+ private final boolean mHasMobileData;
+
+ public WifiSignalController(Context context, boolean hasMobileData,
+ List<NetworkSignalChangedCallback> signalCallbacks,
+ List<SignalCluster> signalClusters, NetworkControllerImpl networkController) {
+ super("WifiSignalController", context, NetworkCapabilities.TRANSPORT_WIFI,
+ signalCallbacks, signalClusters, networkController);
+ mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
+ mHasMobileData = hasMobileData;
+ Handler handler = new WifiHandler();
+ mWifiChannel = new AsyncChannel();
+ Messenger wifiMessenger = mWifiManager.getWifiServiceMessenger();
+ if (wifiMessenger != null) {
+ mWifiChannel.connect(context, handler, wifiMessenger);
+ }
+ // WiFi only has one state.
+ mCurrentState.iconGroup = mLastState.iconGroup = new IconGroup(
+ "Wi-Fi Icons",
+ WifiIcons.WIFI_SIGNAL_STRENGTH,
+ WifiIcons.QS_WIFI_SIGNAL_STRENGTH,
+ AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH,
+ WifiIcons.WIFI_NO_NETWORK,
+ WifiIcons.QS_WIFI_NO_NETWORK,
+ WifiIcons.WIFI_NO_NETWORK,
+ WifiIcons.QS_WIFI_NO_NETWORK,
+ AccessibilityContentDescriptions.WIFI_NO_CONNECTION
+ );
+ }
+
+ @Override
+ protected WifiState cleanState() {
+ return new WifiState();
+ }
+
+ @Override
+ public void notifyListeners() {
+ // only show wifi in the cluster if connected or if wifi-only
+ boolean wifiVisible = mCurrentState.enabled
+ && (mCurrentState.connected || !mHasMobileData);
+ String wifiDesc = wifiVisible ? mCurrentState.ssid : null;
+ boolean ssidPresent = wifiVisible && mCurrentState.ssid != null;
+ String contentDescription = getStringIfExists(getContentDescription());
+ int length = mSignalsChangedCallbacks.size();
+ for (int i = 0; i < length; i++) {
+ mSignalsChangedCallbacks.get(i).onWifiSignalChanged(mCurrentState.enabled,
+ mCurrentState.connected, getQsCurrentIconId(),
+ ssidPresent && mCurrentState.activityIn,
+ ssidPresent && mCurrentState.activityOut, contentDescription, wifiDesc);
+ }
+
+ int signalClustersLength = mSignalClusters.size();
+ for (int i = 0; i < signalClustersLength; i++) {
+ mSignalClusters.get(i).setWifiIndicators(wifiVisible, getCurrentIconId(),
+ contentDescription);
+ }
+ }
+
+ /**
+ * Extract wifi state directly from broadcasts about changes in wifi state.
+ */
+ public void handleBroadcast(Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
+ mCurrentState.enabled = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
+ WifiManager.WIFI_STATE_UNKNOWN) == WifiManager.WIFI_STATE_ENABLED;
+ } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
+ final NetworkInfo networkInfo = (NetworkInfo)
+ intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
+ mCurrentState.connected = networkInfo != null && networkInfo.isConnected();
+ // If Connected grab the signal strength and ssid.
+ if (mCurrentState.connected) {
+ // try getting it out of the intent first
+ WifiInfo info = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO) != null
+ ? (WifiInfo) intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO)
+ : mWifiManager.getConnectionInfo();
+ if (info != null) {
+ mCurrentState.ssid = getSsid(info);
+ } else {
+ mCurrentState.ssid = null;
+ }
+ } else if (!mCurrentState.connected) {
+ mCurrentState.ssid = null;
+ }
+ } else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
+ // Default to -200 as its below WifiManager.MIN_RSSI.
+ mCurrentState.rssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
+ mCurrentState.level = WifiManager.calculateSignalLevel(
+ mCurrentState.rssi, WifiIcons.WIFI_LEVEL_COUNT);
+ }
+
+ notifyListenersIfNecessary();
+ }
+
+ private String getSsid(WifiInfo info) {
+ String ssid = info.getSSID();
+ if (ssid != null) {
+ return ssid;
+ }
+ // OK, it's not in the connectionInfo; we have to go hunting for it
+ List<WifiConfiguration> networks = mWifiManager.getConfiguredNetworks();
+ int length = networks.size();
+ for (int i = 0; i < length; i++) {
+ if (networks.get(i).networkId == info.getNetworkId()) {
+ return networks.get(i).SSID;
+ }
+ }
+ return null;
+ }
+
+ @VisibleForTesting
+ void setActivity(int wifiActivity) {
+ mCurrentState.activityIn = wifiActivity == WifiManager.DATA_ACTIVITY_INOUT
+ || wifiActivity == WifiManager.DATA_ACTIVITY_IN;
+ mCurrentState.activityOut = wifiActivity == WifiManager.DATA_ACTIVITY_INOUT
+ || wifiActivity == WifiManager.DATA_ACTIVITY_OUT;
+ notifyListenersIfNecessary();
+ }
+
+ /**
+ * Handler to receive the data activity on wifi.
+ */
+ private class WifiHandler extends Handler {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED:
+ if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) {
+ mWifiChannel.sendMessage(Message.obtain(this,
+ AsyncChannel.CMD_CHANNEL_FULL_CONNECTION));
+ } else {
+ Log.e(mTag, "Failed to connect to wifi");
+ }
+ break;
+ case WifiManager.DATA_ACTIVITY_NOTIFICATION:
+ setActivity(msg.arg1);
+ break;
+ default:
+ // Ignore
+ break;
+ }
+ }
+ }
+
+ static class WifiState extends SignalController.State {
+ String ssid;
+
+ @Override
+ public void copyFrom(State s) {
+ super.copyFrom(s);
+ WifiState state = (WifiState) s;
+ ssid = state.ssid;
+ }
+
+ @Override
+ protected void toString(StringBuilder builder) {
+ super.toString(builder);
+ builder.append(',').append("ssid=").append(ssid);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ return super.equals(o)
+ && Objects.equals(((WifiState) o).ssid, ssid);
+ }
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
index 8a2d62f..9b95d5c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
@@ -1,17 +1,24 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package com.android.systemui.statusbar.policy;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mockito;
-
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
@@ -26,13 +33,19 @@
import android.util.Log;
import com.android.internal.telephony.IccCardConstants;
-import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.cdma.EriInfo;
import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config;
-import com.android.systemui.statusbar.policy.NetworkControllerImpl.MobileSignalController;
import com.android.systemui.statusbar.policy.NetworkControllerImpl.SignalCluster;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+
public class NetworkControllerBaseTest extends AndroidTestCase {
private static final String TAG = "NetworkControllerBaseTest";
protected static final int DEFAULT_LEVEL = 2;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
index 142c7e6..65b0971 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
@@ -1,12 +1,21 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package com.android.systemui.statusbar.policy;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.mockito.Mockito;
import android.content.Intent;
import android.net.ConnectivityManager;
@@ -18,7 +27,11 @@
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.TelephonyIntents;
import com.android.systemui.R;
-import com.android.systemui.statusbar.policy.NetworkControllerImpl.MobileSignalController;
+
+import org.mockito.Mockito;
+
+import java.util.ArrayList;
+import java.util.List;
public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index 30a271e..ed43d8e 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -1338,6 +1338,7 @@
if (mDecor != null) {
mDecor.setElevation(elevation);
}
+ dispatchWindowAttributesChanged(getAttributes());
}
@Override
@@ -2490,14 +2491,14 @@
}
@Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
final Callback cb = getCallback();
if (cb != null && !isDestroyed()) {
if (cb.dispatchPopulateAccessibilityEvent(event)) {
return true;
}
}
- return super.dispatchPopulateAccessibilityEvent(event);
+ return super.dispatchPopulateAccessibilityEventInternal(event);
}
@Override
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index c37cf75..7124e5b 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -1430,8 +1430,8 @@
int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT / density;
int longSizeDp = longSize * DisplayMetrics.DENSITY_DEFAULT / density;
- // Allow the navigation bar to move on small devices (phones).
- mNavigationBarCanMove = shortSizeDp < 600;
+ // Allow the navigation bar to move on non-square small devices (phones).
+ mNavigationBarCanMove = width != height && shortSizeDp < 600;
mHasNavigationBar = res.getBoolean(com.android.internal.R.bool.config_showNavigationBar);
// Allow a system property to override this. Used by the emulator.
@@ -1641,8 +1641,14 @@
outAppOp[0] = AppOpsManager.OP_NONE;
- if (type < WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW
- || type > WindowManager.LayoutParams.LAST_SYSTEM_WINDOW) {
+ if (!((type >= FIRST_APPLICATION_WINDOW && type <= LAST_APPLICATION_WINDOW)
+ || (type >= FIRST_SUB_WINDOW && type <= LAST_SUB_WINDOW)
+ || (type >= FIRST_SYSTEM_WINDOW && type <= LAST_SYSTEM_WINDOW))) {
+ return WindowManagerGlobal.ADD_INVALID_TYPE;
+ }
+
+ if (type < FIRST_SYSTEM_WINDOW || type > LAST_SYSTEM_WINDOW) {
+ // Window manager will make sure these are okay.
return WindowManagerGlobal.ADD_OKAY;
}
String permission = null;
diff --git a/rs/java/android/renderscript/RenderScript.java b/rs/java/android/renderscript/RenderScript.java
index 114042d..fb8ae5d 100644
--- a/rs/java/android/renderscript/RenderScript.java
+++ b/rs/java/android/renderscript/RenderScript.java
@@ -302,6 +302,46 @@
rsnContextResume(mContext);
}
+ native long rsnClosureCreate(long con, long kernelID, long returnValue,
+ long[] fieldIDs, long[] values, int[] sizes, long[] depClosures,
+ long[] depFieldIDs);
+ synchronized long nClosureCreate(long kernelID, long returnValue,
+ long[] fieldIDs, long[] values, int[] sizes, long[] depClosures,
+ long[] depFieldIDs) {
+ validate();
+ return rsnClosureCreate(mContext, kernelID, returnValue, fieldIDs, values,
+ sizes, depClosures, depFieldIDs);
+ }
+
+ native void rsnClosureSetArg(long con, long closureID, int index,
+ long value, int size);
+ synchronized void nClosureSetArg(long closureID, int index, long value,
+ int size) {
+ validate();
+ rsnClosureSetArg(mContext, closureID, index, value, size);
+ }
+
+ native void rsnClosureSetGlobal(long con, long closureID, long fieldID,
+ long value, int size);
+ // Does this have to be synchronized?
+ synchronized void nClosureSetGlobal(long closureID, long fieldID,
+ long value, int size) {
+ validate(); // TODO: is this necessary?
+ rsnClosureSetGlobal(mContext, closureID, fieldID, value, size);
+ }
+
+ native long rsnScriptGroup2Create(long con, long[] closures);
+ synchronized long nScriptGroup2Create(long[] closures) {
+ validate();
+ return rsnScriptGroup2Create(mContext, closures);
+ }
+
+ native void rsnScriptGroup2Execute(long con, long groupID);
+ synchronized void nScriptGroup2Execute(long groupID) {
+ validate();
+ rsnScriptGroup2Execute(mContext, groupID);
+ }
+
native void rsnAssignName(long con, long obj, byte[] name);
synchronized void nAssignName(long obj, byte[] name) {
validate();
diff --git a/rs/java/android/renderscript/ScriptGroup2.java b/rs/java/android/renderscript/ScriptGroup2.java
new file mode 100644
index 0000000..dcad787
--- /dev/null
+++ b/rs/java/android/renderscript/ScriptGroup2.java
@@ -0,0 +1,319 @@
+package android.renderscript;
+
+import android.util.Log;
+import android.util.Pair;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ @hide Pending Android public API approval.
+ */
+/**
+
+******************************
+You have tried to change the API from what has been previously approved.
+
+To make these errors go away, you have two choices:
+ 1) You can add "@hide" javadoc comments to the methods, etc. listed in the
+ errors above.
+
+ 2) You can update current.txt by executing the following command:
+ make update-api
+
+To submit the revised current.txt to the main Android repository,
+you will need approval.
+******************************
+
+ @hide Pending Android public API approval.
+ */
+public class ScriptGroup2 extends BaseObj {
+
+ public static class Closure extends BaseObj {
+ private Allocation mReturnValue;
+ private Map<Script.FieldID, Object> mBindings;
+
+ private Future mReturnFuture;
+ private Map<Script.FieldID, Future> mGlobalFuture;
+
+ private static final String TAG = "Closure";
+
+ public Closure(long id, RenderScript rs) {
+ super(id, rs);
+ }
+
+ public Closure(RenderScript rs, Script.KernelID kernelID, Type returnType,
+ Object[] args, Map<Script.FieldID, Object> globals) {
+ super(0, rs);
+
+ mReturnValue = Allocation.createTyped(rs, returnType);
+ mBindings = new HashMap<Script.FieldID, Object>();
+ mGlobalFuture = new HashMap<Script.FieldID, Future>();
+
+ int numValues = args.length + globals.size();
+
+ long[] fieldIDs = new long[numValues];
+ long[] values = new long[numValues];
+ int[] sizes = new int[numValues];
+ long[] depClosures = new long[numValues];
+ long[] depFieldIDs = new long[numValues];
+
+ int i;
+ for (i = 0; i < args.length; i++) {
+ Object obj = args[i];
+ fieldIDs[i] = 0;
+ if (obj instanceof UnboundValue) {
+ UnboundValue unbound = (UnboundValue)obj;
+ unbound.addReference(this, i);
+ } else {
+ retrieveValueAndDependenceInfo(rs, i, args[i], values, sizes,
+ depClosures, depFieldIDs);
+ }
+ }
+
+ for (Map.Entry<Script.FieldID, Object> entry : globals.entrySet()) {
+ Object obj = entry.getValue();
+ Script.FieldID fieldID = entry.getKey();
+ fieldIDs[i] = fieldID.getID(rs);
+ if (obj instanceof UnboundValue) {
+ UnboundValue unbound = (UnboundValue)obj;
+ unbound.addReference(this, fieldID);
+ } else {
+ retrieveValueAndDependenceInfo(rs, i, obj, values,
+ sizes, depClosures, depFieldIDs);
+ }
+ i++;
+ }
+
+ long id = rs.nClosureCreate(kernelID.getID(rs), mReturnValue.getID(rs),
+ fieldIDs, values, sizes, depClosures, depFieldIDs);
+
+ setID(id);
+ }
+
+ private static void retrieveValueAndDependenceInfo(RenderScript rs,
+ int index, Object obj, long[] values, int[] sizes, long[] depClosures,
+ long[] depFieldIDs) {
+
+ if (obj instanceof Future) {
+ Future f = (Future)obj;
+ obj = f.getValue();
+ depClosures[index] = f.getClosure().getID(rs);
+ Script.FieldID fieldID = f.getFieldID();
+ depFieldIDs[index] = fieldID != null ? fieldID.getID(rs) : 0;
+ } else {
+ depClosures[index] = 0;
+ depFieldIDs[index] = 0;
+ }
+
+ ValueAndSize vs = new ValueAndSize(rs, obj);
+ values[index] = vs.value;
+ sizes[index] = vs.size;
+ }
+
+ public Future getReturn() {
+ if (mReturnFuture == null) {
+ mReturnFuture = new Future(this, null, mReturnValue);
+ }
+
+ return mReturnFuture;
+ }
+
+ public Future getGlobal(Script.FieldID field) {
+ Future f = mGlobalFuture.get(field);
+
+ if (f == null) {
+ f = new Future(this, field, mBindings.get(field));
+ mGlobalFuture.put(field, f);
+ }
+
+ return f;
+ }
+
+ void setArg(int index, Object obj) {
+ ValueAndSize vs = new ValueAndSize(mRS, obj);
+ mRS.nClosureSetArg(getID(mRS), index, vs.value, vs.size);
+ }
+
+ void setGlobal(Script.FieldID fieldID, Object obj) {
+ ValueAndSize vs = new ValueAndSize(mRS, obj);
+ mRS.nClosureSetGlobal(getID(mRS), fieldID.getID(mRS), vs.value, vs.size);
+ }
+
+ private static final class ValueAndSize {
+ public ValueAndSize(RenderScript rs, Object obj) {
+ if (obj instanceof Allocation) {
+ value = ((Allocation)obj).getID(rs);
+ size = -1;
+ } else if (obj instanceof Boolean) {
+ value = ((Boolean)obj).booleanValue() ? 1 : 0;
+ size = 4;
+ } else if (obj instanceof Integer) {
+ value = ((Integer)obj).longValue();
+ size = 4;
+ } else if (obj instanceof Long) {
+ value = ((Long)obj).longValue();
+ size = 8;
+ } else if (obj instanceof Float) {
+ value = ((Float)obj).longValue();
+ size = 4;
+ } else if (obj instanceof Double) {
+ value = ((Double)obj).longValue();
+ size = 8;
+ }
+ }
+
+ public long value;
+ public int size;
+ }
+ }
+
+ public static class Future {
+ Closure mClosure;
+ Script.FieldID mFieldID;
+ Object mValue;
+
+ Future(Closure closure, Script.FieldID fieldID, Object value) {
+ mClosure = closure;
+ mFieldID = fieldID;
+ mValue = value;
+ }
+
+ Closure getClosure() { return mClosure; }
+ Script.FieldID getFieldID() { return mFieldID; }
+ Object getValue() { return mValue; }
+ }
+
+ public static class UnboundValue {
+ // Either mFieldID or mArgIndex should be set but not both.
+ List<Pair<Closure, Script.FieldID>> mFieldID;
+ // -1 means unset. Legal values are 0 .. n-1, where n is the number of
+ // arguments for the referencing closure.
+ List<Pair<Closure, Integer>> mArgIndex;
+
+ UnboundValue() {
+ mFieldID = new ArrayList<Pair<Closure, Script.FieldID>>();
+ mArgIndex = new ArrayList<Pair<Closure, Integer>>();
+ }
+
+ void addReference(Closure closure, int index) {
+ mArgIndex.add(Pair.create(closure, Integer.valueOf(index)));
+ }
+
+ void addReference(Closure closure, Script.FieldID fieldID) {
+ mFieldID.add(Pair.create(closure, fieldID));
+ }
+
+ void set(Object value) {
+ for (Pair<Closure, Integer> p : mArgIndex) {
+ Closure closure = p.first;
+ int index = p.second.intValue();
+ closure.setArg(index, value);
+ }
+ for (Pair<Closure, Script.FieldID> p : mFieldID) {
+ Closure closure = p.first;
+ Script.FieldID fieldID = p.second;
+ closure.setGlobal(fieldID, value);
+ }
+ }
+ }
+
+ List<Closure> mClosures;
+ List<UnboundValue> mInputs;
+ Future[] mOutputs;
+
+ private static final String TAG = "ScriptGroup2";
+
+ public ScriptGroup2(long id, RenderScript rs) {
+ super(id, rs);
+ }
+
+ ScriptGroup2(RenderScript rs, List<Closure> closures,
+ List<UnboundValue> inputs, Future[] outputs) {
+ super(0, rs);
+ mClosures = closures;
+ mInputs = inputs;
+ mOutputs = outputs;
+
+ long[] closureIDs = new long[closures.size()];
+ for (int i = 0; i < closureIDs.length; i++) {
+ closureIDs[i] = closures.get(i).getID(rs);
+ }
+ long id = rs.nScriptGroup2Create(closureIDs);
+ setID(id);
+ }
+
+ // TODO: If this was reflected method, we could enforce the number of
+ // arguments.
+ public Object[] execute(Object... inputs) {
+ if (inputs.length < mInputs.size()) {
+ Log.e(TAG, this.toString() + " receives " + inputs.length + " inputs, " +
+ "less than expected " + mInputs.size());
+ return null;
+ }
+
+ if (inputs.length > mInputs.size()) {
+ Log.i(TAG, this.toString() + " receives " + inputs.length + " inputs, " +
+ "more than expected " + mInputs.size());
+ }
+
+ for (int i = 0; i < mInputs.size(); i++) {
+ Object obj = inputs[i];
+ if (obj instanceof Future || obj instanceof UnboundValue) {
+ Log.e(TAG, this.toString() + ": input " + i +
+ " is a future or unbound value");
+ return null;
+ }
+ UnboundValue unbound = mInputs.get(i);
+ unbound.set(obj);
+ }
+
+ mRS.nScriptGroup2Execute(getID(mRS));
+
+ Object[] outputObjs = new Object[mOutputs.length];
+ int i = 0;
+ for (Future f : mOutputs) {
+ outputObjs[i++] = f.getValue();
+ }
+ return outputObjs;
+ }
+
+ /**
+ @hide Pending Android public API approval.
+ */
+ public static final class Builder {
+ RenderScript mRS;
+ List<Closure> mClosures;
+ List<UnboundValue> mInputs;
+
+ private static final String TAG = "ScriptGroup2.Builder";
+
+ public Builder(RenderScript rs) {
+ mRS = rs;
+ mClosures = new ArrayList<Closure>();
+ mInputs = new ArrayList<UnboundValue>();
+ }
+
+ public Closure addKernel(Script.KernelID k, Type returnType, Object[] args,
+ Map<Script.FieldID, Object> globalBindings) {
+ Closure c = new Closure(mRS, k, returnType, args, globalBindings);
+ mClosures.add(c);
+ return c;
+ }
+
+ public UnboundValue addInput() {
+ UnboundValue unbound = new UnboundValue();
+ mInputs.add(unbound);
+ return unbound;
+ }
+
+ public ScriptGroup2 create(Future... outputs) {
+ // TODO: Save all script groups that have been created and return one that was
+ // saved and matches the outputs.
+ ScriptGroup2 ret = new ScriptGroup2(mRS, mClosures, mInputs, outputs);
+ return ret;
+ }
+
+ }
+}
diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp
index 68a0b83..dced99a 100644
--- a/rs/jni/android_renderscript_RenderScript.cpp
+++ b/rs/jni/android_renderscript_RenderScript.cpp
@@ -193,6 +193,88 @@
rsContextFinish((RsContext)con);
}
+static jlong
+nClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong kernelID,
+ jlong returnValue, jlongArray fieldIDArray,
+ jlongArray valueArray, jintArray sizeArray,
+ jlongArray depClosureArray, jlongArray depFieldIDArray) {
+ jlong* jFieldIDs = _env->GetLongArrayElements(fieldIDArray, nullptr);
+ jsize fieldIDs_length = _env->GetArrayLength(fieldIDArray);
+ RsScriptFieldID* fieldIDs =
+ (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * fieldIDs_length);
+ for (int i = 0; i< fieldIDs_length; i++) {
+ fieldIDs[i] = (RsScriptFieldID)jFieldIDs[i];
+ }
+
+ jlong* jValues = _env->GetLongArrayElements(valueArray, nullptr);
+ jsize values_length = _env->GetArrayLength(valueArray);
+ uintptr_t* values = (uintptr_t*)alloca(sizeof(uintptr_t) * values_length);
+ for (int i = 0; i < values_length; i++) {
+ values[i] = (uintptr_t)jValues[i];
+ }
+
+ jint* sizes = _env->GetIntArrayElements(sizeArray, nullptr);
+ jsize sizes_length = _env->GetArrayLength(sizeArray);
+
+ jlong* jDepClosures =
+ _env->GetLongArrayElements(depClosureArray, nullptr);
+ jsize depClosures_length = _env->GetArrayLength(depClosureArray);
+ RsClosure* depClosures =
+ (RsClosure*)alloca(sizeof(RsClosure) * depClosures_length);
+ for (int i = 0; i < depClosures_length; i++) {
+ depClosures[i] = (RsClosure)jDepClosures[i];
+ }
+
+ jlong* jDepFieldIDs =
+ _env->GetLongArrayElements(depFieldIDArray, nullptr);
+ jsize depFieldIDs_length = _env->GetArrayLength(depFieldIDArray);
+ RsScriptFieldID* depFieldIDs =
+ (RsScriptFieldID*)alloca(sizeof(RsScriptFieldID) * depFieldIDs_length);
+ for (int i = 0; i < depClosures_length; i++) {
+ depFieldIDs[i] = (RsClosure)jDepFieldIDs[i];
+ }
+
+ return (jlong)(uintptr_t)rsClosureCreate(
+ (RsContext)con, (RsScriptKernelID)kernelID, (RsAllocation)returnValue,
+ fieldIDs, (size_t)fieldIDs_length, values, (size_t)values_length,
+ (size_t*)sizes, (size_t)sizes_length,
+ depClosures, (size_t)depClosures_length,
+ depFieldIDs, (size_t)depFieldIDs_length);
+}
+
+static void
+nClosureSetArg(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
+ jint index, jlong value, jint size) {
+ rsClosureSetArg((RsContext)con, (RsClosure)closureID, (uint32_t)index,
+ (uintptr_t)value, (size_t)size);
+}
+
+static void
+nClosureSetGlobal(JNIEnv *_env, jobject _this, jlong con, jlong closureID,
+ jlong fieldID, jlong value, jint size) {
+ rsClosureSetGlobal((RsContext)con, (RsClosure)closureID,
+ (RsScriptFieldID)fieldID, (uintptr_t)value, (size_t)size);
+}
+
+static long
+nScriptGroup2Create(JNIEnv *_env, jobject _this, jlong con,
+ jlongArray closureArray) {
+ jlong* jClosures = _env->GetLongArrayElements(closureArray, nullptr);
+ jsize numClosures = _env->GetArrayLength(closureArray);
+ RsClosure* closures = (RsClosure*)alloca(sizeof(RsClosure) * numClosures);
+ for (int i = 0; i < numClosures; i++) {
+ closures[i] = (RsClosure)jClosures[i];
+ }
+
+ return (jlong)(uintptr_t)rsScriptGroup2Create((RsContext)con, closures,
+ numClosures);
+}
+
+static void
+nScriptGroup2Execute(JNIEnv *_env, jobject _this, jlong con, jlong groupID) {
+ rsScriptGroupExecute((RsContext)con, (RsScriptGroup2)groupID);
+}
+
static void
nAssignName(JNIEnv *_env, jobject _this, jlong con, jlong obj, jbyteArray str)
{
@@ -1841,6 +1923,9 @@
{"rsnContextPause", "(J)V", (void*)nContextPause },
{"rsnContextResume", "(J)V", (void*)nContextResume },
{"rsnContextSendMessage", "(JI[I)V", (void*)nContextSendMessage },
+{"rsnClosureCreate", "(JJJ[J[J[I[J[J)J", (void*)nClosureCreate },
+{"rsnClosureSetArg", "(JJIJI)V", (void*)nClosureSetArg },
+{"rsnClosureSetGlobal", "(JJJJI)V", (void*)nClosureSetGlobal },
{"rsnAssignName", "(JJ[B)V", (void*)nAssignName },
{"rsnGetName", "(JJ)Ljava/lang/String;", (void*)nGetName },
{"rsnObjDestroy", "(JJ)V", (void*)nObjDestroy },
@@ -1915,9 +2000,11 @@
{"rsnScriptKernelIDCreate", "(JJII)J", (void*)nScriptKernelIDCreate },
{"rsnScriptFieldIDCreate", "(JJI)J", (void*)nScriptFieldIDCreate },
{"rsnScriptGroupCreate", "(J[J[J[J[J[J)J", (void*)nScriptGroupCreate },
+{"rsnScriptGroup2Create", "(J[J)J", (void*)nScriptGroup2Create },
{"rsnScriptGroupSetInput", "(JJJJ)V", (void*)nScriptGroupSetInput },
{"rsnScriptGroupSetOutput", "(JJJJ)V", (void*)nScriptGroupSetOutput },
{"rsnScriptGroupExecute", "(JJ)V", (void*)nScriptGroupExecute },
+{"rsnScriptGroup2Execute", "(JJ)V", (void*)nScriptGroup2Execute },
{"rsnProgramStoreCreate", "(JZZZZZZIII)J", (void*)nProgramStoreCreate },
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 5ae26ef..340b215 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -945,7 +945,9 @@
List<ResolveInfo> installedServices = mPackageManager.queryIntentServicesAsUser(
new Intent(AccessibilityService.SERVICE_INTERFACE),
- PackageManager.GET_SERVICES | PackageManager.GET_META_DATA,
+ PackageManager.GET_SERVICES
+ | PackageManager.GET_META_DATA
+ | PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS,
mCurrentUserId);
for (int i = 0, count = installedServices.size(); i < count; i++) {
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index 6b8b5b1..7d085a3 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -2786,21 +2786,30 @@
addBackupTrace("finishing op on transport");
mStatus = mTransport.finishBackup();
addBackupTrace("finished: " + mStatus);
+ } else if (mStatus == BackupTransport.TRANSPORT_PACKAGE_REJECTED) {
+ addBackupTrace("transport rejected package");
}
} else {
if (DEBUG) Slog.i(TAG, "no backup data written; not calling transport");
addBackupTrace("no data to send");
}
- // After successful transport, delete the now-stale data
- // and juggle the files so that next time we supply the agent
- // with the new state file it just created.
if (mStatus == BackupTransport.TRANSPORT_OK) {
+ // After successful transport, delete the now-stale data
+ // and juggle the files so that next time we supply the agent
+ // with the new state file it just created.
mBackupDataName.delete();
mNewStateName.renameTo(mSavedStateName);
EventLog.writeEvent(EventLogTags.BACKUP_PACKAGE, pkgName, size);
logBackupComplete(pkgName);
+ } else if (mStatus == BackupTransport.TRANSPORT_PACKAGE_REJECTED) {
+ // The transport has rejected backup of this specific package. Roll it
+ // back but proceed with running the rest of the queue.
+ mBackupDataName.delete();
+ mNewStateName.delete();
+ EventLogTags.writeBackupAgentFailure(pkgName, "Transport rejected");
} else {
+ // Actual transport-level failure to communicate the data to the backend
EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, pkgName);
}
} catch (Exception e) {
@@ -2811,15 +2820,17 @@
try { if (backupData != null) backupData.close(); } catch (IOException e) {}
}
- // If we encountered an error here it's a transport-level failure. That
- // means we need to halt everything and reschedule everything for next time.
final BackupState nextState;
- if (mStatus != BackupTransport.TRANSPORT_OK) {
+ if (mStatus == BackupTransport.TRANSPORT_OK
+ || mStatus == BackupTransport.TRANSPORT_PACKAGE_REJECTED) {
+ // Success or single-package rejection. Proceed with the next app if any,
+ // otherwise we're done.
+ nextState = (mQueue.isEmpty()) ? BackupState.FINAL : BackupState.RUNNING_QUEUE;
+ } else {
+ // Any other error here indicates a transport-level failure. That means
+ // we need to halt everything and reschedule everything for next time.
revertAndEndBackup();
nextState = BackupState.FINAL;
- } else {
- // Success! Proceed with the next app if any, otherwise we're done.
- nextState = (mQueue.isEmpty()) ? BackupState.FINAL : BackupState.RUNNING_QUEUE;
}
executeNextState(nextState);
@@ -7963,8 +7974,6 @@
// Record that we need a backup pass for the caller. Since multiple callers
// may share a uid, we need to note all candidates within that uid and schedule
// a backup pass for each of them.
- EventLog.writeEvent(EventLogTags.BACKUP_DATA_CHANGED, packageName);
-
if (targets == null) {
Slog.w(TAG, "dataChanged but no participant pkg='" + packageName + "'"
+ " uid=" + Binder.getCallingUid());
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 766e4c7..0f8fd05 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -2069,6 +2069,9 @@
// may trigger a re-evaluation of the network.
private void unlinger(NetworkAgentInfo nai) {
if (VDBG) log("Canceling linger of " + nai.name());
+ // If network has never been validated, it cannot have been lingered, so don't bother
+ // needlessly triggering a re-evaluation.
+ if (!nai.everValidated) return;
nai.networkLingered.clear();
nai.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED);
}
@@ -4034,6 +4037,7 @@
} else {
if (DBG) log(" accepting network in place of null");
}
+ unlinger(newNetwork);
mNetworkForRequestId.put(nri.request.requestId, newNetwork);
newNetwork.addRequest(nri.request);
keep = true;
diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java
index 7d6ebaf..9eb70d8 100644
--- a/services/core/java/com/android/server/MountService.java
+++ b/services/core/java/com/android/server/MountService.java
@@ -2419,9 +2419,16 @@
final NativeDaemonEvent event;
try {
event = mConnector.execute("cryptfs", "getpw");
+ if ("-1".equals(event.getMessage())) {
+ // -1 equals no password
+ return null;
+ }
return fromHex(event.getMessage());
} catch (NativeDaemonConnectorException e) {
throw e.rethrowAsParcelableException();
+ } catch (IllegalArgumentException e) {
+ Slog.e(TAG, "Invalid response to getPassword");
+ return null;
}
}
diff --git a/services/core/java/com/android/server/PersistentDataBlockService.java b/services/core/java/com/android/server/PersistentDataBlockService.java
index 9d4cd99a..e5ace1b 100644
--- a/services/core/java/com/android/server/PersistentDataBlockService.java
+++ b/services/core/java/com/android/server/PersistentDataBlockService.java
@@ -103,9 +103,19 @@
@Override
public void onStart() {
enforceChecksumValidity();
+ formatIfOemUnlockEnabled();
publishBinderService(Context.PERSISTENT_DATA_BLOCK_SERVICE, mService);
}
+ private void formatIfOemUnlockEnabled() {
+ if (doGetOemUnlockEnabled()) {
+ synchronized (mLock) {
+ formatPartitionLocked();
+ doSetOemUnlockEnabledLocked(true);
+ }
+ }
+ }
+
private void enforceOemUnlockPermission() {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.OEM_UNLOCK_STATE,
@@ -285,6 +295,28 @@
}
}
+ private boolean doGetOemUnlockEnabled() {
+ DataInputStream inputStream;
+ try {
+ inputStream = new DataInputStream(new FileInputStream(new File(mDataBlockFile)));
+ } catch (FileNotFoundException e) {
+ Slog.e(TAG, "partition not available");
+ return false;
+ }
+
+ try {
+ synchronized (mLock) {
+ inputStream.skip(getBlockDeviceSize() - 1);
+ return inputStream.readByte() != 0;
+ }
+ } catch (IOException e) {
+ Slog.e(TAG, "unable to access persistent partition", e);
+ return false;
+ } finally {
+ IoUtils.closeQuietly(inputStream);
+ }
+ }
+
private native long nativeGetBlockDeviceSize(String path);
private native int nativeWipe(String path);
@@ -410,25 +442,7 @@
@Override
public boolean getOemUnlockEnabled() {
enforceOemUnlockPermission();
- DataInputStream inputStream;
- try {
- inputStream = new DataInputStream(new FileInputStream(new File(mDataBlockFile)));
- } catch (FileNotFoundException e) {
- Slog.e(TAG, "partition not available");
- return false;
- }
-
- try {
- synchronized (mLock) {
- inputStream.skip(getBlockDeviceSize() - 1);
- return inputStream.readByte() != 0;
- }
- } catch (IOException e) {
- Slog.e(TAG, "unable to access persistent partition", e);
- return false;
- } finally {
- IoUtils.closeQuietly(inputStream);
- }
+ return doGetOemUnlockEnabled();
}
@Override
diff --git a/services/core/java/com/android/server/SystemConfig.java b/services/core/java/com/android/server/SystemConfig.java
index eb89f21..6ad128c 100644
--- a/services/core/java/com/android/server/SystemConfig.java
+++ b/services/core/java/com/android/server/SystemConfig.java
@@ -205,8 +205,8 @@
}
if (!parser.getName().equals("permissions") && !parser.getName().equals("config")) {
- throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() +
- ", expected 'permissions' or 'config'");
+ throw new XmlPullParserException("Unexpected start tag in " + permFile
+ + ": found " + parser.getName() + ", expected 'permissions' or 'config'");
}
while (true) {
@@ -222,7 +222,7 @@
int gid = android.os.Process.getGidForName(gidStr);
mGlobalGids = appendInt(mGlobalGids, gid);
} else {
- Slog.w(TAG, "<group> without gid at "
+ Slog.w(TAG, "<group> without gid in " + permFile + " at "
+ parser.getPositionDescription());
}
@@ -231,7 +231,7 @@
} else if ("permission".equals(name) && !onlyFeatures) {
String perm = parser.getAttributeValue(null, "name");
if (perm == null) {
- Slog.w(TAG, "<permission> without name at "
+ Slog.w(TAG, "<permission> without name in " + permFile + " at "
+ parser.getPositionDescription());
XmlUtils.skipCurrentTag(parser);
continue;
@@ -242,14 +242,14 @@
} else if ("assign-permission".equals(name) && !onlyFeatures) {
String perm = parser.getAttributeValue(null, "name");
if (perm == null) {
- Slog.w(TAG, "<assign-permission> without name at "
+ Slog.w(TAG, "<assign-permission> without name in " + permFile + " at "
+ parser.getPositionDescription());
XmlUtils.skipCurrentTag(parser);
continue;
}
String uidStr = parser.getAttributeValue(null, "uid");
if (uidStr == null) {
- Slog.w(TAG, "<assign-permission> without uid at "
+ Slog.w(TAG, "<assign-permission> without uid in " + permFile + " at "
+ parser.getPositionDescription());
XmlUtils.skipCurrentTag(parser);
continue;
@@ -257,7 +257,7 @@
int uid = Process.getUidForName(uidStr);
if (uid < 0) {
Slog.w(TAG, "<assign-permission> with unknown uid \""
- + uidStr + "\" at "
+ + uidStr + " in " + permFile + " at "
+ parser.getPositionDescription());
XmlUtils.skipCurrentTag(parser);
continue;
@@ -275,10 +275,10 @@
String lname = parser.getAttributeValue(null, "name");
String lfile = parser.getAttributeValue(null, "file");
if (lname == null) {
- Slog.w(TAG, "<library> without name at "
+ Slog.w(TAG, "<library> without name in " + permFile + " at "
+ parser.getPositionDescription());
} else if (lfile == null) {
- Slog.w(TAG, "<library> without file at "
+ Slog.w(TAG, "<library> without file in " + permFile + " at "
+ parser.getPositionDescription());
} else {
//Log.i(TAG, "Got library " + lname + " in " + lfile);
@@ -297,7 +297,7 @@
allowed = !"true".equals(notLowRam);
}
if (fname == null) {
- Slog.w(TAG, "<feature> without name at "
+ Slog.w(TAG, "<feature> without name in " + permFile + " at "
+ parser.getPositionDescription());
} else if (allowed) {
//Log.i(TAG, "Got feature " + fname);
@@ -311,7 +311,7 @@
} else if ("unavailable-feature".equals(name)) {
String fname = parser.getAttributeValue(null, "name");
if (fname == null) {
- Slog.w(TAG, "<unavailable-feature> without name at "
+ Slog.w(TAG, "<unavailable-feature> without name in " + permFile + " at "
+ parser.getPositionDescription());
} else {
mUnavailableFeatures.add(fname);
@@ -322,7 +322,7 @@
} else if ("allow-in-power-save".equals(name) && !onlyFeatures) {
String pkgname = parser.getAttributeValue(null, "package");
if (pkgname == null) {
- Slog.w(TAG, "<allow-in-power-save> without package at "
+ Slog.w(TAG, "<allow-in-power-save> without package in " + permFile + " at "
+ parser.getPositionDescription());
} else {
mAllowInPowerSave.add(pkgname);
@@ -333,7 +333,7 @@
} else if ("fixed-ime-app".equals(name) && !onlyFeatures) {
String pkgname = parser.getAttributeValue(null, "package");
if (pkgname == null) {
- Slog.w(TAG, "<fixed-ime-app> without package at "
+ Slog.w(TAG, "<fixed-ime-app> without package in " + permFile + " at "
+ parser.getPositionDescription());
} else {
mFixedImeApps.add(pkgname);
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index 72c2eaf..8d7a182 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -338,7 +338,7 @@
}
@Override
- public void registerOnSubscriptionsChangedListener(String pkgForDebug,
+ public void addOnSubscriptionsChangedListener(String pkgForDebug,
IOnSubscriptionsChangedListener callback) {
int callerUid = UserHandle.getCallingUserId();
int myUid = UserHandle.myUserId();
@@ -393,7 +393,7 @@
}
@Override
- public void unregisterOnSubscriptionsChangedListener(String pkgForDebug,
+ public void removeOnSubscriptionsChangedListener(String pkgForDebug,
IOnSubscriptionsChangedListener callback) {
if (DBG) log("listen oscl: Unregister");
remove(callback.asBinder());
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index f02a815..0135fcb 100755
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -751,6 +751,9 @@
}
}
+ mAm.startAssociationLocked(callerApp.uid, callerApp.processName,
+ s.appInfo.uid, s.name, s.processName);
+
AppBindRecord b = s.retrieveAppBindingLocked(service, callerApp);
ConnectionRecord c = new ConnectionRecord(b, activity,
connection, flags, clientLabel, clientIntent);
@@ -1322,6 +1325,7 @@
// We are now bringing the service up, so no longer in the
// restarting state.
if (mRestartingServices.remove(r)) {
+ r.resetRestartCounter();
clearRestartingIfNeededLocked(r);
}
@@ -1445,10 +1449,10 @@
boolean created = false;
try {
- String nameTerm;
- int lastPeriod = r.shortName.lastIndexOf('.');
- nameTerm = lastPeriod >= 0 ? r.shortName.substring(lastPeriod) : r.shortName;
if (LOG_SERVICE_START_STOP) {
+ String nameTerm;
+ int lastPeriod = r.shortName.lastIndexOf('.');
+ nameTerm = lastPeriod >= 0 ? r.shortName.substring(lastPeriod) : r.shortName;
EventLogTags.writeAmCreateService(
r.userId, System.identityHashCode(r), nameTerm, r.app.uid, r.app.pid);
}
@@ -1746,6 +1750,8 @@
}
}
+ mAm.stopAssociationLocked(b.client.uid, b.client.processName, s.appInfo.uid, s.name);
+
if (b.connections.size() == 0) {
b.intent.apps.remove(b.client);
}
@@ -2367,7 +2373,8 @@
if (proc.executingServices.size() == 0 || proc.thread == null) {
return;
}
- long maxTime = SystemClock.uptimeMillis() -
+ final long now = SystemClock.uptimeMillis();
+ final long maxTime = now -
(proc.execServicesFg ? SERVICE_TIMEOUT : SERVICE_BACKGROUND_TIMEOUT);
ServiceRecord timeout = null;
long nextTime = 0;
@@ -2383,7 +2390,21 @@
}
if (timeout != null && mAm.mLruProcesses.contains(proc)) {
Slog.w(TAG, "Timeout executing service: " + timeout);
- anrMessage = "Executing service " + timeout.shortName;
+ StringBuilder sb = new StringBuilder();
+ sb.append("sxecuting service ");
+ sb.append(timeout.shortName);
+ sb.append(" (execStart=");
+ TimeUtils.formatDuration(now-timeout.executingStart, sb);
+ sb.append(", nesting=");
+ sb.append(timeout.executeNesting);
+ sb.append(", fg=");
+ sb.append(proc.execServicesFg);
+ sb.append(", create=");
+ TimeUtils.formatDuration(now-timeout.createTime, sb);
+ sb.append(", proc=");
+ sb.append(timeout.app != null ? timeout.app.toShortString() : "null");
+ sb.append(")");
+ anrMessage = sb.toString();
} else {
Message msg = mAm.mHandler.obtainMessage(
ActivityManagerService.SERVICE_TIMEOUT_MSG);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
old mode 100755
new mode 100644
index 3be3cf1..5846585
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -293,9 +293,6 @@
static final boolean IS_USER_BUILD = "user".equals(Build.TYPE);
- // Maximum number recent bitmaps to keep in memory.
- static final int MAX_RECENT_BITMAPS = 3;
-
// Amount of time after a call to stopAppSwitches() during which we will
// prevent further untrusted switches from happening.
static final long APP_SWITCH_DELAY_TIME = 5*1000;
@@ -410,16 +407,6 @@
return (isFg) ? mFgBroadcastQueue : mBgBroadcastQueue;
}
- BroadcastRecord broadcastRecordForReceiverLocked(IBinder receiver) {
- for (BroadcastQueue queue : mBroadcastQueues) {
- BroadcastRecord r = queue.getMatchingOrderedReceiver(receiver);
- if (r != null) {
- return r;
- }
- }
- return null;
- }
-
/**
* Activity we have told the window manager to have key focus.
*/
@@ -428,8 +415,7 @@
/**
* List of intents that were used to start the most recent tasks.
*/
- ArrayList<TaskRecord> mRecentTasks;
- ArrayList<TaskRecord> mTmpRecents = new ArrayList<TaskRecord>();
+ private final RecentTasks mRecentTasks;
/**
* For addAppTask: cached of the last activity component that was added.
@@ -749,6 +735,38 @@
final ActiveServices mServices;
+ final static class Association {
+ final int mSourceUid;
+ final String mSourceProcess;
+ final int mTargetUid;
+ final ComponentName mTargetComponent;
+ final String mTargetProcess;
+
+ int mCount;
+ long mTime;
+
+ int mNesting;
+ long mStartTime;
+
+ Association(int sourceUid, String sourceProcess, int targetUid,
+ ComponentName targetComponent, String targetProcess) {
+ mSourceUid = sourceUid;
+ mSourceProcess = sourceProcess;
+ mTargetUid = targetUid;
+ mTargetComponent = targetComponent;
+ mTargetProcess = targetProcess;
+ }
+ }
+
+ /**
+ * When service association tracking is enabled, this is all of the associations we
+ * have seen. Mapping is target uid -> target component -> source uid -> source process name
+ * -> association data.
+ */
+ final SparseArray<ArrayMap<ComponentName, SparseArray<ArrayMap<String, Association>>>>
+ mAssociations = new SparseArray<>();
+ boolean mTrackingAssociations;
+
/**
* Backup/restore process management
*/
@@ -2071,6 +2089,8 @@
GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version",
ConfigurationInfo.GL_ES_VERSION_UNDEFINED);
+ mTrackingAssociations = "1".equals(SystemProperties.get("debug.track-associations"));
+
mConfiguration.setToDefaults();
mConfiguration.setLocale(Locale.getDefault());
@@ -2079,8 +2099,9 @@
mCompatModePackages = new CompatModePackages(this, systemDir, mHandler);
mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler);
- mStackSupervisor = new ActivityStackSupervisor(this);
- mTaskPersister = new TaskPersister(systemDir, mStackSupervisor);
+ mRecentTasks = new RecentTasks(this);
+ mStackSupervisor = new ActivityStackSupervisor(this, mRecentTasks);
+ mTaskPersister = new TaskPersister(systemDir, mStackSupervisor, mRecentTasks);
mProcessCpuThread = new Thread("CpuTracker") {
@Override
@@ -2964,6 +2985,10 @@
instructionSet = VMRuntime.getInstructionSet(app.info.primaryCpuAbi);
}
+ app.gids = gids;
+ app.requiredAbi = requiredAbi;
+ app.instructionSet = instructionSet;
+
// Start the process. It will either succeed and return a result containing
// the PID of the new process, or else throw a RuntimeException.
boolean isActivityProcess = (entryPoint == null);
@@ -2994,7 +3019,11 @@
StringBuilder buf = mStringBuilder;
buf.setLength(0);
buf.append("Start proc ");
+ buf.append(startResult.pid);
+ buf.append(':');
buf.append(app.processName);
+ buf.append('/');
+ UserHandle.formatUid(buf, uid);
if (!isActivityProcess) {
buf.append(" [");
buf.append(entryPoint);
@@ -3006,23 +3035,6 @@
buf.append(" ");
buf.append(hostingNameStr);
}
- buf.append(": pid=");
- buf.append(startResult.pid);
- buf.append(" uid=");
- buf.append(uid);
- buf.append(" gids={");
- if (gids != null) {
- for (int gi=0; gi<gids.length; gi++) {
- if (gi != 0) buf.append(", ");
- buf.append(gids[gi]);
-
- }
- }
- buf.append("}");
- if (requiredAbi != null) {
- buf.append(" abi=");
- buf.append(requiredAbi);
- }
Slog.i(TAG, buf.toString());
app.setPid(startResult.pid);
app.usingWrapper = startResult.usingWrapper;
@@ -3615,10 +3627,14 @@
final Intent intent;
final int userId;
synchronized (this) {
- task = recentTaskForIdLocked(taskId);
+ task = mRecentTasks.taskForIdLocked(taskId);
if (task == null) {
throw new IllegalArgumentException("Task " + taskId + " not found.");
}
+ if (task.getRootActivity() != null) {
+ moveTaskToFrontLocked(task.taskId, 0, null);
+ return ActivityManager.START_TASK_TO_FRONT;
+ }
callingUid = task.mCallingUid;
callingPackage = task.mCallingPackage;
intent = task.intent;
@@ -3669,518 +3685,6 @@
return ret;
}
- //explicitly remove thd old information in mRecentTasks when removing existing user.
- private void removeRecentTasksForUserLocked(int userId) {
- if(userId <= 0) {
- Slog.i(TAG, "Can't remove recent task on user " + userId);
- return;
- }
-
- for (int i = mRecentTasks.size() - 1; i >= 0; --i) {
- TaskRecord tr = mRecentTasks.get(i);
- if (tr.userId == userId) {
- if(DEBUG_TASKS) Slog.i(TAG, "remove RecentTask " + tr
- + " when finishing user" + userId);
- mRecentTasks.remove(i);
- tr.removedFromRecents();
- }
- }
-
- // Remove tasks from persistent storage.
- notifyTaskPersisterLocked(null, true);
- }
-
- // Sort by taskId
- private Comparator<TaskRecord> mTaskRecordComparator = new Comparator<TaskRecord>() {
- @Override
- public int compare(TaskRecord lhs, TaskRecord rhs) {
- return rhs.taskId - lhs.taskId;
- }
- };
-
- // Extract the affiliates of the chain containing mRecentTasks[start].
- private int processNextAffiliateChainLocked(int start) {
- final TaskRecord startTask = mRecentTasks.get(start);
- final int affiliateId = startTask.mAffiliatedTaskId;
-
- // Quick identification of isolated tasks. I.e. those not launched behind.
- if (startTask.taskId == affiliateId && startTask.mPrevAffiliate == null &&
- startTask.mNextAffiliate == null) {
- // There is still a slim chance that there are other tasks that point to this task
- // and that the chain is so messed up that this task no longer points to them but
- // the gain of this optimization outweighs the risk.
- startTask.inRecents = true;
- return start + 1;
- }
-
- // Remove all tasks that are affiliated to affiliateId and put them in mTmpRecents.
- mTmpRecents.clear();
- for (int i = mRecentTasks.size() - 1; i >= start; --i) {
- final TaskRecord task = mRecentTasks.get(i);
- if (task.mAffiliatedTaskId == affiliateId) {
- mRecentTasks.remove(i);
- mTmpRecents.add(task);
- }
- }
-
- // Sort them all by taskId. That is the order they were create in and that order will
- // always be correct.
- Collections.sort(mTmpRecents, mTaskRecordComparator);
-
- // Go through and fix up the linked list.
- // The first one is the end of the chain and has no next.
- final TaskRecord first = mTmpRecents.get(0);
- first.inRecents = true;
- if (first.mNextAffiliate != null) {
- Slog.w(TAG, "Link error 1 first.next=" + first.mNextAffiliate);
- first.setNextAffiliate(null);
- notifyTaskPersisterLocked(first, false);
- }
- // Everything in the middle is doubly linked from next to prev.
- final int tmpSize = mTmpRecents.size();
- for (int i = 0; i < tmpSize - 1; ++i) {
- final TaskRecord next = mTmpRecents.get(i);
- final TaskRecord prev = mTmpRecents.get(i + 1);
- if (next.mPrevAffiliate != prev) {
- Slog.w(TAG, "Link error 2 next=" + next + " prev=" + next.mPrevAffiliate +
- " setting prev=" + prev);
- next.setPrevAffiliate(prev);
- notifyTaskPersisterLocked(next, false);
- }
- if (prev.mNextAffiliate != next) {
- Slog.w(TAG, "Link error 3 prev=" + prev + " next=" + prev.mNextAffiliate +
- " setting next=" + next);
- prev.setNextAffiliate(next);
- notifyTaskPersisterLocked(prev, false);
- }
- prev.inRecents = true;
- }
- // The last one is the beginning of the list and has no prev.
- final TaskRecord last = mTmpRecents.get(tmpSize - 1);
- if (last.mPrevAffiliate != null) {
- Slog.w(TAG, "Link error 4 last.prev=" + last.mPrevAffiliate);
- last.setPrevAffiliate(null);
- notifyTaskPersisterLocked(last, false);
- }
-
- // Insert the group back into mRecentTasks at start.
- mRecentTasks.addAll(start, mTmpRecents);
-
- // Let the caller know where we left off.
- return start + tmpSize;
- }
-
- /**
- * Update the recent tasks lists: make sure tasks should still be here (their
- * applications / activities still exist), update their availability, fixup ordering
- * of affiliations.
- */
- void cleanupRecentTasksLocked(int userId) {
- if (mRecentTasks == null) {
- // Happens when called from the packagemanager broadcast before boot.
- return;
- }
-
- final HashMap<ComponentName, ActivityInfo> availActCache = new HashMap<>();
- final HashMap<String, ApplicationInfo> availAppCache = new HashMap<>();
- final IPackageManager pm = AppGlobals.getPackageManager();
- final ActivityInfo dummyAct = new ActivityInfo();
- final ApplicationInfo dummyApp = new ApplicationInfo();
-
- int N = mRecentTasks.size();
-
- int[] users = userId == UserHandle.USER_ALL
- ? getUsersLocked() : new int[] { userId };
- for (int user : users) {
- for (int i = 0; i < N; i++) {
- TaskRecord task = mRecentTasks.get(i);
- if (task.userId != user) {
- // Only look at tasks for the user ID of interest.
- continue;
- }
- if (task.autoRemoveRecents && task.getTopActivity() == null) {
- // This situation is broken, and we should just get rid of it now.
- mRecentTasks.remove(i);
- task.removedFromRecents();
- i--;
- N--;
- Slog.w(TAG, "Removing auto-remove without activity: " + task);
- continue;
- }
- // Check whether this activity is currently available.
- if (task.realActivity != null) {
- ActivityInfo ai = availActCache.get(task.realActivity);
- if (ai == null) {
- try {
- ai = pm.getActivityInfo(task.realActivity,
- PackageManager.GET_UNINSTALLED_PACKAGES
- | PackageManager.GET_DISABLED_COMPONENTS, user);
- } catch (RemoteException e) {
- // Will never happen.
- continue;
- }
- if (ai == null) {
- ai = dummyAct;
- }
- availActCache.put(task.realActivity, ai);
- }
- if (ai == dummyAct) {
- // This could be either because the activity no longer exists, or the
- // app is temporarily gone. For the former we want to remove the recents
- // entry; for the latter we want to mark it as unavailable.
- ApplicationInfo app = availAppCache.get(task.realActivity.getPackageName());
- if (app == null) {
- try {
- app = pm.getApplicationInfo(task.realActivity.getPackageName(),
- PackageManager.GET_UNINSTALLED_PACKAGES
- | PackageManager.GET_DISABLED_COMPONENTS, user);
- } catch (RemoteException e) {
- // Will never happen.
- continue;
- }
- if (app == null) {
- app = dummyApp;
- }
- availAppCache.put(task.realActivity.getPackageName(), app);
- }
- if (app == dummyApp || (app.flags&ApplicationInfo.FLAG_INSTALLED) == 0) {
- // Doesn't exist any more! Good-bye.
- mRecentTasks.remove(i);
- task.removedFromRecents();
- i--;
- N--;
- Slog.w(TAG, "Removing no longer valid recent: " + task);
- continue;
- } else {
- // Otherwise just not available for now.
- if (task.isAvailable) {
- if (DEBUG_RECENTS) Slog.d(TAG, "Making recent unavailable: "
- + task);
- }
- task.isAvailable = false;
- }
- } else {
- if (!ai.enabled || !ai.applicationInfo.enabled
- || (ai.applicationInfo.flags&ApplicationInfo.FLAG_INSTALLED) == 0) {
- if (task.isAvailable) {
- if (DEBUG_RECENTS) Slog.d(TAG, "Making recent unavailable: "
- + task + " (enabled=" + ai.enabled + "/"
- + ai.applicationInfo.enabled + " flags="
- + Integer.toHexString(ai.applicationInfo.flags) + ")");
- }
- task.isAvailable = false;
- } else {
- if (!task.isAvailable) {
- if (DEBUG_RECENTS) Slog.d(TAG, "Making recent available: "
- + task);
- }
- task.isAvailable = true;
- }
- }
- }
- }
- }
-
- // Verify the affiliate chain for each task.
- for (int i = 0; i < N; i = processNextAffiliateChainLocked(i)) {
- }
-
- mTmpRecents.clear();
- // mRecentTasks is now in sorted, affiliated order.
- }
-
- private final boolean moveAffiliatedTasksToFront(TaskRecord task, int taskIndex) {
- int N = mRecentTasks.size();
- TaskRecord top = task;
- int topIndex = taskIndex;
- while (top.mNextAffiliate != null && topIndex > 0) {
- top = top.mNextAffiliate;
- topIndex--;
- }
- if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: adding affilliates starting at "
- + topIndex + " from intial " + taskIndex);
- // Find the end of the chain, doing a sanity check along the way.
- boolean sane = top.mAffiliatedTaskId == task.mAffiliatedTaskId;
- int endIndex = topIndex;
- TaskRecord prev = top;
- while (endIndex < N) {
- TaskRecord cur = mRecentTasks.get(endIndex);
- if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: looking at next chain @"
- + endIndex + " " + cur);
- if (cur == top) {
- // Verify start of the chain.
- if (cur.mNextAffiliate != null || cur.mNextAffiliateTaskId != INVALID_TASK_ID) {
- Slog.wtf(TAG, "Bad chain @" + endIndex
- + ": first task has next affiliate: " + prev);
- sane = false;
- break;
- }
- } else {
- // Verify middle of the chain's next points back to the one before.
- if (cur.mNextAffiliate != prev
- || cur.mNextAffiliateTaskId != prev.taskId) {
- Slog.wtf(TAG, "Bad chain @" + endIndex
- + ": middle task " + cur + " @" + endIndex
- + " has bad next affiliate "
- + cur.mNextAffiliate + " id " + cur.mNextAffiliateTaskId
- + ", expected " + prev);
- sane = false;
- break;
- }
- }
- if (cur.mPrevAffiliateTaskId == INVALID_TASK_ID) {
- // Chain ends here.
- if (cur.mPrevAffiliate != null) {
- Slog.wtf(TAG, "Bad chain @" + endIndex
- + ": last task " + cur + " has previous affiliate "
- + cur.mPrevAffiliate);
- sane = false;
- }
- if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: end of chain @" + endIndex);
- break;
- } else {
- // Verify middle of the chain's prev points to a valid item.
- if (cur.mPrevAffiliate == null) {
- Slog.wtf(TAG, "Bad chain @" + endIndex
- + ": task " + cur + " has previous affiliate "
- + cur.mPrevAffiliate + " but should be id "
- + cur.mPrevAffiliate);
- sane = false;
- break;
- }
- }
- if (cur.mAffiliatedTaskId != task.mAffiliatedTaskId) {
- Slog.wtf(TAG, "Bad chain @" + endIndex
- + ": task " + cur + " has affiliated id "
- + cur.mAffiliatedTaskId + " but should be "
- + task.mAffiliatedTaskId);
- sane = false;
- break;
- }
- prev = cur;
- endIndex++;
- if (endIndex >= N) {
- Slog.wtf(TAG, "Bad chain ran off index " + endIndex
- + ": last task " + prev);
- sane = false;
- break;
- }
- }
- if (sane) {
- if (endIndex < taskIndex) {
- Slog.wtf(TAG, "Bad chain @" + endIndex
- + ": did not extend to task " + task + " @" + taskIndex);
- sane = false;
- }
- }
- if (sane) {
- // All looks good, we can just move all of the affiliated tasks
- // to the top.
- for (int i=topIndex; i<=endIndex; i++) {
- if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: moving affiliated " + task
- + " from " + i + " to " + (i-topIndex));
- TaskRecord cur = mRecentTasks.remove(i);
- mRecentTasks.add(i-topIndex, cur);
- }
- if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: done moving tasks " + topIndex
- + " to " + endIndex);
- return true;
- }
-
- // Whoops, couldn't do it.
- return false;
- }
-
- final void addRecentTaskLocked(TaskRecord task) {
- final boolean isAffiliated = task.mAffiliatedTaskId != task.taskId
- || task.mNextAffiliateTaskId != INVALID_TASK_ID
- || task.mPrevAffiliateTaskId != INVALID_TASK_ID;
-
- int N = mRecentTasks.size();
- // Quick case: check if the top-most recent task is the same.
- if (!isAffiliated && N > 0 && mRecentTasks.get(0) == task) {
- if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: already at top: " + task);
- return;
- }
- // Another quick case: check if this is part of a set of affiliated
- // tasks that are at the top.
- if (isAffiliated && N > 0 && task.inRecents
- && task.mAffiliatedTaskId == mRecentTasks.get(0).mAffiliatedTaskId) {
- if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: affiliated " + mRecentTasks.get(0)
- + " at top when adding " + task);
- return;
- }
- // Another quick case: never add voice sessions.
- if (task.voiceSession != null) {
- if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: not adding voice interaction " + task);
- return;
- }
-
- boolean needAffiliationFix = false;
-
- // Slightly less quick case: the task is already in recents, so all we need
- // to do is move it.
- if (task.inRecents) {
- int taskIndex = mRecentTasks.indexOf(task);
- if (taskIndex >= 0) {
- if (!isAffiliated) {
- // Simple case: this is not an affiliated task, so we just move it to the front.
- mRecentTasks.remove(taskIndex);
- mRecentTasks.add(0, task);
- notifyTaskPersisterLocked(task, false);
- if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: moving to top " + task
- + " from " + taskIndex);
- return;
- } else {
- // More complicated: need to keep all affiliated tasks together.
- if (moveAffiliatedTasksToFront(task, taskIndex)) {
- // All went well.
- return;
- }
-
- // Uh oh... something bad in the affiliation chain, try to rebuild
- // everything and then go through our general path of adding a new task.
- needAffiliationFix = true;
- }
- } else {
- Slog.wtf(TAG, "Task with inRecent not in recents: " + task);
- needAffiliationFix = true;
- }
- }
-
- if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: trimming tasks for " + task);
- trimRecentsForTaskLocked(task, true);
-
- N = mRecentTasks.size();
- while (N >= ActivityManager.getMaxRecentTasksStatic()) {
- final TaskRecord tr = mRecentTasks.remove(N - 1);
- tr.removedFromRecents();
- N--;
- }
- task.inRecents = true;
- if (!isAffiliated || needAffiliationFix) {
- // If this is a simple non-affiliated task, or we had some failure trying to
- // handle it as part of an affilated task, then just place it at the top.
- mRecentTasks.add(0, task);
- } else if (isAffiliated) {
- // If this is a new affiliated task, then move all of the affiliated tasks
- // to the front and insert this new one.
- TaskRecord other = task.mNextAffiliate;
- if (other == null) {
- other = task.mPrevAffiliate;
- }
- if (other != null) {
- int otherIndex = mRecentTasks.indexOf(other);
- if (otherIndex >= 0) {
- // Insert new task at appropriate location.
- int taskIndex;
- if (other == task.mNextAffiliate) {
- // We found the index of our next affiliation, which is who is
- // before us in the list, so add after that point.
- taskIndex = otherIndex+1;
- } else {
- // We found the index of our previous affiliation, which is who is
- // after us in the list, so add at their position.
- taskIndex = otherIndex;
- }
- if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: new affiliated task added at "
- + taskIndex + ": " + task);
- mRecentTasks.add(taskIndex, task);
-
- // Now move everything to the front.
- if (moveAffiliatedTasksToFront(task, taskIndex)) {
- // All went well.
- return;
- }
-
- // Uh oh... something bad in the affiliation chain, try to rebuild
- // everything and then go through our general path of adding a new task.
- needAffiliationFix = true;
- } else {
- if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: couldn't find other affiliation "
- + other);
- needAffiliationFix = true;
- }
- } else {
- if (DEBUG_RECENTS) Slog.d(TAG,
- "addRecent: adding affiliated task without next/prev:" + task);
- needAffiliationFix = true;
- }
- }
- if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: adding " + task);
-
- if (needAffiliationFix) {
- if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: regrouping affiliations");
- cleanupRecentTasksLocked(task.userId);
- }
- }
-
- /**
- * If needed, remove oldest existing entries in recents that are for the same kind
- * of task as the given one.
- */
- int trimRecentsForTaskLocked(TaskRecord task, boolean doTrim) {
- int N = mRecentTasks.size();
- final Intent intent = task.intent;
- final boolean document = intent != null && intent.isDocument();
-
- int maxRecents = task.maxRecents - 1;
- for (int i=0; i<N; i++) {
- final TaskRecord tr = mRecentTasks.get(i);
- if (task != tr) {
- if (task.userId != tr.userId) {
- continue;
- }
- if (i > MAX_RECENT_BITMAPS) {
- tr.freeLastThumbnail();
- }
- final Intent trIntent = tr.intent;
- if ((task.affinity == null || !task.affinity.equals(tr.affinity)) &&
- (intent == null || !intent.filterEquals(trIntent))) {
- continue;
- }
- final boolean trIsDocument = trIntent != null && trIntent.isDocument();
- if (document && trIsDocument) {
- // These are the same document activity (not necessarily the same doc).
- if (maxRecents > 0) {
- --maxRecents;
- continue;
- }
- // Hit the maximum number of documents for this task. Fall through
- // and remove this document from recents.
- } else if (document || trIsDocument) {
- // Only one of these is a document. Not the droid we're looking for.
- continue;
- }
- }
-
- if (!doTrim) {
- // If the caller is not actually asking for a trim, just tell them we reached
- // a point where the trim would happen.
- return i;
- }
-
- // Either task and tr are the same or, their affinities match or their intents match
- // and neither of them is a document, or they are documents using the same activity
- // and their maxRecents has been reached.
- tr.disposeThumbnail();
- mRecentTasks.remove(i);
- if (task != tr) {
- tr.removedFromRecents();
- }
- i--;
- N--;
- if (task.intent == null) {
- // If the new recent task we are adding is not fully
- // specified, then replace it with the existing recent task.
- task = tr;
- }
- notifyTaskPersisterLocked(tr, false);
- }
-
- return -1;
- }
-
@Override
public void reportActivityFullyDrawn(IBinder token) {
synchronized (this) {
@@ -5289,7 +4793,6 @@
int callingPid = Binder.getCallingPid();
if (callingPid == Process.myPid()) {
// Yeah, um, no.
- Slog.w(TAG, "Can't addPackageDependency on system process");
return;
}
ProcessRecord proc;
@@ -5803,6 +5306,7 @@
// Take care of any services that are waiting for the process.
mServices.processStartTimedOutLocked(app);
app.kill("start timeout", true);
+ removeLruProcessLocked(app);
if (mBackupTarget != null && mBackupTarget.app.pid == pid) {
Slog.w(TAG, "Unattached app died before backup, skipping");
try {
@@ -8182,17 +7686,6 @@
}
}
- TaskRecord recentTaskForIdLocked(int id) {
- final int N = mRecentTasks.size();
- for (int i=0; i<N; i++) {
- TaskRecord tr = mRecentTasks.get(i);
- if (tr.taskId == id) {
- return tr;
- }
- }
- return null;
- }
-
@Override
public ActivityManager.TaskThumbnail getTaskThumbnail(int id) {
synchronized (this) {
@@ -8263,7 +7756,7 @@
TaskRecord task = new TaskRecord(this, mStackSupervisor.getNextTaskId(), ainfo,
intent, description);
- int trimIdx = trimRecentsForTaskLocked(task, false);
+ int trimIdx = mRecentTasks.trimForTaskLocked(task, false);
if (trimIdx >= 0) {
// If this would have caused a trim, then we'll abort because that
// means it would be added at the end of the list but then just removed.
@@ -9078,6 +8571,7 @@
}
cpr.connections.add(conn);
r.conProviders.add(conn);
+ startAssociationLocked(r.uid, r.processName, cpr.uid, cpr.name, cpr.info.processName);
return conn;
}
cpr.addExternalProcessHandleLocked(externalProcessToken);
@@ -9101,6 +8595,7 @@
if (conn.stableCount == 0 && conn.unstableCount == 0) {
cpr.connections.remove(conn);
conn.client.conProviders.remove(conn);
+ stopAssociationLocked(conn.client.uid, conn.client.processName, cpr.uid, cpr.name);
return true;
}
return false;
@@ -11165,12 +10660,11 @@
// security checks.
updateCurrentProfileIdsLocked();
- if (mRecentTasks == null) {
- mRecentTasks = mTaskPersister.restoreTasksLocked();
- mTaskPersister.restoreTasksFromOtherDeviceLocked();
- cleanupRecentTasksLocked(UserHandle.USER_ALL);
- mTaskPersister.startPersisting();
- }
+ mRecentTasks.clear();
+ mRecentTasks.addAll(mTaskPersister.restoreTasksLocked());
+ mTaskPersister.restoreTasksFromOtherDeviceLocked();
+ mRecentTasks.cleanupLocked(UserHandle.USER_ALL);
+ mTaskPersister.startPersisting();
// Check to see if there are any update receivers to run.
if (!mDidUpdate) {
@@ -11184,7 +10678,8 @@
mDidUpdate = true;
}
writeLastDonePreBootReceivers(doneReceivers);
- showBootMessage(mContext.getText(R.string.android_upgrading_complete),
+ showBootMessage(mContext.getText(
+ R.string.android_upgrading_complete),
false);
systemReady(goingCallback);
}
@@ -12318,9 +11813,18 @@
dumpAll = true;
} else if ("-c".equals(opt)) {
dumpClient = true;
+ } else if ("-p".equals(opt)) {
+ if (opti < args.length) {
+ dumpPackage = args[opti];
+ opti++;
+ } else {
+ pw.println("Error: -p option requires package argument");
+ return;
+ }
+ dumpClient = true;
} else if ("-h".equals(opt)) {
pw.println("Activity manager dump options:");
- pw.println(" [-a] [-c] [-h] [cmd] ...");
+ pw.println(" [-a] [-c] [-p package] [-h] [cmd] ...");
pw.println(" cmd may be one of:");
pw.println(" a[ctivities]: activity stack state");
pw.println(" r[recents]: recent activities state");
@@ -12331,17 +11835,21 @@
pw.println(" prov[iders] [COMP_SPEC ...]: content provider state");
pw.println(" provider [COMP_SPEC]: provider client-side state");
pw.println(" s[ervices] [COMP_SPEC ...]: service state");
+ pw.println(" as[sociations]: tracked app associations");
pw.println(" service [COMP_SPEC]: service client-side state");
pw.println(" package [PACKAGE_NAME]: all state related to given package");
pw.println(" all: dump all activities");
pw.println(" top: dump the top activity");
pw.println(" write: write all pending state to storage");
+ pw.println(" track-associations: enable association tracking");
+ pw.println(" untrack-associations: disable and clear association tracking");
pw.println(" cmd may also be a COMP_SPEC to dump activities.");
pw.println(" COMP_SPEC may be a component name (com.foo/.myApp),");
pw.println(" a partial substring in a component name, a");
pw.println(" hex object identifier.");
pw.println(" -a: include all available server state.");
pw.println(" -c: include client state.");
+ pw.println(" -p: limit output to given package.");
return;
} else {
pw.println("Unknown argument: " + opt + "; use -h for help");
@@ -12356,11 +11864,11 @@
opti++;
if ("activities".equals(cmd) || "a".equals(cmd)) {
synchronized (this) {
- dumpActivitiesLocked(fd, pw, args, opti, true, dumpClient, null);
+ dumpActivitiesLocked(fd, pw, args, opti, true, dumpClient, dumpPackage);
}
} else if ("recents".equals(cmd) || "r".equals(cmd)) {
synchronized (this) {
- dumpRecentsLocked(fd, pw, args, opti, true, null);
+ dumpRecentsLocked(fd, pw, args, opti, true, dumpPackage);
}
} else if ("broadcasts".equals(cmd) || "b".equals(cmd)) {
String[] newArgs;
@@ -12369,14 +11877,14 @@
name = null;
newArgs = EMPTY_STRING_ARRAY;
} else {
- name = args[opti];
+ dumpPackage = args[opti];
opti++;
newArgs = new String[args.length - opti];
if (args.length > 2) System.arraycopy(args, opti, newArgs, 0,
args.length - opti);
}
synchronized (this) {
- dumpBroadcastsLocked(fd, pw, args, opti, true, name);
+ dumpBroadcastsLocked(fd, pw, args, opti, true, dumpPackage);
}
} else if ("intents".equals(cmd) || "i".equals(cmd)) {
String[] newArgs;
@@ -12385,14 +11893,14 @@
name = null;
newArgs = EMPTY_STRING_ARRAY;
} else {
- name = args[opti];
+ dumpPackage = args[opti];
opti++;
newArgs = new String[args.length - opti];
if (args.length > 2) System.arraycopy(args, opti, newArgs, 0,
args.length - opti);
}
synchronized (this) {
- dumpPendingIntentsLocked(fd, pw, args, opti, true, name);
+ dumpPendingIntentsLocked(fd, pw, args, opti, true, dumpPackage);
}
} else if ("processes".equals(cmd) || "p".equals(cmd)) {
String[] newArgs;
@@ -12401,14 +11909,14 @@
name = null;
newArgs = EMPTY_STRING_ARRAY;
} else {
- name = args[opti];
+ dumpPackage = args[opti];
opti++;
newArgs = new String[args.length - opti];
if (args.length > 2) System.arraycopy(args, opti, newArgs, 0,
args.length - opti);
}
synchronized (this) {
- dumpProcessesLocked(fd, pw, args, opti, true, name);
+ dumpProcessesLocked(fd, pw, args, opti, true, dumpPackage);
}
} else if ("oom".equals(cmd) || "o".equals(cmd)) {
synchronized (this) {
@@ -12466,14 +11974,39 @@
opti = 0;
more = true;
}
+ } else if ("associations".equals(cmd) || "as".equals(cmd)) {
+ synchronized (this) {
+ dumpAssociationsLocked(fd, pw, args, opti, true, dumpClient, dumpPackage);
+ }
} else if ("services".equals(cmd) || "s".equals(cmd)) {
synchronized (this) {
- mServices.dumpServicesLocked(fd, pw, args, opti, true, dumpClient, null);
+ mServices.dumpServicesLocked(fd, pw, args, opti, true, dumpClient, dumpPackage);
}
} else if ("write".equals(cmd)) {
mTaskPersister.flush();
pw.println("All tasks persisted.");
return;
+ } else if ("track-associations".equals(cmd)) {
+ synchronized (this) {
+ if (!mTrackingAssociations) {
+ mTrackingAssociations = true;
+ pw.println("Association tracking started.");
+ } else {
+ pw.println("Association tracking already enabled.");
+ }
+ }
+ return;
+ } else if ("untrack-associations".equals(cmd)) {
+ synchronized (this) {
+ if (mTrackingAssociations) {
+ mTrackingAssociations = false;
+ mAssociations.clear();
+ pw.println("Association tracking stopped.");
+ } else {
+ pw.println("Association tracking not running.");
+ }
+ }
+ return;
} else {
// Dumping a single activity?
if (!dumpActivity(fd, pw, cmd, args, opti, dumpAll)) {
@@ -12515,6 +12048,13 @@
pw.println("-------------------------------------------------------------------------------");
}
dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
+ if (mAssociations.size() > 0) {
+ pw.println();
+ if (dumpAll) {
+ pw.println("-------------------------------------------------------------------------------");
+ }
+ dumpAssociationsLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
+ }
pw.println();
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
@@ -12589,6 +12129,78 @@
}
}
+ void dumpAssociationsLocked(FileDescriptor fd, PrintWriter pw, String[] args,
+ int opti, boolean dumpAll, boolean dumpClient, String dumpPackage) {
+ pw.println("ACTIVITY MANAGER ASSOCIATIONS (dumpsys activity associations)");
+
+ int dumpUid = 0;
+ if (dumpPackage != null) {
+ IPackageManager pm = AppGlobals.getPackageManager();
+ try {
+ dumpUid = pm.getPackageUid(dumpPackage, 0);
+ } catch (RemoteException e) {
+ }
+ }
+
+ boolean printedAnything = false;
+
+ final long now = SystemClock.uptimeMillis();
+
+ for (int i1=0, N1=mAssociations.size(); i1<N1; i1++) {
+ ArrayMap<ComponentName, SparseArray<ArrayMap<String, Association>>> targetComponents
+ = mAssociations.valueAt(i1);
+ for (int i2=0, N2=targetComponents.size(); i2<N2; i2++) {
+ SparseArray<ArrayMap<String, Association>> sourceUids
+ = targetComponents.valueAt(i2);
+ for (int i3=0, N3=sourceUids.size(); i3<N3; i3++) {
+ ArrayMap<String, Association> sourceProcesses = sourceUids.valueAt(i3);
+ for (int i4=0, N4=sourceProcesses.size(); i4<N4; i4++) {
+ Association ass = sourceProcesses.valueAt(i4);
+ if (dumpPackage != null) {
+ if (!ass.mTargetComponent.getPackageName().equals(dumpPackage)
+ && UserHandle.getAppId(ass.mSourceUid) != dumpUid) {
+ continue;
+ }
+ }
+ printedAnything = true;
+ pw.print(" ");
+ pw.print(ass.mTargetProcess);
+ pw.print("/");
+ UserHandle.formatUid(pw, ass.mTargetUid);
+ pw.print(" <- ");
+ pw.print(ass.mSourceProcess);
+ pw.print("/");
+ UserHandle.formatUid(pw, ass.mSourceUid);
+ pw.println();
+ pw.print(" via ");
+ pw.print(ass.mTargetComponent.flattenToShortString());
+ pw.println();
+ pw.print(" ");
+ long dur = ass.mTime;
+ if (ass.mNesting > 0) {
+ dur += now - ass.mStartTime;
+ }
+ TimeUtils.formatDuration(dur, pw);
+ pw.print(" (");
+ pw.print(ass.mCount);
+ pw.println(" times)");
+ if (ass.mNesting > 0) {
+ pw.print(" ");
+ pw.print(" Currently active: ");
+ TimeUtils.formatDuration(now - ass.mStartTime, pw);
+ pw.println();
+ }
+ }
+ }
+ }
+
+ }
+
+ if (!printedAnything) {
+ pw.println(" (nothing)");
+ }
+ }
+
void dumpProcessesLocked(FileDescriptor fd, PrintWriter pw, String[] args,
int opti, boolean dumpAll, String dumpPackage) {
boolean needSep = false;
@@ -14685,7 +14297,9 @@
// In the protocol here, we don't expect the client to correctly
// clean up this connection, we'll just remove it.
cpr.connections.remove(i);
- conn.client.conProviders.remove(conn);
+ if (conn.client.conProviders.remove(conn)) {
+ stopAssociationLocked(capp.uid, capp.processName, cpr.uid, cpr.name);
+ }
}
}
@@ -14771,6 +14385,8 @@
for (int i=0; i<app.conProviders.size(); i++) {
ContentProviderConnection conn = app.conProviders.get(i);
conn.provider.connections.remove(conn);
+ stopAssociationLocked(app.uid, app.processName, conn.provider.uid,
+ conn.provider.name);
}
app.conProviders.clear();
}
@@ -15539,11 +15155,11 @@
synchronized(this) {
ReceiverList rl = mRegisteredReceivers.get(receiver.asBinder());
if (rl != null) {
- if (rl.curBroadcast != null) {
- BroadcastRecord r = rl.curBroadcast;
- final boolean doNext = finishReceiverLocked(
- receiver.asBinder(), r.resultCode, r.resultData,
- r.resultExtras, r.resultAbort);
+ final BroadcastRecord r = rl.curBroadcast;
+ if (r != null && r == r.queue.getMatchingOrderedReceiver(r)) {
+ final boolean doNext = r.queue.finishReceiverLocked(
+ r, r.resultCode, r.resultData, r.resultExtras,
+ r.resultAbort, false);
if (doNext) {
doTrim = true;
r.queue.processNextBroadcast(false);
@@ -15802,14 +15418,14 @@
forceStopPackageLocked(list[i], -1, false, true, true,
false, false, userId, "storage unmount");
}
- cleanupRecentTasksLocked(UserHandle.USER_ALL);
+ mRecentTasks.cleanupLocked(UserHandle.USER_ALL);
sendPackageBroadcastLocked(
IApplicationThread.EXTERNAL_STORAGE_UNAVAILABLE, list,
userId);
}
break;
case Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE:
- cleanupRecentTasksLocked(UserHandle.USER_ALL);
+ mRecentTasks.cleanupLocked(UserHandle.USER_ALL);
break;
case Intent.ACTION_PACKAGE_REMOVED:
case Intent.ACTION_PACKAGE_CHANGED:
@@ -16231,17 +15847,6 @@
}
}
- private final boolean finishReceiverLocked(IBinder receiver, int resultCode,
- String resultData, Bundle resultExtras, boolean resultAbort) {
- final BroadcastRecord r = broadcastRecordForReceiverLocked(receiver);
- if (r == null) {
- Slog.w(TAG, "finishReceiver called but not found on queue");
- return false;
- }
-
- return r.queue.finishReceiverLocked(r, resultCode, resultData, resultExtras, resultAbort, false);
- }
-
void backgroundServicesFinishedLocked(int userId) {
for (BroadcastQueue queue : mBroadcastQueues) {
queue.backgroundServicesFinishedLocked(userId);
@@ -16249,7 +15854,7 @@
}
public void finishReceiver(IBinder who, int resultCode, String resultData,
- Bundle resultExtras, boolean resultAbort) {
+ Bundle resultExtras, boolean resultAbort, int flags) {
if (DEBUG_BROADCAST) Slog.v(TAG, "Finish receiver: " + who);
// Refuse possible leaked file descriptors
@@ -16263,7 +15868,9 @@
BroadcastRecord r;
synchronized(this) {
- r = broadcastRecordForReceiverLocked(who);
+ BroadcastQueue queue = (flags & Intent.FLAG_RECEIVER_FOREGROUND) != 0
+ ? mFgBroadcastQueue : mBgBroadcastQueue;
+ r = queue.getMatchingOrderedReceiver(who);
if (r != null) {
doNext = r.queue.finishReceiverLocked(r, resultCode,
resultData, resultExtras, resultAbort, true);
@@ -16713,6 +16320,69 @@
return null;
}
+ Association startAssociationLocked(int sourceUid, String sourceProcess, int targetUid,
+ ComponentName targetComponent, String targetProcess) {
+ if (!mTrackingAssociations) {
+ return null;
+ }
+ ArrayMap<ComponentName, SparseArray<ArrayMap<String, Association>>> components
+ = mAssociations.get(targetUid);
+ if (components == null) {
+ components = new ArrayMap<>();
+ mAssociations.put(targetUid, components);
+ }
+ SparseArray<ArrayMap<String, Association>> sourceUids = components.get(targetComponent);
+ if (sourceUids == null) {
+ sourceUids = new SparseArray<>();
+ components.put(targetComponent, sourceUids);
+ }
+ ArrayMap<String, Association> sourceProcesses = sourceUids.get(sourceUid);
+ if (sourceProcesses == null) {
+ sourceProcesses = new ArrayMap<>();
+ sourceUids.put(sourceUid, sourceProcesses);
+ }
+ Association ass = sourceProcesses.get(sourceProcess);
+ if (ass == null) {
+ ass = new Association(sourceUid, sourceProcess, targetUid, targetComponent,
+ targetProcess);
+ sourceProcesses.put(sourceProcess, ass);
+ }
+ ass.mCount++;
+ ass.mNesting++;
+ if (ass.mNesting == 1) {
+ ass.mStartTime = SystemClock.uptimeMillis();
+ }
+ return ass;
+ }
+
+ void stopAssociationLocked(int sourceUid, String sourceProcess, int targetUid,
+ ComponentName targetComponent) {
+ if (!mTrackingAssociations) {
+ return;
+ }
+ ArrayMap<ComponentName, SparseArray<ArrayMap<String, Association>>> components
+ = mAssociations.get(targetUid);
+ if (components == null) {
+ return;
+ }
+ SparseArray<ArrayMap<String, Association>> sourceUids = components.get(targetComponent);
+ if (sourceUids == null) {
+ return;
+ }
+ ArrayMap<String, Association> sourceProcesses = sourceUids.get(sourceUid);
+ if (sourceProcesses == null) {
+ return;
+ }
+ Association ass = sourceProcesses.get(sourceProcess);
+ if (ass == null || ass.mNesting <= 0) {
+ return;
+ }
+ ass.mNesting--;
+ if (ass.mNesting == 0) {
+ ass.mTime += SystemClock.uptimeMillis() - ass.mStartTime;
+ }
+ }
+
private final int computeOomAdjLocked(ProcessRecord app, int cachedAdj, ProcessRecord TOP_APP,
boolean doingAll, long now) {
if (mAdjSeq == app.adjSeq) {
@@ -19200,7 +18870,7 @@
}
// Explicitly remove the old information in mRecentTasks.
- removeRecentTasksForUserLocked(userId);
+ mRecentTasks.removeTasksForUserLocked(userId);
}
for (int i=0; i<callbacks.size(); i++) {
@@ -19431,7 +19101,7 @@
synchronized (ActivityManagerService.this) {
long origId = Binder.clearCallingIdentity();
try {
- TaskRecord tr = recentTaskForIdLocked(mTaskId);
+ TaskRecord tr = mRecentTasks.taskForIdLocked(mTaskId);
if (tr == null) {
throw new IllegalArgumentException("Unable to find task ID " + mTaskId);
}
@@ -19445,20 +19115,8 @@
@Override
public void moveToFront() {
checkCaller();
-
- final TaskRecord tr;
- synchronized (ActivityManagerService.this) {
- tr = recentTaskForIdLocked(mTaskId);
- if (tr == null) {
- throw new IllegalArgumentException("Unable to find task ID " + mTaskId);
- }
- if (tr.getRootActivity() != null) {
- moveTaskToFrontLocked(tr.taskId, 0, null);
- return;
- }
- }
-
- startActivityFromRecentsInner(tr.taskId, null);
+ // Will bring task to front if it already has a root activity.
+ startActivityFromRecentsInner(mTaskId, null);
}
@Override
@@ -19470,7 +19128,7 @@
TaskRecord tr;
IApplicationThread appThread;
synchronized (ActivityManagerService.this) {
- tr = recentTaskForIdLocked(mTaskId);
+ tr = mRecentTasks.taskForIdLocked(mTaskId);
if (tr == null) {
throw new IllegalArgumentException("Unable to find task ID " + mTaskId);
}
@@ -19491,7 +19149,7 @@
synchronized (ActivityManagerService.this) {
long origId = Binder.clearCallingIdentity();
try {
- TaskRecord tr = recentTaskForIdLocked(mTaskId);
+ TaskRecord tr = mRecentTasks.taskForIdLocked(mTaskId);
if (tr == null) {
throw new IllegalArgumentException("Unable to find task ID " + mTaskId);
}
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 89f4fe0..9223503 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -146,6 +146,7 @@
final ActivityManagerService mService;
final WindowManagerService mWindowManager;
+ private final RecentTasks mRecentTasks;
/**
* The back history of all previous (and possibly still
@@ -337,7 +338,8 @@
return count;
}
- ActivityStack(ActivityStackSupervisor.ActivityContainer activityContainer) {
+ ActivityStack(ActivityStackSupervisor.ActivityContainer activityContainer,
+ RecentTasks recentTasks) {
mActivityContainer = activityContainer;
mStackSupervisor = activityContainer.getOuter();
mService = mStackSupervisor.mService;
@@ -345,6 +347,7 @@
mWindowManager = mService.mWindowManager;
mStackId = activityContainer.mStackId;
mCurrentUser = mService.mCurrentUserId;
+ mRecentTasks = recentTasks;
}
/**
@@ -643,7 +646,7 @@
r.stopped = false;
mResumedActivity = r;
r.task.touchActiveTime();
- mService.addRecentTaskLocked(r.task);
+ mRecentTasks.addLocked(r.task);
completeResumeLocked(r);
mStackSupervisor.checkReadyForSleepLocked();
setLaunchTime(r);
@@ -1760,7 +1763,7 @@
next.state = ActivityState.RESUMED;
mResumedActivity = next;
next.task.touchActiveTime();
- mService.addRecentTaskLocked(next.task);
+ mRecentTasks.addLocked(next.task);
mService.updateLruProcessLocked(next.app, true, null);
updateLRUListLocked(next);
mService.updateOomAdjLocked();
@@ -4075,7 +4078,7 @@
if (task.autoRemoveFromRecents() || isVoiceSession) {
// Task creator asked to remove this when done, or this task was a voice
// interaction, so it should not remain on the recent tasks list.
- mService.mRecentTasks.remove(task);
+ mRecentTasks.remove(task);
task.removedFromRecents();
}
}
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index a612575..60fd116 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -166,6 +166,8 @@
final ActivityManagerService mService;
+ private final RecentTasks mRecentTasks;
+
final ActivityStackSupervisorHandler mHandler;
/** Short cut */
@@ -298,8 +300,9 @@
}
}
- public ActivityStackSupervisor(ActivityManagerService service) {
+ public ActivityStackSupervisor(ActivityManagerService service, RecentTasks recentTasks) {
mService = service;
+ mRecentTasks = recentTasks;
mHandler = new ActivityStackSupervisorHandler(mService.mHandler.getLooper());
}
@@ -414,6 +417,12 @@
if (DEBUG_STACK) Slog.d(TAG, "moveHomeTask: topStack old=" + topStack + " new="
+ mFocusedStack);
}
+ if (mService.mBooting || !mService.mBooted) {
+ final ActivityRecord r = topRunningActivityLocked();
+ if (r != null && r.idle) {
+ checkFinishBootingLocked();
+ }
+ }
}
void moveHomeStackTaskToTop(int homeStackTaskType) {
@@ -464,7 +473,7 @@
// Don't give up! Look in recents.
if (DEBUG_RECENTS) Slog.v(TAG, "Looking for task id=" + id + " in recents");
- TaskRecord task = mService.recentTaskForIdLocked(id);
+ TaskRecord task = mRecentTasks.taskForIdLocked(id);
if (task == null) {
if (DEBUG_RECENTS) Slog.d(TAG, "\tDidn't find task id=" + id + " in recents");
return null;
@@ -2235,6 +2244,24 @@
}
}
+ /**
+ * Called when the frontmost task is idle.
+ * @return the state of mService.mBooting before this was called.
+ */
+ private boolean checkFinishBootingLocked() {
+ final boolean booting = mService.mBooting;
+ boolean enableScreen = false;
+ mService.mBooting = false;
+ if (!mService.mBooted) {
+ mService.mBooted = true;
+ enableScreen = true;
+ }
+ if (booting || enableScreen) {
+ mService.postFinishBooting(booting, enableScreen);
+ }
+ return booting;
+ }
+
// Checked.
final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout,
Configuration config) {
@@ -2246,7 +2273,6 @@
int NS = 0;
int NF = 0;
boolean booting = false;
- boolean enableScreen = false;
boolean activityRemoved = false;
ActivityRecord r = ActivityRecord.forToken(token);
@@ -2274,12 +2300,7 @@
//Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
if (isFrontStack(r.task.stack) || fromTimeout) {
- booting = mService.mBooting;
- mService.mBooting = false;
- if (!mService.mBooted) {
- mService.mBooted = true;
- enableScreen = true;
- }
+ booting = checkFinishBootingLocked();
}
}
@@ -2352,10 +2373,6 @@
//dump();
//mWindowManager.dump();
- if (booting || enableScreen) {
- mService.postFinishBooting(booting, enableScreen);
- }
-
if (activityRemoved) {
resumeTopActivitiesLocked();
}
@@ -2624,6 +2641,8 @@
// before an application stack is created...Go ahead and create one on the default
// display.
stack = getStack(createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY));
+ // Restore home stack to top.
+ moveHomeStack(true);
if (DEBUG_RECENTS)
Slog.v(TAG, "Created stack=" + stack + " for recents restoration.");
}
@@ -2912,7 +2931,7 @@
r.mLaunchTaskBehind = false;
final TaskRecord task = r.task;
task.setLastThumbnail(task.stack.screenshotActivities(r));
- mService.addRecentTaskLocked(task);
+ mRecentTasks.addLocked(task);
mService.notifyTaskStackChangedLocked();
mWindowManager.setAppVisibility(r.appToken, false);
}
@@ -3675,7 +3694,7 @@
ActivityContainer(int stackId) {
synchronized (mService) {
mStackId = stackId;
- mStack = new ActivityStack(this);
+ mStack = new ActivityStack(this, mRecentTasks);
mIdString = "ActivtyContainer{" + mStackId + "}";
if (DEBUG_STACK) Slog.d(TAG, "Creating " + this);
}
diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java
index 0dc163b..d1682b8 100644
--- a/services/core/java/com/android/server/am/CoreSettingsObserver.java
+++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java
@@ -108,50 +108,46 @@
for (Map.Entry<String, Class<?>> entry : map.entrySet()) {
String setting = entry.getKey();
Class<?> type = entry.getValue();
- try {
- if (type == String.class) {
- final String value;
- if (map == sSecureSettingToTypeMap) {
- value = Settings.Secure.getString(context.getContentResolver(), setting);
- } else if (map == sSystemSettingToTypeMap) {
- value = Settings.System.getString(context.getContentResolver(), setting);
- } else {
- value = Settings.Global.getString(context.getContentResolver(), setting);
- }
- snapshot.putString(setting, value);
- } else if (type == int.class) {
- final int value;
- if (map == sSecureSettingToTypeMap) {
- value = Settings.Secure.getInt(context.getContentResolver(), setting);
- } else if (map == sSystemSettingToTypeMap) {
- value = Settings.System.getInt(context.getContentResolver(), setting);
- } else {
- value = Settings.Global.getInt(context.getContentResolver(), setting);
- }
- snapshot.putInt(setting, value);
- } else if (type == float.class) {
- final float value;
- if (map == sSecureSettingToTypeMap) {
- value = Settings.Secure.getFloat(context.getContentResolver(), setting);
- } else if (map == sSystemSettingToTypeMap) {
- value = Settings.System.getFloat(context.getContentResolver(), setting);
- } else {
- value = Settings.Global.getFloat(context.getContentResolver(), setting);
- }
- snapshot.putFloat(setting, value);
- } else if (type == long.class) {
- final long value;
- if (map == sSecureSettingToTypeMap) {
- value = Settings.Secure.getLong(context.getContentResolver(), setting);
- } else if (map == sSystemSettingToTypeMap) {
- value = Settings.System.getLong(context.getContentResolver(), setting);
- } else {
- value = Settings.Global.getLong(context.getContentResolver(), setting);
- }
- snapshot.putLong(setting, value);
+ if (type == String.class) {
+ final String value;
+ if (map == sSecureSettingToTypeMap) {
+ value = Settings.Secure.getString(context.getContentResolver(), setting);
+ } else if (map == sSystemSettingToTypeMap) {
+ value = Settings.System.getString(context.getContentResolver(), setting);
+ } else {
+ value = Settings.Global.getString(context.getContentResolver(), setting);
}
- } catch (SettingNotFoundException snfe) {
- Log.w(LOG_TAG, "Cannot find setting \"" + setting + "\"", snfe);
+ snapshot.putString(setting, value);
+ } else if (type == int.class) {
+ final int value;
+ if (map == sSecureSettingToTypeMap) {
+ value = Settings.Secure.getInt(context.getContentResolver(), setting, 0);
+ } else if (map == sSystemSettingToTypeMap) {
+ value = Settings.System.getInt(context.getContentResolver(), setting, 0);
+ } else {
+ value = Settings.Global.getInt(context.getContentResolver(), setting, 0);
+ }
+ snapshot.putInt(setting, value);
+ } else if (type == float.class) {
+ final float value;
+ if (map == sSecureSettingToTypeMap) {
+ value = Settings.Secure.getFloat(context.getContentResolver(), setting, 0);
+ } else if (map == sSystemSettingToTypeMap) {
+ value = Settings.System.getFloat(context.getContentResolver(), setting, 0);
+ } else {
+ value = Settings.Global.getFloat(context.getContentResolver(), setting, 0);
+ }
+ snapshot.putFloat(setting, value);
+ } else if (type == long.class) {
+ final long value;
+ if (map == sSecureSettingToTypeMap) {
+ value = Settings.Secure.getLong(context.getContentResolver(), setting, 0);
+ } else if (map == sSystemSettingToTypeMap) {
+ value = Settings.System.getLong(context.getContentResolver(), setting, 0);
+ } else {
+ value = Settings.Global.getLong(context.getContentResolver(), setting, 0);
+ }
+ snapshot.putLong(setting, value);
}
}
}
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index ae4af5f..c380160 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -235,15 +235,16 @@
Slog.i("XXXXXX", "minfree_adj=" + minfree_adj + " minfree_abs=" + minfree_abs);
}
- if (Build.SUPPORTED_64_BIT_ABIS.length > 0) {
- // Increase the high min-free levels for cached processes for 64-bit
- mOomMinFreeHigh[4] = (mOomMinFreeHigh[4]*3)/2;
- mOomMinFreeHigh[5] = (mOomMinFreeHigh[5]*7)/4;
- }
+ final boolean is64bit = Build.SUPPORTED_64_BIT_ABIS.length > 0;
for (int i=0; i<mOomAdj.length; i++) {
int low = mOomMinFreeLow[i];
int high = mOomMinFreeHigh[i];
+ if (is64bit) {
+ // Increase the high min-free levels for cached processes for 64-bit
+ if (i == 4) high = (high*3)/2;
+ else if (i == 5) high = (high*7)/4;
+ }
mOomMinFree[i] = (int)(low + ((high-low)*scale));
}
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 7c48f3e..a6c616a 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -64,6 +64,9 @@
ProcessStats.ProcessState baseProcessTracker;
BatteryStatsImpl.Uid.Proc curProcBatteryStats;
int pid; // The process of this application; 0 if none
+ int[] gids; // The gids this process was launched with
+ String requiredAbi; // The ABI this process was launched with
+ String instructionSet; // The instruction set this process was launched with
boolean starting; // True if the process is being started
long lastActivityTime; // For managing the LRU list
long lastPssTime; // Last time we retrieved PSS data
@@ -183,7 +186,17 @@
if (uid != info.uid) {
pw.print(" ISOLATED uid="); pw.print(uid);
}
- pw.println();
+ pw.print(" gids={");
+ if (gids != null) {
+ for (int gi=0; gi<gids.length; gi++) {
+ if (gi != 0) pw.print(", ");
+ pw.print(gids[gi]);
+
+ }
+ }
+ pw.println("}");
+ pw.print(prefix); pw.print("requiredAbi="); pw.print(requiredAbi);
+ pw.print(" instructionSet="); pw.println(instructionSet);
if (info.className != null) {
pw.print(prefix); pw.print("class="); pw.println(info.className);
}
diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java
new file mode 100644
index 0000000..f454fed
--- /dev/null
+++ b/services/core/java/com/android/server/am/RecentTasks.java
@@ -0,0 +1,577 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.am;
+
+import android.app.ActivityManager;
+import android.app.AppGlobals;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.util.Slog;
+
+import static com.android.server.am.ActivityManagerService.DEBUG_RECENTS;
+import static com.android.server.am.ActivityManagerService.DEBUG_TASKS;
+import static com.android.server.am.ActivityManagerService.TAG;
+import static com.android.server.am.TaskRecord.INVALID_TASK_ID;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+
+/**
+ * Class for managing the recent tasks list.
+ */
+class RecentTasks extends ArrayList<TaskRecord> {
+
+ // Maximum number recent bitmaps to keep in memory.
+ private static final int MAX_RECENT_BITMAPS = 3;
+
+ // Activity manager service.
+ private final ActivityManagerService mService;
+
+ // Mainly to avoid object recreation on multiple calls.
+ private final ArrayList<TaskRecord> mTmpRecents = new ArrayList<TaskRecord>();
+ private final HashMap<ComponentName, ActivityInfo> tmpAvailActCache = new HashMap<>();
+ private final HashMap<String, ApplicationInfo> tmpAvailAppCache = new HashMap<>();
+ private final ActivityInfo tmpActivityInfo = new ActivityInfo();
+ private final ApplicationInfo tmpAppInfo = new ApplicationInfo();
+
+ RecentTasks(ActivityManagerService service) {
+ mService = service;
+ }
+
+ TaskRecord taskForIdLocked(int id) {
+ final int recentsCount = size();
+ for (int i = 0; i < recentsCount; i++) {
+ TaskRecord tr = get(i);
+ if (tr.taskId == id) {
+ return tr;
+ }
+ }
+ return null;
+ }
+
+ /** Remove recent tasks for a user. */
+ void removeTasksForUserLocked(int userId) {
+ if(userId <= 0) {
+ Slog.i(TAG, "Can't remove recent task on user " + userId);
+ return;
+ }
+
+ for (int i = size() - 1; i >= 0; --i) {
+ TaskRecord tr = get(i);
+ if (tr.userId == userId) {
+ if(DEBUG_TASKS) Slog.i(TAG, "remove RecentTask " + tr
+ + " when finishing user" + userId);
+ remove(i);
+ tr.removedFromRecents();
+ }
+ }
+
+ // Remove tasks from persistent storage.
+ mService.notifyTaskPersisterLocked(null, true);
+ }
+
+ /**
+ * Update the recent tasks lists: make sure tasks should still be here (their
+ * applications / activities still exist), update their availability, fix-up ordering
+ * of affiliations.
+ */
+ void cleanupLocked(int userId) {
+ int recentsCount = size();
+ if (recentsCount == 0) {
+ // Happens when called from the packagemanager broadcast before boot,
+ // or just any empty list.
+ return;
+ }
+
+ final IPackageManager pm = AppGlobals.getPackageManager();
+ final int[] users = (userId == UserHandle.USER_ALL)
+ ? mService.getUsersLocked() : new int[] { userId };
+ for (int userIdx = 0; userIdx < users.length; userIdx++) {
+ final int user = users[userIdx];
+ recentsCount = size() - 1;
+ for (int i = recentsCount; i >= 0; i--) {
+ TaskRecord task = get(i);
+ if (task.userId != user) {
+ // Only look at tasks for the user ID of interest.
+ continue;
+ }
+ if (task.autoRemoveRecents && task.getTopActivity() == null) {
+ // This situation is broken, and we should just get rid of it now.
+ remove(i);
+ task.removedFromRecents();
+ Slog.w(TAG, "Removing auto-remove without activity: " + task);
+ continue;
+ }
+ // Check whether this activity is currently available.
+ if (task.realActivity != null) {
+ ActivityInfo ai = tmpAvailActCache.get(task.realActivity);
+ if (ai == null) {
+ try {
+ ai = pm.getActivityInfo(task.realActivity,
+ PackageManager.GET_UNINSTALLED_PACKAGES
+ | PackageManager.GET_DISABLED_COMPONENTS, user);
+ } catch (RemoteException e) {
+ // Will never happen.
+ continue;
+ }
+ if (ai == null) {
+ ai = tmpActivityInfo;
+ }
+ tmpAvailActCache.put(task.realActivity, ai);
+ }
+ if (ai == tmpActivityInfo) {
+ // This could be either because the activity no longer exists, or the
+ // app is temporarily gone. For the former we want to remove the recents
+ // entry; for the latter we want to mark it as unavailable.
+ ApplicationInfo app = tmpAvailAppCache.get(task.realActivity.getPackageName());
+ if (app == null) {
+ try {
+ app = pm.getApplicationInfo(task.realActivity.getPackageName(),
+ PackageManager.GET_UNINSTALLED_PACKAGES
+ | PackageManager.GET_DISABLED_COMPONENTS, user);
+ } catch (RemoteException e) {
+ // Will never happen.
+ continue;
+ }
+ if (app == null) {
+ app = tmpAppInfo;
+ }
+ tmpAvailAppCache.put(task.realActivity.getPackageName(), app);
+ }
+ if (app == tmpAppInfo || (app.flags&ApplicationInfo.FLAG_INSTALLED) == 0) {
+ // Doesn't exist any more! Good-bye.
+ remove(i);
+ task.removedFromRecents();
+ Slog.w(TAG, "Removing no longer valid recent: " + task);
+ continue;
+ } else {
+ // Otherwise just not available for now.
+ if (DEBUG_RECENTS && task.isAvailable) Slog.d(TAG,
+ "Making recent unavailable: " + task);
+ task.isAvailable = false;
+ }
+ } else {
+ if (!ai.enabled || !ai.applicationInfo.enabled
+ || (ai.applicationInfo.flags&ApplicationInfo.FLAG_INSTALLED) == 0) {
+ if (DEBUG_RECENTS && task.isAvailable) Slog.d(TAG,
+ "Making recent unavailable: " + task
+ + " (enabled=" + ai.enabled + "/" + ai.applicationInfo.enabled
+ + " flags=" + Integer.toHexString(ai.applicationInfo.flags)
+ + ")");
+ task.isAvailable = false;
+ } else {
+ if (DEBUG_RECENTS && !task.isAvailable) Slog.d(TAG,
+ "Making recent available: " + task);
+ task.isAvailable = true;
+ }
+ }
+ }
+ }
+ }
+
+ // Verify the affiliate chain for each task.
+ int i = 0;
+ recentsCount = size();
+ while (i < recentsCount) {
+ i = processNextAffiliateChainLocked(i);
+ }
+ // recent tasks are now in sorted, affiliated order.
+ }
+
+ private final boolean moveAffiliatedTasksToFront(TaskRecord task, int taskIndex) {
+ int recentsCount = size();
+ TaskRecord top = task;
+ int topIndex = taskIndex;
+ while (top.mNextAffiliate != null && topIndex > 0) {
+ top = top.mNextAffiliate;
+ topIndex--;
+ }
+ if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: adding affilliates starting at "
+ + topIndex + " from intial " + taskIndex);
+ // Find the end of the chain, doing a sanity check along the way.
+ boolean sane = top.mAffiliatedTaskId == task.mAffiliatedTaskId;
+ int endIndex = topIndex;
+ TaskRecord prev = top;
+ while (endIndex < recentsCount) {
+ TaskRecord cur = get(endIndex);
+ if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: looking at next chain @"
+ + endIndex + " " + cur);
+ if (cur == top) {
+ // Verify start of the chain.
+ if (cur.mNextAffiliate != null || cur.mNextAffiliateTaskId != INVALID_TASK_ID) {
+ Slog.wtf(TAG, "Bad chain @" + endIndex
+ + ": first task has next affiliate: " + prev);
+ sane = false;
+ break;
+ }
+ } else {
+ // Verify middle of the chain's next points back to the one before.
+ if (cur.mNextAffiliate != prev
+ || cur.mNextAffiliateTaskId != prev.taskId) {
+ Slog.wtf(TAG, "Bad chain @" + endIndex
+ + ": middle task " + cur + " @" + endIndex
+ + " has bad next affiliate "
+ + cur.mNextAffiliate + " id " + cur.mNextAffiliateTaskId
+ + ", expected " + prev);
+ sane = false;
+ break;
+ }
+ }
+ if (cur.mPrevAffiliateTaskId == INVALID_TASK_ID) {
+ // Chain ends here.
+ if (cur.mPrevAffiliate != null) {
+ Slog.wtf(TAG, "Bad chain @" + endIndex
+ + ": last task " + cur + " has previous affiliate "
+ + cur.mPrevAffiliate);
+ sane = false;
+ }
+ if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: end of chain @" + endIndex);
+ break;
+ } else {
+ // Verify middle of the chain's prev points to a valid item.
+ if (cur.mPrevAffiliate == null) {
+ Slog.wtf(TAG, "Bad chain @" + endIndex
+ + ": task " + cur + " has previous affiliate "
+ + cur.mPrevAffiliate + " but should be id "
+ + cur.mPrevAffiliate);
+ sane = false;
+ break;
+ }
+ }
+ if (cur.mAffiliatedTaskId != task.mAffiliatedTaskId) {
+ Slog.wtf(TAG, "Bad chain @" + endIndex
+ + ": task " + cur + " has affiliated id "
+ + cur.mAffiliatedTaskId + " but should be "
+ + task.mAffiliatedTaskId);
+ sane = false;
+ break;
+ }
+ prev = cur;
+ endIndex++;
+ if (endIndex >= recentsCount) {
+ Slog.wtf(TAG, "Bad chain ran off index " + endIndex
+ + ": last task " + prev);
+ sane = false;
+ break;
+ }
+ }
+ if (sane) {
+ if (endIndex < taskIndex) {
+ Slog.wtf(TAG, "Bad chain @" + endIndex
+ + ": did not extend to task " + task + " @" + taskIndex);
+ sane = false;
+ }
+ }
+ if (sane) {
+ // All looks good, we can just move all of the affiliated tasks
+ // to the top.
+ for (int i=topIndex; i<=endIndex; i++) {
+ if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: moving affiliated " + task
+ + " from " + i + " to " + (i-topIndex));
+ TaskRecord cur = remove(i);
+ add(i - topIndex, cur);
+ }
+ if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: done moving tasks " + topIndex
+ + " to " + endIndex);
+ return true;
+ }
+
+ // Whoops, couldn't do it.
+ return false;
+ }
+
+ final void addLocked(TaskRecord task) {
+ final boolean isAffiliated = task.mAffiliatedTaskId != task.taskId
+ || task.mNextAffiliateTaskId != INVALID_TASK_ID
+ || task.mPrevAffiliateTaskId != INVALID_TASK_ID;
+
+ int recentsCount = size();
+ // Quick case: never add voice sessions.
+ if (task.voiceSession != null) {
+ if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: not adding voice interaction " + task);
+ return;
+ }
+ // Another quick case: check if the top-most recent task is the same.
+ if (!isAffiliated && recentsCount > 0 && get(0) == task) {
+ if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: already at top: " + task);
+ return;
+ }
+ // Another quick case: check if this is part of a set of affiliated
+ // tasks that are at the top.
+ if (isAffiliated && recentsCount > 0 && task.inRecents
+ && task.mAffiliatedTaskId == get(0).mAffiliatedTaskId) {
+ if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: affiliated " + get(0)
+ + " at top when adding " + task);
+ return;
+ }
+
+ boolean needAffiliationFix = false;
+
+ // Slightly less quick case: the task is already in recents, so all we need
+ // to do is move it.
+ if (task.inRecents) {
+ int taskIndex = indexOf(task);
+ if (taskIndex >= 0) {
+ if (!isAffiliated) {
+ // Simple case: this is not an affiliated task, so we just move it to the front.
+ remove(taskIndex);
+ add(0, task);
+ mService.notifyTaskPersisterLocked(task, false);
+ if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: moving to top " + task
+ + " from " + taskIndex);
+ return;
+ } else {
+ // More complicated: need to keep all affiliated tasks together.
+ if (moveAffiliatedTasksToFront(task, taskIndex)) {
+ // All went well.
+ return;
+ }
+
+ // Uh oh... something bad in the affiliation chain, try to rebuild
+ // everything and then go through our general path of adding a new task.
+ needAffiliationFix = true;
+ }
+ } else {
+ Slog.wtf(TAG, "Task with inRecent not in recents: " + task);
+ needAffiliationFix = true;
+ }
+ }
+
+ if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: trimming tasks for " + task);
+ trimForTaskLocked(task, true);
+
+ recentsCount = size();
+ final int maxRecents = ActivityManager.getMaxRecentTasksStatic();
+ while (recentsCount >= maxRecents) {
+ final TaskRecord tr = remove(recentsCount - 1);
+ tr.removedFromRecents();
+ recentsCount--;
+ }
+ task.inRecents = true;
+ if (!isAffiliated || needAffiliationFix) {
+ // If this is a simple non-affiliated task, or we had some failure trying to
+ // handle it as part of an affilated task, then just place it at the top.
+ add(0, task);
+ if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: adding " + task);
+ } else if (isAffiliated) {
+ // If this is a new affiliated task, then move all of the affiliated tasks
+ // to the front and insert this new one.
+ TaskRecord other = task.mNextAffiliate;
+ if (other == null) {
+ other = task.mPrevAffiliate;
+ }
+ if (other != null) {
+ int otherIndex = indexOf(other);
+ if (otherIndex >= 0) {
+ // Insert new task at appropriate location.
+ int taskIndex;
+ if (other == task.mNextAffiliate) {
+ // We found the index of our next affiliation, which is who is
+ // before us in the list, so add after that point.
+ taskIndex = otherIndex+1;
+ } else {
+ // We found the index of our previous affiliation, which is who is
+ // after us in the list, so add at their position.
+ taskIndex = otherIndex;
+ }
+ if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: new affiliated task added at "
+ + taskIndex + ": " + task);
+ add(taskIndex, task);
+
+ // Now move everything to the front.
+ if (moveAffiliatedTasksToFront(task, taskIndex)) {
+ // All went well.
+ return;
+ }
+
+ // Uh oh... something bad in the affiliation chain, try to rebuild
+ // everything and then go through our general path of adding a new task.
+ needAffiliationFix = true;
+ } else {
+ if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: couldn't find other affiliation "
+ + other);
+ needAffiliationFix = true;
+ }
+ } else {
+ if (DEBUG_RECENTS) Slog.d(TAG,
+ "addRecent: adding affiliated task without next/prev:" + task);
+ needAffiliationFix = true;
+ }
+ }
+
+ if (needAffiliationFix) {
+ if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: regrouping affiliations");
+ cleanupLocked(task.userId);
+ }
+ }
+
+ /**
+ * If needed, remove oldest existing entries in recents that are for the same kind
+ * of task as the given one.
+ */
+ int trimForTaskLocked(TaskRecord task, boolean doTrim) {
+ int recentsCount = size();
+ final Intent intent = task.intent;
+ final boolean document = intent != null && intent.isDocument();
+
+ int maxRecents = task.maxRecents - 1;
+ for (int i = 0; i < recentsCount; i++) {
+ final TaskRecord tr = get(i);
+ if (task != tr) {
+ if (task.userId != tr.userId) {
+ continue;
+ }
+ if (i > MAX_RECENT_BITMAPS) {
+ tr.freeLastThumbnail();
+ }
+ final Intent trIntent = tr.intent;
+ if ((task.affinity == null || !task.affinity.equals(tr.affinity)) &&
+ (intent == null || !intent.filterEquals(trIntent))) {
+ continue;
+ }
+ final boolean trIsDocument = trIntent != null && trIntent.isDocument();
+ if (document && trIsDocument) {
+ // These are the same document activity (not necessarily the same doc).
+ if (maxRecents > 0) {
+ --maxRecents;
+ continue;
+ }
+ // Hit the maximum number of documents for this task. Fall through
+ // and remove this document from recents.
+ } else if (document || trIsDocument) {
+ // Only one of these is a document. Not the droid we're looking for.
+ continue;
+ }
+ }
+
+ if (!doTrim) {
+ // If the caller is not actually asking for a trim, just tell them we reached
+ // a point where the trim would happen.
+ return i;
+ }
+
+ // Either task and tr are the same or, their affinities match or their intents match
+ // and neither of them is a document, or they are documents using the same activity
+ // and their maxRecents has been reached.
+ tr.disposeThumbnail();
+ remove(i);
+ if (task != tr) {
+ tr.removedFromRecents();
+ }
+ i--;
+ recentsCount--;
+ if (task.intent == null) {
+ // If the new recent task we are adding is not fully
+ // specified, then replace it with the existing recent task.
+ task = tr;
+ }
+ mService.notifyTaskPersisterLocked(tr, false);
+ }
+
+ return -1;
+ }
+
+ // Sort by taskId
+ private static Comparator<TaskRecord> sTaskRecordComparator = new Comparator<TaskRecord>() {
+ @Override
+ public int compare(TaskRecord lhs, TaskRecord rhs) {
+ return rhs.taskId - lhs.taskId;
+ }
+ };
+
+ // Extract the affiliates of the chain containing recent at index start.
+ private int processNextAffiliateChainLocked(int start) {
+ final TaskRecord startTask = get(start);
+ final int affiliateId = startTask.mAffiliatedTaskId;
+
+ // Quick identification of isolated tasks. I.e. those not launched behind.
+ if (startTask.taskId == affiliateId && startTask.mPrevAffiliate == null &&
+ startTask.mNextAffiliate == null) {
+ // There is still a slim chance that there are other tasks that point to this task
+ // and that the chain is so messed up that this task no longer points to them but
+ // the gain of this optimization outweighs the risk.
+ startTask.inRecents = true;
+ return start + 1;
+ }
+
+ // Remove all tasks that are affiliated to affiliateId and put them in mTmpRecents.
+ mTmpRecents.clear();
+ for (int i = size() - 1; i >= start; --i) {
+ final TaskRecord task = get(i);
+ if (task.mAffiliatedTaskId == affiliateId) {
+ remove(i);
+ mTmpRecents.add(task);
+ }
+ }
+
+ // Sort them all by taskId. That is the order they were create in and that order will
+ // always be correct.
+ Collections.sort(mTmpRecents, sTaskRecordComparator);
+
+ // Go through and fix up the linked list.
+ // The first one is the end of the chain and has no next.
+ final TaskRecord first = mTmpRecents.get(0);
+ first.inRecents = true;
+ if (first.mNextAffiliate != null) {
+ Slog.w(TAG, "Link error 1 first.next=" + first.mNextAffiliate);
+ first.setNextAffiliate(null);
+ mService.notifyTaskPersisterLocked(first, false);
+ }
+ // Everything in the middle is doubly linked from next to prev.
+ final int tmpSize = mTmpRecents.size();
+ for (int i = 0; i < tmpSize - 1; ++i) {
+ final TaskRecord next = mTmpRecents.get(i);
+ final TaskRecord prev = mTmpRecents.get(i + 1);
+ if (next.mPrevAffiliate != prev) {
+ Slog.w(TAG, "Link error 2 next=" + next + " prev=" + next.mPrevAffiliate +
+ " setting prev=" + prev);
+ next.setPrevAffiliate(prev);
+ mService.notifyTaskPersisterLocked(next, false);
+ }
+ if (prev.mNextAffiliate != next) {
+ Slog.w(TAG, "Link error 3 prev=" + prev + " next=" + prev.mNextAffiliate +
+ " setting next=" + next);
+ prev.setNextAffiliate(next);
+ mService.notifyTaskPersisterLocked(prev, false);
+ }
+ prev.inRecents = true;
+ }
+ // The last one is the beginning of the list and has no prev.
+ final TaskRecord last = mTmpRecents.get(tmpSize - 1);
+ if (last.mPrevAffiliate != null) {
+ Slog.w(TAG, "Link error 4 last.prev=" + last.mPrevAffiliate);
+ last.setPrevAffiliate(null);
+ mService.notifyTaskPersisterLocked(last, false);
+ }
+
+ // Insert the group back into mRecentTasks at start.
+ addAll(start, mTmpRecents);
+ mTmpRecents.clear();
+
+ // Let the caller know where we left off.
+ return start + tmpSize;
+ }
+
+}
diff --git a/services/core/java/com/android/server/am/TaskPersister.java b/services/core/java/com/android/server/am/TaskPersister.java
index 629a05d..9ac1a24 100644
--- a/services/core/java/com/android/server/am/TaskPersister.java
+++ b/services/core/java/com/android/server/am/TaskPersister.java
@@ -99,6 +99,7 @@
private final ActivityManagerService mService;
private final ActivityStackSupervisor mStackSupervisor;
+ private final RecentTasks mRecentTasks;
/** Value determines write delay mode as follows:
* < 0 We are Flushing. No delays between writes until the image queue is drained and all
@@ -138,7 +139,8 @@
// tasks.
private long mExpiredTasksCleanupTime = Long.MAX_VALUE;
- TaskPersister(File systemDir, ActivityStackSupervisor stackSupervisor) {
+ TaskPersister(File systemDir, ActivityStackSupervisor stackSupervisor,
+ RecentTasks recentTasks) {
sTasksDir = new File(systemDir, TASKS_DIRNAME);
if (!sTasksDir.exists()) {
if (DEBUG_PERSISTER) Slog.d(TAG, "Creating tasks directory " + sTasksDir);
@@ -159,12 +161,14 @@
mStackSupervisor = stackSupervisor;
mService = stackSupervisor.mService;
-
+ mRecentTasks = recentTasks;
mLazyTaskWriterThread = new LazyTaskWriterThread("LazyTaskWriterThread");
}
void startPersisting() {
- mLazyTaskWriterThread.start();
+ if (!mLazyTaskWriterThread.isAlive()) {
+ mLazyTaskWriterThread.start();
+ }
}
private void removeThumbnails(TaskRecord task) {
@@ -704,10 +708,9 @@
// {@link TaskRecord.mLastTimeMoved} and drop the oldest recent's vs. just
// adding to the back of the list.
int spaceLeft =
- ActivityManager.getMaxRecentTasksStatic()
- - mService.mRecentTasks.size();
+ ActivityManager.getMaxRecentTasksStatic() - mRecentTasks.size();
if (spaceLeft >= tasks.size()) {
- mService.mRecentTasks.addAll(mService.mRecentTasks.size(), tasks);
+ mRecentTasks.addAll(mRecentTasks.size(), tasks);
for (int k = tasks.size() - 1; k >= 0; k--) {
// Persist new tasks.
wakeup(tasks.get(k), false);
@@ -860,10 +863,9 @@
if (DEBUG_PERSISTER) Slog.d(TAG, "Looking for obsolete files.");
persistentTaskIds.clear();
synchronized (mService) {
- final ArrayList<TaskRecord> tasks = mService.mRecentTasks;
- if (DEBUG_PERSISTER) Slog.d(TAG, "mRecents=" + tasks);
- for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) {
- final TaskRecord task = tasks.get(taskNdx);
+ if (DEBUG_PERSISTER) Slog.d(TAG, "mRecents=" + mRecentTasks);
+ for (int taskNdx = mRecentTasks.size() - 1; taskNdx >= 0; --taskNdx) {
+ final TaskRecord task = mRecentTasks.get(taskNdx);
if (DEBUG_PERSISTER) Slog.d(TAG, "LazyTaskWriter: task=" + task +
" persistable=" + task.isPersistable);
if ((task.isPersistable || task.inRecents)
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index 6dcbc42..1ea9673 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -702,6 +702,11 @@
}
for (AccountAndUser account : accounts) {
+ // If userId is specified, do not sync accounts of other users
+ if (userId >= UserHandle.USER_OWNER && account.userId >= UserHandle.USER_OWNER
+ && userId != account.userId) {
+ continue;
+ }
// Compile a list of authorities that have sync adapters.
// For each authority sync each account that matches a sync adapter.
final HashSet<String> syncableAuthorities = new HashSet<String>();
diff --git a/services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java b/services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java
index 922a2c1..d3ecff0 100644
--- a/services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java
+++ b/services/core/java/com/android/server/hdmi/DelayedMessageBuffer.java
@@ -88,24 +88,22 @@
* Process messages from a given logical device. Called by
* {@link NewDeviceAction} actions when they finish adding the device
* information.
- * <p><Active Source> is not processed in this method but processed
- * separately via {@link #processActiveSource()}.
+ * <p><Active Source> is processed only when the TV input is ready.
+ * If not, {@link #processActiveSource()} will be invoked later to handle it.
*
* @param address logical address of CEC device which the messages to process
* are associated with
*/
void processMessagesForDevice(int address) {
- HdmiLogger.debug("Processing message for address:" + address);
+ HdmiLogger.debug("Checking message for address:" + address);
for (Iterator<HdmiCecMessage> iter = mBuffer.iterator(); iter.hasNext(); ) {
HdmiCecMessage message = iter.next();
- if (message.getOpcode() == Constants.MESSAGE_ACTIVE_SOURCE) {
- continue;
- }
- if (message.getSource() == address) {
- mDevice.onMessage(message);
- HdmiLogger.debug("Processing message:" + message);
- iter.remove();
- }
+ if (message.getSource() != address) continue;
+ if (message.getOpcode() == Constants.MESSAGE_ACTIVE_SOURCE
+ && !mDevice.isInputReady(HdmiDeviceInfo.idForCecDevice(address))) continue;
+ mDevice.onMessage(message);
+ HdmiLogger.debug("Processing message:" + message);
+ iter.remove();
}
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index 4f8b9fb..d17e9b3 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -191,6 +191,25 @@
protected abstract void setPreferredAddress(int addr);
/**
+ * Returns true if the TV input associated with the CEC device is ready
+ * to accept further processing such as input switching. This is used
+ * to buffer certain CEC commands and process it later if the input is not
+ * ready yet. For other types of local devices(non-TV), this method returns
+ * true by default to let the commands be processed right away.
+ */
+ protected boolean isInputReady(int deviceId) {
+ return true;
+ }
+
+ /**
+ * Returns true if the local device allows the system to be put to standby.
+ * The default implementation returns true.
+ */
+ protected boolean canGoToStandby() {
+ return true;
+ }
+
+ /**
* Dispatch incoming message.
*
* @param message incoming message
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
index 85a1a15..a8f6954 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
@@ -19,6 +19,8 @@
import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiDeviceInfo;
import android.hardware.hdmi.IHdmiControlCallback;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.util.Slog;
@@ -34,17 +36,17 @@
private boolean mIsActiveSource = false;
+ // Used to keep the device awake while it is the active source. For devices that
+ // cannot wake up via CEC commands, this address the inconvenience of having to
+ // turn them on.
+ // Lazily initialized - should call getWakeLock() to get the instance.
+ private WakeLock mWakeLock;
+
HdmiCecLocalDevicePlayback(HdmiControlService service) {
super(service, HdmiDeviceInfo.DEVICE_PLAYBACK);
}
@Override
- void init() {
- super.init();
- mIsActiveSource = false;
- }
-
- @Override
@ServiceThreadOnly
protected void onAddressAllocated(int logicalAddress, int reason) {
assertRunOnServiceThread();
@@ -129,12 +131,37 @@
if (connected && mService.isPowerStandbyOrTransient()) {
mService.wakeUp();
}
+ if (!connected) {
+ getWakeLock().release();
+ }
}
@ServiceThreadOnly
- void markActiveSource() {
+ void setActiveSource(boolean on) {
assertRunOnServiceThread();
- mIsActiveSource = true;
+ mIsActiveSource = on;
+ if (on) {
+ getWakeLock().acquire();
+ HdmiLogger.debug("active source: %b. Wake lock acquired", mIsActiveSource);
+ } else {
+ getWakeLock().release();
+ HdmiLogger.debug("Wake lock released");
+ }
+ }
+
+ @ServiceThreadOnly
+ private WakeLock getWakeLock() {
+ assertRunOnServiceThread();
+ if (mWakeLock == null) {
+ mWakeLock = mService.getPowerManager().newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
+ mWakeLock.setReferenceCounted(false);
+ }
+ return mWakeLock;
+ }
+
+ @Override
+ protected boolean canGoToStandby() {
+ return !getWakeLock().isHeld();
}
@Override
@@ -148,7 +175,7 @@
private void mayResetActiveSource(int physicalAddress) {
if (physicalAddress != mService.getPhysicalAddress()) {
- mIsActiveSource = false;
+ setActiveSource(false);
}
}
@@ -163,9 +190,9 @@
return true; // Broadcast message.
}
- // Samsung model, we tested, sends <RoutingChange> and <RequestActiveSource> consecutively,
- // Then if there is no <ActiveSource> response, it will change the input to
- // the internal source. To handle this, we'll set ActiveSource aggressively.
+ // Samsung model we tested sends <Routing Change> and <Request Active Source>
+ // in a row, and then changes the input to the internal source if there is no
+ // <Active Source> in response. To handle this, we'll set ActiveSource aggressively.
@Override
@ServiceThreadOnly
protected boolean handleRoutingChange(HdmiCecMessage message) {
@@ -185,11 +212,7 @@
}
private void maySetActiveSource(int physicalAddress) {
- if (physicalAddress == mService.getPhysicalAddress()) {
- mIsActiveSource = true;
- } else {
- mIsActiveSource = false;
- }
+ setActiveSource(physicalAddress == mService.getPhysicalAddress());
}
private void wakeUpIfActiveSource() {
@@ -226,7 +249,7 @@
mService.sendCecCommand(HdmiCecMessageBuilder.buildInactiveSource(
mAddress, mService.getPhysicalAddress()));
}
- mIsActiveSource = false;
+ setActiveSource(false);
checkIfPendingActionsCleared();
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index ed7cebb..a894161 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -63,6 +63,7 @@
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import java.util.HashMap;
/**
* Represent a logical device of type TV residing in Android system.
@@ -143,12 +144,44 @@
public void onInputAdded(String inputId) {
TvInputInfo tvInfo = mService.getTvInputManager().getTvInputInfo(inputId);
HdmiDeviceInfo info = tvInfo.getHdmiDeviceInfo();
- if (info != null && info.isCecDevice()) {
- mDelayedMessageBuffer.processActiveSource(info.getLogicalAddress());
+ if (info == null) return;
+ addTvInput(inputId, info.getId());
+ if (info.isCecDevice()) {
+ processDelayedActiveSource(info.getLogicalAddress());
}
}
+
+ @Override
+ public void onInputRemoved(String inputId) {
+ removeTvInput(inputId);
+ }
};
+ // Keeps the mapping (TV input ID, HDMI device ID) to keep track of the TV inputs ready to
+ // accept input switching request from HDMI devices. Requests for which the corresponding
+ // input ID is not yet registered by TV input framework need to be buffered for delayed
+ // processing.
+ private final HashMap<String, Integer> mTvInputs = new HashMap<>();
+
+ @ServiceThreadOnly
+ private void addTvInput(String inputId, int deviceId) {
+ assertRunOnServiceThread();
+ mTvInputs.put(inputId, deviceId);
+ }
+
+ @ServiceThreadOnly
+ private void removeTvInput(String inputId) {
+ assertRunOnServiceThread();
+ mTvInputs.remove(inputId);
+ }
+
+ @Override
+ @ServiceThreadOnly
+ protected boolean isInputReady(int deviceId) {
+ assertRunOnServiceThread();
+ return mTvInputs.containsValue(deviceId);
+ }
+
HdmiCecLocalDeviceTv(HdmiControlService service) {
super(service, HdmiDeviceInfo.DEVICE_TV);
mPrevPortId = Constants.INVALID_PORT_ID;
@@ -168,6 +201,7 @@
mService.sendCecCommand(HdmiCecMessageBuilder.buildDeviceVendorIdCommand(
mAddress, mService.getVendorId()));
mCecSwitches.add(mService.getPhysicalAddress()); // TV is a CEC switch too.
+ mTvInputs.clear();
mSkipRoutingControl = (reason == HdmiControlService.INITIATED_BY_WAKE_UP_MESSAGE);
launchRoutingControl(reason != HdmiControlService.INITIATED_BY_ENABLE_CEC &&
reason != HdmiControlService.INITIATED_BY_BOOT_UP);
@@ -326,8 +360,12 @@
ActiveSource activeSource = getActiveSource();
HdmiDeviceInfo info = getCecDeviceInfo(activeSource.logicalAddress);
if (info == null) {
- info = new HdmiDeviceInfo(Constants.ADDR_INVALID, path, getActivePortId(),
- HdmiDeviceInfo.DEVICE_RESERVED, 0, null);
+ info = mService.getDeviceInfoByPort(getActivePortId());
+ if (info == null) {
+ // No CEC/MHL device is present at the port. Attempt to switch to
+ // the hardware port itself for non-CEC devices that may be connected.
+ info = new HdmiDeviceInfo(path, getActivePortId());
+ }
}
mService.invokeInputChangeListener(info);
}
@@ -443,8 +481,12 @@
HdmiDeviceInfo info = getCecDeviceInfo(logicalAddress);
if (info == null) {
if (!handleNewDeviceAtTheTailOfActivePath(physicalAddress)) {
+ HdmiLogger.debug("Device info not found: %X; buffering the command", logicalAddress);
mDelayedMessageBuffer.add(message);
}
+ } else if (!isInputReady(info.getId())) {
+ HdmiLogger.debug("Input not ready for device: %X; buffering the command", info.getId());
+ mDelayedMessageBuffer.add(message);
} else {
ActiveSource activeSource = ActiveSource.of(logicalAddress, physicalAddress);
ActiveSourceHandler.create(this, null).process(activeSource, info.getDeviceType());
@@ -1772,6 +1814,12 @@
mDelayedMessageBuffer.processMessagesForDevice(address);
}
+ @ServiceThreadOnly
+ void processDelayedActiveSource(int address) {
+ assertRunOnServiceThread();
+ mDelayedMessageBuffer.processActiveSource(address);
+ }
+
@Override
protected void dump(final IndentingPrintWriter pw) {
super.dump(pw);
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index 8ce6caf..2593e2b 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -277,6 +277,9 @@
@Nullable
private TvInputManager mTvInputManager;
+ @Nullable
+ private PowerManager mPowerManager;
+
// Last input port before switching to the MHL port. Should switch back to this port
// when the mobile device sends the request one touch play with off.
// Gets invalidated if we go to other port/input.
@@ -353,6 +356,7 @@
if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
mTvInputManager = (TvInputManager) getContext().getSystemService(
Context.TV_INPUT_SERVICE);
+ mPowerManager = (PowerManager) getContext().getSystemService(Context.POWER_SERVICE);
}
}
@@ -370,6 +374,10 @@
mTvInputManager.unregisterCallback(callback);
}
+ PowerManager getPowerManager() {
+ return mPowerManager;
+ }
+
/**
* Called when the initialization of local devices is complete.
*/
@@ -672,6 +680,16 @@
return tv() == null ? null : tv().getCecDeviceInfo(logicalAddress);
}
+ @ServiceThreadOnly
+ HdmiDeviceInfo getDeviceInfoByPort(int port) {
+ assertRunOnServiceThread();
+ HdmiMhlLocalDeviceStub info = mMhlController.getLocalDevice(port);
+ if (info != null) {
+ return info.getInfo();
+ }
+ return null;
+ }
+
/**
* Returns version of CEC.
*/
@@ -1849,8 +1867,7 @@
void wakeUp() {
assertRunOnServiceThread();
mWakeUpMessageReceived = true;
- PowerManager pm = (PowerManager) getContext().getSystemService(Context.POWER_SERVICE);
- pm.wakeUp(SystemClock.uptimeMillis());
+ mPowerManager.wakeUp(SystemClock.uptimeMillis());
// PowerManger will send the broadcast Intent.ACTION_SCREEN_ON and after this gets
// the intent, the sequence will continue at onWakeUp().
}
@@ -1859,8 +1876,7 @@
void standby() {
assertRunOnServiceThread();
mStandbyMessageReceived = true;
- PowerManager pm = (PowerManager) getContext().getSystemService(Context.POWER_SERVICE);
- pm.goToSleep(SystemClock.uptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_HDMI, 0);
+ mPowerManager.goToSleep(SystemClock.uptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_HDMI, 0);
// PowerManger will send the broadcast Intent.ACTION_SCREEN_OFF and after this gets
// the intent, the sequence will continue at onStandby().
}
@@ -1886,6 +1902,7 @@
@ServiceThreadOnly
private void onStandby() {
assertRunOnServiceThread();
+ if (!canGoToStandby()) return;
mPowerStatus = HdmiControlManager.POWER_STATUS_TRANSIENT_TO_STANDBY;
invokeVendorCommandListenersOnControlStateChanged(false,
HdmiControlManager.CONTROL_STATE_CHANGED_REASON_STANDBY);
@@ -1906,6 +1923,13 @@
});
}
+ private boolean canGoToStandby() {
+ for (HdmiCecLocalDevice device : mCecController.getLocalDeviceList()) {
+ if (!device.canGoToStandby()) return false;
+ }
+ return true;
+ }
+
@ServiceThreadOnly
private void onLanguageChanged(String language) {
assertRunOnServiceThread();
diff --git a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java
index e764a1c..a711102 100644
--- a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java
+++ b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java
@@ -82,7 +82,7 @@
private void broadcastActiveSource() {
sendCommand(HdmiCecMessageBuilder.buildActiveSource(getSourceAddress(), getSourcePath()));
// Because only playback device can create this action, it's safe to cast.
- playback().markActiveSource();
+ playback().setActiveSource(true);
}
private void queryDevicePowerStatus() {
diff --git a/services/core/java/com/android/server/location/GpsLocationProvider.java b/services/core/java/com/android/server/location/GpsLocationProvider.java
index b46a450..2a1f7d6 100644
--- a/services/core/java/com/android/server/location/GpsLocationProvider.java
+++ b/services/core/java/com/android/server/location/GpsLocationProvider.java
@@ -648,7 +648,7 @@
// Register for SubscriptionInfo list changes which is guaranteed
// to invoke onSubscriptionsChanged the first time.
SubscriptionManager.from(mContext)
- .registerOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener);
+ .addOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener);
// construct handler, listen for events
mHandler = new ProviderHandler(looper);
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index b5deda2..1a211c2 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -96,7 +96,6 @@
private final MediaSessionService mService;
private final boolean mUseMasterVolume;
- private final IBinder mICallback = new Binder();
private final Object mLock = new Object();
private final ArrayList<ISessionControllerCallback> mControllerCallbacks =
new ArrayList<ISessionControllerCallback>();
@@ -264,13 +263,13 @@
boolean isMasterMute = mAudioManager.isMasterMute();
if (isMute) {
mAudioManagerInternal.setMasterMuteForUid(!isMasterMute,
- flags, packageName, mICallback, uid);
+ flags, packageName, mService.mICallback, uid);
} else {
mAudioManagerInternal.adjustMasterVolumeForUid(direction, flags, packageName,
uid);
if (isMasterMute) {
mAudioManagerInternal.setMasterMuteForUid(false,
- flags, packageName, mICallback, uid);
+ flags, packageName, mService.mICallback, uid);
}
}
return;
@@ -284,7 +283,7 @@
} else {
mAudioManagerInternal.adjustSuggestedStreamVolumeForUid(stream, direction,
flags, packageName, uid);
- if (isStreamMute) {
+ if (isStreamMute && direction != 0) {
mAudioManager.setStreamMute(stream, false);
}
}
@@ -299,7 +298,7 @@
mAudioManagerInternal.adjustSuggestedStreamVolumeForUid(
AudioManager.USE_DEFAULT_STREAM_TYPE, direction, flags, packageName,
uid);
- if (isStreamMute) {
+ if (isStreamMute && direction != 0) {
mAudioManager.setStreamMute(AudioManager.USE_DEFAULT_STREAM_TYPE,
false);
}
@@ -311,7 +310,7 @@
} else {
mAudioManagerInternal.adjustStreamVolumeForUid(stream, direction, flags,
packageName, uid);
- if (isStreamMute) {
+ if (isStreamMute && direction != 0) {
mAudioManager.setStreamMute(stream, false);
}
}
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 105ec77..22acfea 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -77,6 +77,8 @@
private static final int WAKELOCK_TIMEOUT = 5000;
+ /* package */final IBinder mICallback = new Binder();
+
private final SessionManagerImpl mSessionManagerImpl;
private final MediaSessionStack mPriorityStack;
@@ -91,6 +93,7 @@
private KeyguardManager mKeyguardManager;
private IAudioService mAudioService;
+ private AudioManager mAudioManager;
private ContentResolver mContentResolver;
private SettingsObserver mSettingsObserver;
@@ -118,6 +121,7 @@
mKeyguardManager =
(KeyguardManager) getContext().getSystemService(Context.KEYGUARD_SERVICE);
mAudioService = getAudioService();
+ mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
mContentResolver = getContext().getContentResolver();
mSettingsObserver = new SettingsObserver();
mSettingsObserver.observe();
@@ -589,8 +593,6 @@
"android.media.AudioService.WAKELOCK_ACQUIRED";
private static final int WAKELOCK_RELEASE_ON_FINISHED = 1980; // magic number
- private final IBinder mICallback = new Binder();
-
private boolean mVoiceButtonDown = false;
private boolean mVoiceButtonHandled = false;
@@ -845,14 +847,14 @@
} else {
boolean isStreamMute = mAudioService.isStreamMute(suggestedStream);
if (direction == MediaSessionManager.DIRECTION_MUTE) {
- mAudioService.setStreamMute(suggestedStream, !isStreamMute, mICallback);
+ mAudioManager.setStreamMute(suggestedStream, !isStreamMute);
} else {
mAudioService.adjustSuggestedStreamVolume(direction, suggestedStream,
flags, packageName);
// Do not call setStreamMute when direction = 0 which is used just to
// show the UI.
if (isStreamMute && direction != 0) {
- mAudioService.setStreamMute(suggestedStream, false, mICallback);
+ mAudioManager.setStreamMute(suggestedStream, false);
}
}
}
diff --git a/services/core/java/com/android/server/notification/ConditionProviders.java b/services/core/java/com/android/server/notification/ConditionProviders.java
index 64d77c1..ab53fbc 100644
--- a/services/core/java/com/android/server/notification/ConditionProviders.java
+++ b/services/core/java/com/android/server/notification/ConditionProviders.java
@@ -168,7 +168,6 @@
@Override
protected void onServiceAdded(ManagedServiceInfo info) {
- Slog.d(TAG, "onServiceAdded " + info);
final IConditionProvider provider = provider(info);
try {
provider.onConnected();
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 825627f..02cacd9 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -683,6 +683,9 @@
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
+ if (action == null) {
+ return;
+ }
boolean queryRestart = false;
boolean queryRemove = false;
@@ -1829,7 +1832,7 @@
// can to avoid extracting signals.
handleGroupedNotificationLocked(r, old, callingUid, callingPid);
boolean ignoreNotification =
- removeUnusedGroupedNotificationLocked(r, callingUid, callingPid);
+ removeUnusedGroupedNotificationLocked(r, old, callingUid, callingPid);
// This conditional is a dirty hack to limit the logging done on
// behalf of the download manager without affecting other apps.
@@ -1966,7 +1969,8 @@
*
* <p>Returns true if the given notification is a child of a group with a
* summary, which means that SysUI will never show it, and hence the new
- * notification can be safely ignored.</p>
+ * notification can be safely ignored. Also cancels any previous instance
+ * of the ignored notification.</p>
*
* <p>For summaries, cancels all children of that group, as SysUI will
* never show them anymore.</p>
@@ -1974,7 +1978,7 @@
* @return true if the given notification can be ignored as an optimization
*/
private boolean removeUnusedGroupedNotificationLocked(NotificationRecord r,
- int callingUid, int callingPid) {
+ NotificationRecord old, int callingUid, int callingPid) {
// No optimizations are possible if listeners want groups.
if (mListeners.notificationGroupsDesired()) {
return false;
@@ -1992,6 +1996,13 @@
Slog.d(TAG, "Ignoring group child " + sbn.getKey() + " due to existing summary "
+ summary.getKey());
}
+ // Make sure we don't leave an old version of the notification around.
+ if (old != null) {
+ if (DBG) {
+ Slog.d(TAG, "Canceling old version of ignored group child " + sbn.getKey());
+ }
+ cancelNotificationLocked(old, false, REASON_GROUP_OPTIMIZATION);
+ }
return true;
} else if (isSummary) {
// Summary -> cancel children
diff --git a/services/core/java/com/android/server/notification/NotificationUsageStats.java b/services/core/java/com/android/server/notification/NotificationUsageStats.java
index 3d13d21..e029c58 100644
--- a/services/core/java/com/android/server/notification/NotificationUsageStats.java
+++ b/services/core/java/com/android/server/notification/NotificationUsageStats.java
@@ -222,7 +222,7 @@
public void collect(SingleNotificationStats singleNotificationStats) {
posttimeMs.addSample(
- SystemClock.elapsedRealtime() - singleNotificationStats.posttimeElapsedMs);
+ SystemClock.elapsedRealtime() - singleNotificationStats.posttimeElapsedMs);
if (singleNotificationStats.posttimeToDismissMs >= 0) {
posttimeToDismissMs.addSample(singleNotificationStats.posttimeToDismissMs);
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 28ac601..13b2b0f 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -12196,7 +12196,7 @@
return;
}
}
- mSettings.writePackageRestrictionsLPr(userId);
+ scheduleWritePackageRestrictionsLocked(userId);
components = mPendingBroadcasts.get(userId, packageName);
final boolean newPackage = components == null;
if (newPackage) {
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index a81a866..f85b195 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -16,8 +16,6 @@
package com.android.server.pm;
-import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
-
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
@@ -33,11 +31,11 @@
import android.graphics.BitmapFactory;
import android.os.Binder;
import android.os.Bundle;
-import android.os.Debug;
import android.os.Environment;
import android.os.FileUtils;
import android.os.Handler;
import android.os.IUserManager;
+import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -134,6 +132,8 @@
// BACKOFF_INC_INTERVAL times.
private static final int[] BACKOFF_TIMES = { 0, 30*1000, 60*1000, 5*60*1000, 30*60*1000 };
+ static final int WRITE_USER_MSG = 1;
+ static final int WRITE_USER_DELAY = 2*1000; // 2 seconds
private final Context mContext;
private final PackageManagerService mPm;
@@ -210,7 +210,7 @@
mPm = pm;
mInstallLock = installLock;
mPackagesLock = packagesLock;
- mHandler = new Handler();
+ mHandler = new MainHandler();
synchronized (mInstallLock) {
synchronized (mPackagesLock) {
mUsersDir = new File(dataDir, USER_INFO_DIR);
@@ -320,6 +320,9 @@
checkManageUsersPermission("get the profile parent");
synchronized (mPackagesLock) {
UserInfo profile = getUserInfoLocked(userHandle);
+ if (profile == null) {
+ return null;
+ }
int parentUserId = profile.profileGroupId;
if (parentUserId == UserInfo.NO_PROFILE_GROUP_ID) {
return null;
@@ -458,7 +461,7 @@
}
if ((info.flags&UserInfo.FLAG_INITIALIZED) == 0) {
info.flags |= UserInfo.FLAG_INITIALIZED;
- writeUserLocked(info);
+ scheduleWriteUserLocked(info);
}
}
}
@@ -526,7 +529,7 @@
} finally {
Binder.restoreCallingIdentity(token);
}
- writeUserLocked(mUsers.get(userId));
+ scheduleWriteUserLocked(mUsers.get(userId));
}
}
@@ -692,7 +695,7 @@
UserInfo user = mUsers.get(UserHandle.USER_OWNER);
if ("Primary".equals(user.name)) {
user.name = mContext.getResources().getString(com.android.internal.R.string.owner_name);
- writeUserLocked(user);
+ scheduleWriteUserLocked(user);
}
userVersion = 1;
}
@@ -702,7 +705,7 @@
UserInfo user = mUsers.get(UserHandle.USER_OWNER);
if ((user.flags & UserInfo.FLAG_INITIALIZED) == 0) {
user.flags |= UserInfo.FLAG_INITIALIZED;
- writeUserLocked(user);
+ scheduleWriteUserLocked(user);
}
userVersion = 2;
}
@@ -745,6 +748,13 @@
writeUserLocked(primary);
}
+ private void scheduleWriteUserLocked(UserInfo userInfo) {
+ if (!mHandler.hasMessages(WRITE_USER_MSG, userInfo)) {
+ Message msg = mHandler.obtainMessage(WRITE_USER_MSG, userInfo);
+ mHandler.sendMessageDelayed(msg, WRITE_USER_DELAY);
+ }
+ }
+
/*
* Writes the user file in this format:
*
@@ -1182,14 +1192,13 @@
if (parent != null) {
if (parent.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID) {
parent.profileGroupId = parent.id;
- writeUserLocked(parent);
+ scheduleWriteUserLocked(parent);
}
userInfo.profileGroupId = parent.profileGroupId;
}
- writeUserLocked(userInfo);
mPm.createNewUserLILPw(userId, userPath);
userInfo.partial = false;
- writeUserLocked(userInfo);
+ scheduleWriteUserLocked(userInfo);
updateUserIdsLocked();
Bundle restrictions = new Bundle();
mUserRestrictions.append(userId, restrictions);
@@ -1514,12 +1523,12 @@
}
if (passwordToHash(pin, pinState.salt).equals(pinState.pinHash)) {
pinState.failedAttempts = 0;
- writeUserLocked(mUsers.get(userId));
+ scheduleWriteUserLocked(mUsers.get(userId));
return UserManager.PIN_VERIFICATION_SUCCESS;
} else {
pinState.failedAttempts++;
pinState.lastAttemptTime = System.currentTimeMillis();
- writeUserLocked(mUsers.get(userId));
+ scheduleWriteUserLocked(mUsers.get(userId));
return waitTime;
}
}
@@ -1818,7 +1827,7 @@
}
if (now > EPOCH_PLUS_30_YEARS) {
user.lastLoggedInTime = now;
- writeUserLocked(user);
+ scheduleWriteUserLocked(user);
}
}
}
@@ -1895,4 +1904,22 @@
}
}
}
+
+ final class MainHandler extends Handler {
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case WRITE_USER_MSG:
+ removeMessages(WRITE_USER_MSG, msg.obj);
+ synchronized (mPackagesLock) {
+ int userId = ((UserInfo) msg.obj).id;
+ UserInfo userInfo = mUsers.get(userId);
+ if (userInfo != null) {
+ writeUserLocked(userInfo);
+ }
+ }
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index f859fd2..da25c533 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -304,10 +304,11 @@
pw.print(prefix); pw.print("inPendingTransaction=");
pw.println(inPendingTransaction);
}
- if (startingData != null || removed || firstWindowDrawn) {
+ if (startingData != null || removed || firstWindowDrawn || mDeferRemoval) {
pw.print(prefix); pw.print("startingData="); pw.print(startingData);
pw.print(" removed="); pw.print(removed);
- pw.print(" firstWindowDrawn="); pw.println(firstWindowDrawn);
+ pw.print(" firstWindowDrawn="); pw.print(firstWindowDrawn);
+ pw.print(" mDeferRemoval="); pw.println(mDeferRemoval);
}
if (startingWindow != null || startingView != null
|| startingDisplayed || startingMoved) {
diff --git a/services/core/java/com/android/server/wm/CircularDisplayMask.java b/services/core/java/com/android/server/wm/CircularDisplayMask.java
index a7d41fa..9fdfc47 100644
--- a/services/core/java/com/android/server/wm/CircularDisplayMask.java
+++ b/services/core/java/com/android/server/wm/CircularDisplayMask.java
@@ -24,6 +24,7 @@
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.view.Display;
import android.view.Surface;
@@ -35,7 +36,6 @@
class CircularDisplayMask {
private static final String TAG = "CircularDisplayMask";
- private static final int STROKE_WIDTH = 2;
// size of the chin
private int mScreenOffset = 0;
// Display dimensions
@@ -82,9 +82,7 @@
mDrawNeeded = true;
mPaint = new Paint();
mPaint.setAntiAlias(true);
- mPaint.setStyle(Paint.Style.STROKE);
- mPaint.setColor(Color.BLACK);
- mPaint.setStrokeWidth(STROKE_WIDTH);
+ mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
mScreenOffset = screenOffset;
}
@@ -104,7 +102,6 @@
if (c == null) {
return;
}
- c.drawColor(Color.TRANSPARENT, PorterDuff.Mode.SRC);
switch (mRotation) {
case Surface.ROTATION_0:
case Surface.ROTATION_90:
@@ -122,7 +119,10 @@
}
int circleRadius = mScreenSize.x / 2;
- c.drawCircle(circleRadius, circleRadius, circleRadius, mPaint);
+ c.drawColor(Color.BLACK);
+
+ // The radius is reduced by 1 to provide an anti aliasing effect on the display edges.
+ c.drawCircle(circleRadius, circleRadius, circleRadius - 1, mPaint);
mSurface.unlockCanvasAndPost(c);
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index b8078fb..4f20f50 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -380,14 +380,18 @@
pw.println(" Application tokens in top down Z order:");
int ndx = 0;
for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
- ArrayList<Task> tasks = mStacks.get(stackNdx).getTasks();
+ final TaskStack stack = mStacks.get(stackNdx);
+ pw.print(" mStackId="); pw.println(stack.mStackId);
+ ArrayList<Task> tasks = stack.getTasks();
for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) {
- AppTokenList tokens = tasks.get(taskNdx).mAppTokens;
- for (int tokenNdx = tokens.size() - 1; tokenNdx >= 0; --tokenNdx) {
+ final Task task = tasks.get(taskNdx);
+ pw.print(" mTaskId="); pw.println(task.taskId);
+ AppTokenList tokens = task.mAppTokens;
+ for (int tokenNdx = tokens.size() - 1; tokenNdx >= 0; --tokenNdx, ++ndx) {
final AppWindowToken wtoken = tokens.get(tokenNdx);
- pw.print(" App #"); pw.print(ndx++);
+ pw.print(" Activity #"); pw.print(tokenNdx);
pw.print(' '); pw.print(wtoken); pw.println(":");
- wtoken.dump(pw, " ");
+ wtoken.dump(pw, " ");
}
}
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index a60be3b..b49b87c 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -68,6 +68,6 @@
@Override
public String toString() {
- return "{taskId=" + taskId + " appTokens=" + mAppTokens + "}";
+ return "{taskId=" + taskId + " appTokens=" + mAppTokens + " mdr=" + mDeferRemoval + "}";
}
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 8ed6a31..2384e5e 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -262,6 +262,8 @@
/** Amount of time (in milliseconds) to delay before declaring a window freeze timeout. */
static final int WINDOW_FREEZE_TIMEOUT_DURATION = 2000;
+ /** Amount of time to allow a last ANR message to exist before freeing the memory. */
+ static final int LAST_ANR_LIFETIME_DURATION_MSECS = 2 * 60 * 60 * 1000; // Two hours
/**
* If true, the window manager will do its own custom freezing and general
* management of the screen during rotation.
@@ -940,7 +942,7 @@
private void placeWindowAfter(WindowState pos, WindowState window) {
final WindowList windows = pos.getWindowList();
final int i = windows.indexOf(pos);
- if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
+ if (true || DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
TAG, "Adding window " + window + " at "
+ (i+1) + " of " + windows.size() + " (after " + pos + ")");
windows.add(i+1, window);
@@ -950,7 +952,7 @@
private void placeWindowBefore(WindowState pos, WindowState window) {
final WindowList windows = pos.getWindowList();
int i = windows.indexOf(pos);
- if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
+ if (true || DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(
TAG, "Adding window " + window + " at "
+ i + " of " + windows.size() + " (before " + pos + ")");
if (i < 0) {
@@ -1048,7 +1050,7 @@
//apptoken note that the window could be a floating window
//that was created later or a window at the top of the list of
//windows associated with this token.
- if (DEBUG_FOCUS_LIGHT || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG,
+ if (true || DEBUG_FOCUS_LIGHT || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG,
"not Base app: Adding window " + win + " at " + (newIdx + 1) + " of " +
N);
windows.add(newIdx + 1, win);
@@ -1170,7 +1172,7 @@
break;
}
}
- if (DEBUG_FOCUS_LIGHT || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG,
+ if (true || DEBUG_FOCUS_LIGHT || DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG,
"Based on layer: Adding window " + win + " at " + i + " of " + N);
windows.add(i, win);
mWindowsChanged = true;
@@ -3657,7 +3659,7 @@
atoken.layoutConfigChanges = (configChanges &
(ActivityInfo.CONFIG_SCREEN_SIZE | ActivityInfo.CONFIG_ORIENTATION)) != 0;
atoken.mLaunchTaskBehind = launchTaskBehind;
- if (DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, "addAppToken: " + atoken
+ if (true || DEBUG_TOKEN_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v(TAG, "addAppToken: " + atoken
+ " to stack=" + stackId + " task=" + taskId + " at " + addPos);
Task task = mTaskIdToTask.get(taskId);
@@ -5220,8 +5222,17 @@
if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing taskId=" + taskId);
EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, taskId, "removeTask");
task.mDeferRemoval = false;
- task.mStack.removeTask(task);
+ stack.removeTask(task);
mTaskIdToTask.delete(task.taskId);
+
+ final ArrayList<AppWindowToken> exitingApps = stack.mExitingAppTokens;
+ for (int appNdx = exitingApps.size() - 1; appNdx >= 0; --appNdx) {
+ final AppWindowToken wtoken = exitingApps.get(appNdx);
+ if (wtoken.groupId == taskId) {
+ wtoken.mDeferRemoval = false;
+ exitingApps.remove(appNdx);
+ }
+ }
}
public void removeTask(int taskId) {
@@ -7624,6 +7635,7 @@
public static final int SHOW_EMULATOR_DISPLAY_OVERLAY = 36;
public static final int CHECK_IF_BOOT_ANIMATION_FINISHED = 37;
+ public static final int RESET_ANR_MESSAGE = 38;
@Override
public void handleMessage(Message msg) {
@@ -8134,6 +8146,12 @@
}
}
break;
+ case RESET_ANR_MESSAGE: {
+ synchronized (mWindowMap) {
+ mLastANRState = null;
+ }
+ }
+ break;
}
if (DEBUG_WINDOW_TRACE) {
Slog.v(TAG, "handleMessage: exit");
@@ -11315,8 +11333,14 @@
}
pw.println();
dumpWindowsNoHeaderLocked(pw, true, null);
+ pw.println();
+ pw.println("Last ANR continued");
+ dumpDisplayContentsLocked(pw, true);
pw.close();
mLastANRState = sw.toString();
+
+ mH.removeMessages(H.RESET_ANR_MESSAGE);
+ mH.sendEmptyMessageDelayed(H.RESET_ANR_MESSAGE, LAST_ANR_LIFETIME_DURATION_MSECS);
}
@Override
diff --git a/services/core/jni/com_android_server_AlarmManagerService.cpp b/services/core/jni/com_android_server_AlarmManagerService.cpp
index 3d981ab..3fd0f84 100644
--- a/services/core/jni/com_android_server_AlarmManagerService.cpp
+++ b/services/core/jni/com_android_server_AlarmManagerService.cpp
@@ -21,7 +21,9 @@
#include "jni.h"
#include <utils/Log.h>
#include <utils/misc.h>
+#include <utils/String8.h>
+#include <dirent.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
@@ -80,8 +82,8 @@
class AlarmImplTimerFd : public AlarmImpl
{
public:
- AlarmImplTimerFd(int fds[N_ANDROID_TIMERFDS], int epollfd) :
- AlarmImpl(fds, N_ANDROID_TIMERFDS), epollfd(epollfd) { }
+ AlarmImplTimerFd(int fds[N_ANDROID_TIMERFDS], int epollfd, int rtc_id) :
+ AlarmImpl(fds, N_ANDROID_TIMERFDS), epollfd(epollfd), rtc_id(rtc_id) { }
~AlarmImplTimerFd();
int set(int type, struct timespec *ts);
@@ -90,6 +92,7 @@
private:
int epollfd;
+ int rtc_id;
};
AlarmImpl::AlarmImpl(int *fds_, size_t n_fds) : fds(new int[n_fds]),
@@ -170,9 +173,16 @@
return -1;
}
- fd = open("/dev/rtc0", O_RDWR);
+ if (rtc_id < 0) {
+ ALOGV("Not setting RTC because wall clock RTC was not found");
+ errno = ENODEV;
+ return -1;
+ }
+
+ android::String8 rtc_dev = String8::format("/dev/rtc%d", rtc_id);
+ fd = open(rtc_dev.string(), O_RDWR);
if (fd < 0) {
- ALOGV("Unable to open RTC driver: %s\n", strerror(errno));
+ ALOGV("Unable to open %s: %s\n", rtc_dev.string(), strerror(errno));
return res;
}
@@ -283,6 +293,66 @@
return reinterpret_cast<jlong>(ret);
}
+static const char rtc_sysfs[] = "/sys/class/rtc";
+
+static bool rtc_is_hctosys(unsigned int rtc_id)
+{
+ android::String8 hctosys_path = String8::format("%s/rtc%u/hctosys",
+ rtc_sysfs, rtc_id);
+
+ FILE *file = fopen(hctosys_path.string(), "re");
+ if (!file) {
+ ALOGE("failed to open %s: %s", hctosys_path.string(), strerror(errno));
+ return false;
+ }
+
+ unsigned int hctosys;
+ bool ret = false;
+ int err = fscanf(file, "%u", &hctosys);
+ if (err == EOF)
+ ALOGE("failed to read from %s: %s", hctosys_path.string(),
+ strerror(errno));
+ else if (err == 0)
+ ALOGE("%s did not have expected contents", hctosys_path.string());
+ else
+ ret = hctosys;
+
+ fclose(file);
+ return ret;
+}
+
+static int wall_clock_rtc()
+{
+ DIR *dir = opendir(rtc_sysfs);
+ if (!dir) {
+ ALOGE("failed to open %s: %s", rtc_sysfs, strerror(errno));
+ return -1;
+ }
+
+ struct dirent *dirent;
+ while (errno = 0, dirent = readdir(dir)) {
+ unsigned int rtc_id;
+ int matched = sscanf(dirent->d_name, "rtc%u", &rtc_id);
+
+ if (matched < 0)
+ break;
+ else if (matched != 1)
+ continue;
+
+ if (rtc_is_hctosys(rtc_id)) {
+ ALOGV("found wall clock RTC %u", rtc_id);
+ return rtc_id;
+ }
+ }
+
+ if (errno == 0)
+ ALOGW("no wall clock RTC found");
+ else
+ ALOGE("failed to enumerate RTCs: %s", strerror(errno));
+
+ return -1;
+}
+
static jlong init_timerfd()
{
int epollfd;
@@ -308,7 +378,7 @@
}
}
- AlarmImpl *ret = new AlarmImplTimerFd(fds, epollfd);
+ AlarmImpl *ret = new AlarmImplTimerFd(fds, epollfd, wall_clock_rtc());
for (size_t i = 0; i < N_ANDROID_TIMERFDS; i++) {
epoll_event event;
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 2f0525a..54454c7 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -1695,7 +1695,10 @@
int smallIconId;
String contentText;
final String ownerName = getDeviceOwnerName();
- if (ownerName != null) {
+ if (isManagedProfile(userHandle.getIdentifier())) {
+ contentText = mContext.getString(R.string.ssl_ca_cert_noti_by_administrator);
+ smallIconId = R.drawable.stat_sys_certificate_info;
+ } else if (ownerName != null) {
contentText = mContext.getString(R.string.ssl_ca_cert_noti_managed, ownerName);
smallIconId = R.drawable.stat_sys_certificate_info;
} else {
diff --git a/services/usb/java/com/android/server/usb/UsbAlsaManager.java b/services/usb/java/com/android/server/usb/UsbAlsaManager.java
index 6cc8ff5..32ca723 100644
--- a/services/usb/java/com/android/server/usb/UsbAlsaManager.java
+++ b/services/usb/java/com/android/server/usb/UsbAlsaManager.java
@@ -37,46 +37,33 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.HashMap;
+import java.util.ArrayList;
/**
* UsbAlsaManager manages USB audio and MIDI devices.
*/
public class UsbAlsaManager {
private static final String TAG = UsbAlsaManager.class.getSimpleName();
- private static final boolean DEBUG = false;
+ private static final boolean DEBUG = true;
private static final String ALSA_DIRECTORY = "/dev/snd/";
private final Context mContext;
private IMidiManager mMidiManager;
- private final class AudioDevice {
- public int mCard;
- public int mDevice;
- public boolean mHasPlayback;
- public boolean mHasCapture;
- public boolean mHasMIDI;
+ private final AlsaCardsParser mCardsParser = new AlsaCardsParser();
+ private final AlsaDevicesParser mDevicesParser = new AlsaDevicesParser();
- public AudioDevice(int card, int device,
- boolean hasPlayback, boolean hasCapture, boolean hasMidi) {
- mCard = card;
- mDevice = device;
- mHasPlayback = hasPlayback;
- mHasCapture = hasCapture;
- mHasMIDI = hasMidi;
- }
+ // this is needed to map USB devices to ALSA Audio Devices, especially to remove an
+ // ALSA device when we are notified that its associated USB device has been removed.
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append("AudioDevice: [card: " + mCard);
- sb.append(", device: " + mDevice);
- sb.append(", hasPlayback: " + mHasPlayback);
- sb.append(", hasCapture: " + mHasCapture);
- sb.append(", hasMidi: " + mHasMIDI);
- sb.append("]");
- return sb.toString();
- }
- }
+ private final HashMap<UsbDevice,UsbAudioDevice>
+ mAudioDevices = new HashMap<UsbDevice,UsbAudioDevice>();
+
+ private final HashMap<String,AlsaDevice>
+ mAlsaDevices = new HashMap<String,AlsaDevice>();
+
+ private UsbAudioDevice mSelectedAudioDevice = null;
private final class AlsaDevice {
public static final int TYPE_UNKNOWN = 0;
@@ -112,12 +99,6 @@
}
}
- private final HashMap<UsbDevice,AudioDevice> mAudioDevices
- = new HashMap<UsbDevice,AudioDevice>();
-
- private final HashMap<String,AlsaDevice> mAlsaDevices
- = new HashMap<String,AlsaDevice>();
-
private final FileObserver mAlsaObserver = new FileObserver(ALSA_DIRECTORY,
FileObserver.CREATE | FileObserver.DELETE) {
public void onEvent(int event, String path) {
@@ -134,6 +115,9 @@
/* package */ UsbAlsaManager(Context context) {
mContext = context;
+
+ // initial scan
+ mCardsParser.scan();
}
public void systemReady() {
@@ -149,9 +133,15 @@
}
// Broadcasts the arrival/departure of a USB audio interface
- // audioDevice - the AudioDevice that was added or removed
+ // audioDevice - the UsbAudioDevice that was added or removed
// enabled - if true, we're connecting a device (it's arrived), else disconnecting
- private void sendDeviceNotification(AudioDevice audioDevice, boolean enabled) {
+ private void sendDeviceNotification(UsbAudioDevice audioDevice, boolean enabled) {
+ if (DEBUG) {
+ Slog.d(TAG, "sendDeviceNotification(enabled:" + enabled +
+ " c:" + audioDevice.mCard +
+ " d:" + audioDevice.mDevice + ")");
+ }
+
// send a sticky broadcast containing current USB state
Intent intent = new Intent(AudioManager.ACTION_USB_AUDIO_DEVICE_PLUG);
intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
@@ -162,6 +152,7 @@
intent.putExtra("hasPlayback", audioDevice.mHasPlayback);
intent.putExtra("hasCapture", audioDevice.mHasCapture);
intent.putExtra("hasMIDI", audioDevice.mHasMIDI);
+ intent.putExtra("class", audioDevice.mDeviceClass);
mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
}
@@ -241,6 +232,81 @@
}
}
+ /*
+ * Select the default device of the specified card.
+ */
+ /* package */ boolean selectCard(int card) {
+ if (DEBUG) {
+ Slog.d(TAG, "selectCard() card:" + card);
+ }
+ if (!mCardsParser.isCardUsb(card)) {
+ // Don't. AudioPolicyManager has logic for falling back to internal devices.
+ return false;
+ }
+
+ if (mSelectedAudioDevice != null) {
+ if (mSelectedAudioDevice.mCard == card) {
+ // Nothing to do here.
+ return false;
+ }
+ // "disconnect" the AudioPolicyManager from the previously selected device.
+ sendDeviceNotification(mSelectedAudioDevice, false);
+ mSelectedAudioDevice = null;
+ }
+
+ mDevicesParser.scan();
+ int device = mDevicesParser.getDefaultDeviceNum(card);
+
+ boolean hasPlayback = mDevicesParser.hasPlaybackDevices(card);
+ boolean hasCapture = mDevicesParser.hasCaptureDevices(card);
+ boolean hasMidi = mDevicesParser.hasMIDIDevices(card);
+ int deviceClass =
+ (mCardsParser.isCardUsb(card)
+ ? UsbAudioDevice.kAudioDeviceClass_External
+ : UsbAudioDevice.kAudioDeviceClass_Internal) |
+ UsbAudioDevice.kAudioDeviceMeta_Alsa;
+
+ // Playback device file needed/present?
+ if (hasPlayback && (waitForAlsaDevice(card, device, AlsaDevice.TYPE_PLAYBACK) == null)) {
+ return false;
+ }
+
+ // Capture device file needed/present?
+ if (hasCapture && (waitForAlsaDevice(card, device, AlsaDevice.TYPE_CAPTURE) == null)) {
+ return false;
+ }
+ //TODO - seems to me that we need to decouple the above tests for audio
+ // from the one below for MIDI.
+
+ // MIDI device file needed/present?
+ AlsaDevice midiDevice = null;
+ if (hasMidi) {
+ midiDevice = waitForAlsaDevice(card, device, AlsaDevice.TYPE_MIDI);
+ }
+
+ if (DEBUG) {
+ Slog.d(TAG, "usb: hasPlayback:" + hasPlayback + " hasCapture:" + hasCapture);
+ }
+
+ mSelectedAudioDevice =
+ new UsbAudioDevice(card, device, hasPlayback, hasCapture, hasMidi, deviceClass);
+ mSelectedAudioDevice.mDeviceName = mCardsParser.getCardRecordFor(card).mCardName;
+ mSelectedAudioDevice.mDeviceDescription =
+ mCardsParser.getCardRecordFor(card).mCardDescription;
+
+ sendDeviceNotification(mSelectedAudioDevice, true);
+
+ return true;
+ }
+
+ /* package */ boolean selectDefaultDevice() {
+ if (DEBUG) {
+ Slog.d(TAG, "UsbAudioManager.selectDefaultDevice()");
+ }
+ mCardsParser.scan();
+ return selectCard(mCardsParser.getDefaultCard());
+ }
+
/* package */ void deviceAdded(UsbDevice usbDevice) {
if (DEBUG) {
Slog.d(TAG, "deviceAdded(): " + usbDevice);
@@ -263,56 +329,28 @@
return;
}
- //TODO(pmclean) The "Parser" objects inspect files in "/proc/asound" which we presume is
- // present, unlike the waitForAlsaDevice() which waits on a file in /dev/snd. It is not
- // clear why this works, or that it can be relied on going forward. Needs further
- // research.
- AlsaCardsParser cardsParser = new AlsaCardsParser();
- cardsParser.scan();
- // cardsParser.Log();
+ ArrayList<AlsaCardsParser.AlsaCardRecord> prevScanRecs = mCardsParser.getScanRecords();
+ mCardsParser.scan();
- // But we need to parse the device to determine its capabilities.
- AlsaDevicesParser devicesParser = new AlsaDevicesParser();
- devicesParser.scan();
- // devicesParser.Log();
-
- // The protocol for now will be to select the last-connected (highest-numbered)
- // Alsa Card.
- int card = cardsParser.getNumCardRecords() - 1;
- int device = 0;
-
- boolean hasPlayback = devicesParser.hasPlaybackDevices(card);
- boolean hasCapture = devicesParser.hasCaptureDevices(card);
- boolean hasMidi = devicesParser.hasMIDIDevices(card);
-
- // Playback device file needed/present?
- if (hasPlayback &&
- waitForAlsaDevice(card, device, AlsaDevice.TYPE_PLAYBACK) == null) {
- return;
+ int addedCard = -1;
+ ArrayList<AlsaCardsParser.AlsaCardRecord>
+ newScanRecs = mCardsParser.getNewCardRecords(prevScanRecs);
+ if (newScanRecs.size() > 0) {
+ // This is where we select the just connected device
+ // NOTE - to switch to prefering the first-connected device, just always
+ // take the else clause below.
+ addedCard = newScanRecs.get(0).mCardNum;
+ } else {
+ addedCard = mCardsParser.getDefaultUsbCard();
}
- // Capture device file needed/present?
- if (hasCapture &&
- waitForAlsaDevice(card, device, AlsaDevice.TYPE_CAPTURE) == null) {
- return;
+ // If the default isn't a USB device, let the existing "select internal mechanism"
+ // handle the selection.
+ if (mCardsParser.isCardUsb(addedCard)) {
+ selectCard(addedCard);
+ mAudioDevices.put(usbDevice, mSelectedAudioDevice);
}
- // MIDI device file needed/present?
- if (hasMidi) {
- midiDevice = waitForAlsaDevice(card, device, AlsaDevice.TYPE_MIDI);
- }
-
- if (DEBUG) {
- Slog.d(TAG,
- "usb: hasPlayback:" + hasPlayback +
- " hasCapture:" + hasCapture +
- " hasMidi:" + hasMidi);
- }
-
- AudioDevice audioDevice = new AudioDevice(card, device, hasPlayback, hasCapture, hasMidi);
- mAudioDevices.put(usbDevice, audioDevice);
- sendDeviceNotification(audioDevice, true);
-
if (midiDevice != null && mMidiManager != null) {
try {
mMidiManager.alsaDeviceAdded(midiDevice.mCard, midiDevice.mDevice, usbDevice);
@@ -327,7 +365,7 @@
Slog.d(TAG, "deviceRemoved(): " + device);
}
- AudioDevice audioDevice = mAudioDevices.remove(device);
+ UsbAudioDevice audioDevice = mAudioDevices.remove(device);
if (audioDevice != null) {
if (audioDevice.mHasPlayback || audioDevice.mHasPlayback) {
sendDeviceNotification(audioDevice, false);
@@ -340,12 +378,52 @@
}
}
}
+
+ mSelectedAudioDevice = null;
+
+ // if there any external devices left, select one of them
+ selectDefaultDevice();
}
+ //
+ // Devices List
+ //
+ public ArrayList<UsbAudioDevice> getConnectedDevices() {
+ ArrayList<UsbAudioDevice> devices = new ArrayList<UsbAudioDevice>(mAudioDevices.size());
+ for (HashMap.Entry<UsbDevice,UsbAudioDevice> entry : mAudioDevices.entrySet()) {
+ devices.add(entry.getValue());
+ }
+ return devices;
+ }
+
+ //
+ // Logging
+ //
public void dump(FileDescriptor fd, PrintWriter pw) {
pw.println(" USB AudioDevices:");
for (UsbDevice device : mAudioDevices.keySet()) {
pw.println(" " + device.getDeviceName() + ": " + mAudioDevices.get(device));
}
}
+
+ public void logDevicesList(String title) {
+ if (DEBUG) {
+ for (HashMap.Entry<UsbDevice,UsbAudioDevice> entry : mAudioDevices.entrySet()) {
+ Slog.i(TAG, "UsbDevice-------------------");
+ Slog.i(TAG, "" + (entry != null ? entry.getKey() : "[none]"));
+ Slog.i(TAG, "UsbAudioDevice--------------");
+ Slog.i(TAG, "" + entry.getValue());
+ }
+ }
+ }
+
+ // This logs a more terse (and more readable) version of the devices list
+ public void logDevices(String title) {
+ if (DEBUG) {
+ Slog.i(TAG, title);
+ for (HashMap.Entry<UsbDevice,UsbAudioDevice> entry : mAudioDevices.entrySet()) {
+ Slog.i(TAG, entry.getValue().toShortString());
+ }
+ }
+ }
}
diff --git a/services/usb/java/com/android/server/usb/UsbAudioDevice.java b/services/usb/java/com/android/server/usb/UsbAudioDevice.java
new file mode 100644
index 0000000..b7b9563
--- /dev/null
+++ b/services/usb/java/com/android/server/usb/UsbAudioDevice.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions an
+ * limitations under the License.
+ */
+
+package com.android.server.usb;
+
+public final class UsbAudioDevice {
+ private static final String TAG = "UsbAudioDevice";
+ protected static final boolean DEBUG = false;
+
+ public int mCard;
+ public int mDevice;
+ public boolean mHasPlayback;
+ public boolean mHasCapture;
+ public boolean mHasMIDI;
+
+ // Device "class" flags
+ public static final int kAudioDeviceClassMask = 0x00FFFFFF;
+ public static final int kAudioDeviceClass_Undefined = 0x00000000;
+ public static final int kAudioDeviceClass_Internal = 0x00000001;
+ public static final int kAudioDeviceClass_External = 0x00000002;
+ // Device meta-data flags
+ public static final int kAudioDeviceMetaMask = 0xFF000000;
+ public static final int kAudioDeviceMeta_Alsa = 0x80000000;
+ // This member is a combination of the above bit-flags
+ public int mDeviceClass;
+
+ public String mDeviceName = "";
+ public String mDeviceDescription = "";
+
+ public UsbAudioDevice(int card, int device,
+ boolean hasPlayback, boolean hasCapture, boolean hasMidi, int deviceClass) {
+ mCard = card;
+ mDevice = device;
+ mHasPlayback = hasPlayback;
+ mHasCapture = hasCapture;
+ mHasMIDI = hasMidi;
+ mDeviceClass = deviceClass;
+ }
+
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("UsbAudioDevice: [card: " + mCard);
+ sb.append(", device: " + mDevice);
+ sb.append(", name: " + mDeviceName);
+ sb.append(", description: " + mDeviceDescription);
+ sb.append(", hasPlayback: " + mHasPlayback);
+ sb.append(", hasCapture: " + mHasCapture);
+ sb.append(", hasMidi: " + mHasMIDI);
+ sb.append(", class: 0x" + Integer.toHexString(mDeviceClass) + "]");
+ return sb.toString();
+ }
+
+ public String toShortString() {
+ return "[card:" + mCard + " device:" + mDevice + " " + mDeviceName + "]";
+ }
+}
+
diff --git a/telecomm/java/android/telecom/Conference.java b/telecomm/java/android/telecom/Conference.java
index e764cd5..33bbb29 100644
--- a/telecomm/java/android/telecom/Conference.java
+++ b/telecomm/java/android/telecom/Conference.java
@@ -32,6 +32,12 @@
@SystemApi
public abstract class Conference implements IConferenceable {
+ /**
+ * Used to indicate that the conference connection time is not specified. If not specified,
+ * Telecom will set the connect time.
+ */
+ public static long CONNECT_TIME_NOT_SPECIFIED = 0;
+
/** @hide */
public abstract static class Listener {
public void onStateChanged(Conference conference, int oldState, int newState) {}
@@ -59,6 +65,7 @@
private DisconnectCause mDisconnectCause;
private int mConnectionCapabilities;
private String mDisconnectMessage;
+ private long mConnectTimeMillis = CONNECT_TIME_NOT_SPECIFIED;
private final Connection.Listener mConnectionDeathListener = new Connection.Listener() {
@Override
@@ -422,6 +429,26 @@
}
/**
+ * Sets the connect time of the {@code Conference}.
+ *
+ * @param connectTimeMillis The connection time, in milliseconds.
+ */
+ public void setConnectTimeMillis(long connectTimeMillis) {
+ mConnectTimeMillis = connectTimeMillis;
+ }
+
+ /**
+ * Retrieves the connect time of the {@code Conference}, if specified. A value of
+ * {@link #CONNECT_TIME_NOT_SPECIFIED} indicates that Telecom should determine the start time
+ * of the conference.
+ *
+ * @return The time the {@code Conference} has been connected.
+ */
+ public long getConnectTimeMillis() {
+ return mConnectTimeMillis;
+ }
+
+ /**
* Inform this Conference that the state of its audio output has been changed externally.
*
* @param state The new audio state.
diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java
index df16375..dfdc3e1 100644
--- a/telecomm/java/android/telecom/ConnectionService.java
+++ b/telecomm/java/android/telecom/ConnectionService.java
@@ -883,7 +883,8 @@
conference.getPhoneAccountHandle(),
conference.getState(),
conference.getConnectionCapabilities(),
- connectionIds);
+ connectionIds,
+ conference.getConnectTimeMillis());
mAdapter.addConferenceCall(id, parcelableConference);
// Go through any child calls and set the parent.
diff --git a/telecomm/java/android/telecom/ParcelableConference.java b/telecomm/java/android/telecom/ParcelableConference.java
index c4e11d6..dcc2713 100644
--- a/telecomm/java/android/telecom/ParcelableConference.java
+++ b/telecomm/java/android/telecom/ParcelableConference.java
@@ -32,6 +32,7 @@
private int mState;
private int mConnectionCapabilities;
private List<String> mConnectionIds;
+ private long mConnectTimeMillis;
public ParcelableConference(
PhoneAccountHandle phoneAccount,
@@ -42,6 +43,17 @@
mState = state;
mConnectionCapabilities = connectionCapabilities;
mConnectionIds = connectionIds;
+ mConnectTimeMillis = Conference.CONNECT_TIME_NOT_SPECIFIED;
+ }
+
+ public ParcelableConference(
+ PhoneAccountHandle phoneAccount,
+ int state,
+ int connectionCapabilities,
+ List<String> connectionIds,
+ long connectTimeMillis) {
+ this(phoneAccount, state, connectionCapabilities, connectionIds);
+ mConnectTimeMillis = connectTimeMillis;
}
@Override
@@ -53,6 +65,8 @@
.append(Connection.stateToString(mState))
.append(", capabilities: ")
.append(Connection.capabilitiesToString(mConnectionCapabilities))
+ .append(", connectTime: ")
+ .append(mConnectTimeMillis)
.append(", children: ")
.append(mConnectionIds)
.toString();
@@ -74,6 +88,10 @@
return mConnectionIds;
}
+ public long getConnectTimeMillis() {
+ return mConnectTimeMillis;
+ }
+
public static final Parcelable.Creator<ParcelableConference> CREATOR =
new Parcelable.Creator<ParcelableConference> () {
@Override
@@ -84,8 +102,10 @@
int capabilities = source.readInt();
List<String> connectionIds = new ArrayList<>(2);
source.readList(connectionIds, classLoader);
+ long connectTimeMillis = source.readLong();
- return new ParcelableConference(phoneAccount, state, capabilities, connectionIds);
+ return new ParcelableConference(phoneAccount, state, capabilities, connectionIds,
+ connectTimeMillis);
}
@Override
@@ -107,5 +127,6 @@
destination.writeInt(mState);
destination.writeInt(mConnectionCapabilities);
destination.writeList(mConnectionIds);
+ destination.writeLong(mConnectTimeMillis);
}
}
diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java
index ba07a95..9d2a1ec 100644
--- a/telephony/java/android/telephony/PhoneNumberUtils.java
+++ b/telephony/java/android/telephony/PhoneNumberUtils.java
@@ -1145,6 +1145,7 @@
*
* @deprecated Use link #formatNumber(String phoneNumber, String defaultCountryIso) instead
*/
+ @Deprecated
public static String formatNumber(String source) {
SpannableStringBuilder text = new SpannableStringBuilder(source);
formatNumber(text, getFormatTypeForLocale(Locale.getDefault()));
@@ -1163,6 +1164,7 @@
* @hide
* @deprecated Use link #formatNumber(String phoneNumber, String defaultCountryIso) instead
*/
+ @Deprecated
public static String formatNumber(String source, int defaultFormattingType) {
SpannableStringBuilder text = new SpannableStringBuilder(source);
formatNumber(text, defaultFormattingType);
@@ -1178,6 +1180,7 @@
*
* @deprecated Use link #formatNumber(String phoneNumber, String defaultCountryIso) instead
*/
+ @Deprecated
public static int getFormatTypeForLocale(Locale locale) {
String country = locale.getCountry();
@@ -1194,6 +1197,7 @@
*
* @deprecated Use link #formatNumber(String phoneNumber, String defaultCountryIso) instead
*/
+ @Deprecated
public static void formatNumber(Editable text, int defaultFormattingType) {
int formatType = defaultFormattingType;
@@ -1242,6 +1246,7 @@
*
* @deprecated Use link #formatNumber(String phoneNumber, String defaultCountryIso) instead
*/
+ @Deprecated
public static void formatNanpNumber(Editable text) {
int length = text.length();
if (length > "+1-nnn-nnn-nnnn".length()) {
@@ -1357,6 +1362,7 @@
*
* @deprecated Use link #formatNumber(String phoneNumber, String defaultCountryIso) instead
*/
+ @Deprecated
public static void formatJapaneseNumber(Editable text) {
JapanesePhoneNumberFormatter.format(text);
}
@@ -1378,32 +1384,52 @@
}
/**
- * Format the given phoneNumber to the E.164 representation.
- * <p>
- * The given phone number must have an area code and could have a country
- * code.
- * <p>
- * The defaultCountryIso is used to validate the given number and generate
- * the E.164 phone number if the given number doesn't have a country code.
+ * Formats the specified {@code phoneNumber} to the E.164 representation.
*
- * @param phoneNumber
- * the phone number to format
- * @param defaultCountryIso
- * the ISO 3166-1 two letters country code
- * @return the E.164 representation, or null if the given phone number is
- * not valid.
+ * @param phoneNumber the phone number to format.
+ * @param defaultCountryIso the ISO 3166-1 two letters country code.
+ * @return the E.164 representation, or null if the given phone number is not valid.
*/
public static String formatNumberToE164(String phoneNumber, String defaultCountryIso) {
+ return formatNumberInternal(phoneNumber, defaultCountryIso, PhoneNumberFormat.E164);
+ }
+
+ /**
+ * Formats the specified {@code phoneNumber} to the RFC3966 representation.
+ *
+ * @param phoneNumber the phone number to format.
+ * @param defaultCountryIso the ISO 3166-1 two letters country code.
+ * @return the RFC3966 representation, or null if the given phone number is not valid.
+ */
+ public static String formatNumberToRFC3966(String phoneNumber, String defaultCountryIso) {
+ return formatNumberInternal(phoneNumber, defaultCountryIso, PhoneNumberFormat.RFC3966);
+ }
+
+ /**
+ * Formats the raw phone number (string) using the specified {@code formatIdentifier}.
+ * <p>
+ * The given phone number must have an area code and could have a country code.
+ * <p>
+ * The defaultCountryIso is used to validate the given number and generate the formatted number
+ * if the specified number doesn't have a country code.
+ *
+ * @param rawPhoneNumber The phone number to format.
+ * @param defaultCountryIso The ISO 3166-1 two letters country code.
+ * @param formatIdentifier The (enum) identifier of the desired format.
+ * @return the formatted representation, or null if the specified number is not valid.
+ */
+ private static String formatNumberInternal(
+ String rawPhoneNumber, String defaultCountryIso, PhoneNumberFormat formatIdentifier) {
+
PhoneNumberUtil util = PhoneNumberUtil.getInstance();
- String result = null;
try {
- PhoneNumber pn = util.parse(phoneNumber, defaultCountryIso);
- if (util.isValidNumber(pn)) {
- result = util.format(pn, PhoneNumberFormat.E164);
+ PhoneNumber phoneNumber = util.parse(rawPhoneNumber, defaultCountryIso);
+ if (util.isValidNumber(phoneNumber)) {
+ return util.format(phoneNumber, formatIdentifier);
}
- } catch (NumberParseException e) {
- }
- return result;
+ } catch (NumberParseException ignored) { }
+
+ return null;
}
/**
@@ -2454,7 +2480,7 @@
*
* @param number SIP address of the form "username@domainname"
* (or the URI-escaped equivalent "username%40domainname")
- * @see isUriNumber
+ * @see #isUriNumber
*
* @hide
*/
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index d174f47..9ef6f1f 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -266,9 +266,9 @@
* A listener class for monitoring changes to {@link SubscriptionInfo} records.
* <p>
* Override the onSubscriptionsChanged method in the object that extends this
- * class and pass it to {@link #registerOnSubscriptionsChangedListener(OnSubscriptionsChangedListener)}
+ * class and pass it to {@link #addOnSubscriptionsChangedListener(OnSubscriptionsChangedListener)}
* to register your listener and to unregister invoke
- * {@link #unregisterOnSubscriptionsChangedListener(OnSubscriptionsChangedListener)}
+ * {@link #removeOnSubscriptionsChangedListener(OnSubscriptionsChangedListener)}
* <p>
* Permissions android.Manifest.permission.READ_PHONE_STATE is required
* for #onSubscriptionsChanged to be invoked.
@@ -340,7 +340,7 @@
* @param listener an instance of {@link OnSubscriptionsChangedListener} with
* onSubscriptionsChanged overridden.
*/
- public void registerOnSubscriptionsChangedListener(OnSubscriptionsChangedListener listener) {
+ public void addOnSubscriptionsChangedListener(OnSubscriptionsChangedListener listener) {
String pkgForDebug = mContext != null ? mContext.getPackageName() : "<unknown>";
if (DBG) {
logd("register OnSubscriptionsChangedListener pkgForDebug=" + pkgForDebug
@@ -352,7 +352,7 @@
ITelephonyRegistry tr = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService(
"telephony.registry"));
if (tr != null) {
- tr.registerOnSubscriptionsChangedListener(pkgForDebug, listener.callback);
+ tr.addOnSubscriptionsChangedListener(pkgForDebug, listener.callback);
}
} catch (RemoteException ex) {
// Should not happen
@@ -366,7 +366,7 @@
*
* @param listener that is to be unregistered.
*/
- public void unregisterOnSubscriptionsChangedListener(OnSubscriptionsChangedListener listener) {
+ public void removeOnSubscriptionsChangedListener(OnSubscriptionsChangedListener listener) {
String pkgForDebug = mContext != null ? mContext.getPackageName() : "<unknown>";
if (DBG) {
logd("unregister OnSubscriptionsChangedListener pkgForDebug=" + pkgForDebug
@@ -378,7 +378,7 @@
ITelephonyRegistry tr = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService(
"telephony.registry"));
if (tr != null) {
- tr.unregisterOnSubscriptionsChangedListener(pkgForDebug, listener.callback);
+ tr.removeOnSubscriptionsChangedListener(pkgForDebug, listener.callback);
}
} catch (RemoteException ex) {
// Should not happen
diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
index ba62f5f..7d8a8d6 100644
--- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
@@ -30,9 +30,9 @@
import com.android.internal.telephony.IOnSubscriptionsChangedListener;
interface ITelephonyRegistry {
- void registerOnSubscriptionsChangedListener(String pkg,
+ void addOnSubscriptionsChangedListener(String pkg,
IOnSubscriptionsChangedListener callback);
- void unregisterOnSubscriptionsChangedListener(String pkg,
+ void removeOnSubscriptionsChangedListener(String pkg,
IOnSubscriptionsChangedListener callback);
void listen(String pkg, IPhoneStateListener callback, int events, boolean notifyNow);
void listenForSubscriber(in int subId, String pkg, IPhoneStateListener callback, int events,
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable03.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable03.xml
index a0b0e00..7cddda1 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable03.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable03.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:height="64dp"
- android:width="64dp"
- android:viewportHeight="12.25"
- android:viewportWidth="7.30625" >
+ android:height="64dp"
+ android:viewportHeight="12.25"
+ android:viewportWidth="7.30625"
+ android:width="64dp" >
<group
android:pivotX="3.65"
@@ -31,14 +31,18 @@
l 0, 12.25
l-7.3, 0
z" />
- </group>
- <group>
- <path
- android:name="one"
- android:fillColor="#ff88ff"
- android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
+
+ <group
+ android:pivotX="3.65"
+ android:pivotY="6.125"
+ android:rotation="30" >
+ <path
+ android:name="one"
+ android:fillColor="#ff88ff"
+ android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
l-5.046875,0.0 0.0-1.0Z" />
+ </group>
</group>
<group
android:pivotX="3.65"
@@ -52,12 +56,15 @@
l 0, 6.125
l-7.3, 0
z" />
- </group>
- <group>
- <path
- android:name="two"
- android:fillColor="#ff88ff"
- android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
+
+ <group
+ android:pivotX="3.65"
+ android:pivotY="6.125"
+ android:rotation="30" >
+ <path
+ android:name="two"
+ android:fillColor="#ff88ff"
+ android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625
q 0.234375-0.453125 0.234375-0.875 0.0-0.703125-0.5-1.140625
q-0.484375-0.4375-1.2656252-0.4375-0.5625,0.0-1.1875,0.1875
@@ -66,6 +73,7 @@
q 0.8125,0.671875 0.8125,1.8125 0.0,0.53125-0.203125,1.015625
q-0.203125,0.484375-0.734375,1.140625-0.15625,0.171875-0.9375,0.984375
q-0.78125024,0.8125-2.2187502,2.265625Z" />
+ </group>
</group>
</vector>
\ No newline at end of file
diff --git a/tools/aapt/Main.cpp b/tools/aapt/Main.cpp
index 18b8e1e..8b416aa 100644
--- a/tools/aapt/Main.cpp
+++ b/tools/aapt/Main.cpp
@@ -69,7 +69,7 @@
" [-S resource-sources [-S resource-sources ...]] \\\n"
" [-F apk-file] [-J R-file-dir] \\\n"
" [--product product1,product2,...] \\\n"
- " [-c CONFIGS] [--preferred-configurations CONFIGS] \\\n"
+ " [-c CONFIGS] [--preferred-density DENSITY] \\\n"
" [--split CONFIGS [--split CONFIGS]] \\\n"
" [--feature-of package [--feature-after package]] \\\n"
" [raw-files-dir [raw-files-dir] ...] \\\n"
diff --git a/tools/layoutlib/.idea/codeStyleSettings.xml b/tools/layoutlib/.idea/codeStyleSettings.xml
index b324213..a04e440 100644
--- a/tools/layoutlib/.idea/codeStyleSettings.xml
+++ b/tools/layoutlib/.idea/codeStyleSettings.xml
@@ -67,9 +67,13 @@
</groups>
</arrangement>
</codeStyleSettings>
+ <codeStyleSettings language="XML">
+ <indentOptions>
+ <option name="CONTINUATION_INDENT_SIZE" value="4" />
+ </indentOptions>
+ </codeStyleSettings>
</value>
</option>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</component>
-</project>
-
+</project>
\ No newline at end of file
diff --git a/tools/layoutlib/bridge/src/android/preference/BridgePreferenceInflater.java b/tools/layoutlib/bridge/src/android/preference/BridgePreferenceInflater.java
new file mode 100644
index 0000000..4f00b5d
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/preference/BridgePreferenceInflater.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.preference;
+
+import com.android.layoutlib.bridge.android.BridgeContext;
+import com.android.layoutlib.bridge.android.BridgeXmlBlockParser;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+public class BridgePreferenceInflater extends PreferenceInflater {
+
+ public BridgePreferenceInflater(Context context, PreferenceManager preferenceManager) {
+ super(context, preferenceManager);
+ }
+
+ @Override
+ protected Preference onCreateItem(String name, AttributeSet attrs)
+ throws ClassNotFoundException {
+ Object viewKey = null;
+ BridgeContext bc = null;
+
+ Context context = getContext();
+ if (context instanceof BridgeContext) {
+ bc = (BridgeContext) context;
+ }
+ if (attrs instanceof BridgeXmlBlockParser) {
+ viewKey = ((BridgeXmlBlockParser) attrs).getViewCookie();
+ }
+
+ Preference preference = super.onCreateItem(name, attrs);
+
+ if (viewKey != null && bc != null) {
+ bc.addCookie(preference, viewKey);
+ }
+ return preference;
+ }
+}
diff --git a/tools/layoutlib/bridge/src/android/preference/Preference_Delegate.java b/tools/layoutlib/bridge/src/android/preference/Preference_Delegate.java
new file mode 100644
index 0000000..49ee642
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/preference/Preference_Delegate.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.preference;
+
+import com.android.internal.R;
+import com.android.layoutlib.bridge.android.BridgeContext;
+import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
+
+import org.xmlpull.v1.XmlPullParser;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ListView;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Delegate that provides implementation for native methods in {@link Preference}
+ * <p/>
+ * Through the layoutlib_create tool, selected methods of Preference have been replaced by calls to
+ * methods of the same name in this delegate class.
+ */
+public class Preference_Delegate {
+
+ @LayoutlibDelegate
+ /*package*/ static View getView(Preference pref, View convertView, ViewGroup parent) {
+ Context context = pref.getContext();
+ BridgeContext bc = context instanceof BridgeContext ? ((BridgeContext) context) : null;
+ convertView = pref.getView_Original(convertView, parent);
+ if (bc != null) {
+ Object cookie = bc.getCookie(pref);
+ if (cookie != null) {
+ bc.addViewKey(convertView, cookie);
+ }
+ }
+ return convertView;
+ }
+
+ /**
+ * Inflates the parser and returns the ListView containing the Preferences.
+ */
+ public static View inflatePreference(Context context, XmlPullParser parser, ViewGroup root) {
+ PreferenceManager pm = new PreferenceManager(context);
+ PreferenceScreen ps = pm.getPreferenceScreen();
+ PreferenceInflater inflater = new BridgePreferenceInflater(context, pm);
+ ps = (PreferenceScreen) inflater.inflate(parser, ps, true);
+ ListView preferenceView = createContainerView(context, root);
+ ps.bind(preferenceView);
+ return preferenceView;
+ }
+
+ private static ListView createContainerView(Context context, ViewGroup root) {
+ TypedArray a = context.obtainStyledAttributes(null, R.styleable.PreferenceFragment,
+ R.attr.preferenceFragmentStyle, 0);
+ int mLayoutResId = a.getResourceId(R.styleable.PreferenceFragment_layout,
+ R.layout.preference_list_fragment);
+ a.recycle();
+
+ LayoutInflater inflater =
+ (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ inflater.inflate(mLayoutResId, root, true);
+
+ return (ListView) root.findViewById(android.R.id.list);
+ }
+}
diff --git a/tools/layoutlib/bridge/src/android/text/StaticLayout_Delegate.java b/tools/layoutlib/bridge/src/android/text/StaticLayout_Delegate.java
index c48b771..929d625 100644
--- a/tools/layoutlib/bridge/src/android/text/StaticLayout_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/text/StaticLayout_Delegate.java
@@ -16,8 +16,9 @@
/**
* Delegate that provides implementation for native methods in {@link android.text.StaticLayout}
* <p/>
- * Through the layoutlib_create tool, selected methods of Handler have been replaced by calls to
- * methods of the same name in this delegate class.
+ * Through the layoutlib_create tool, selected methods of StaticLayout have been replaced
+ * by calls to methods of the same name in this delegate class.
+ *
*/
public class StaticLayout_Delegate {
diff --git a/tools/layoutlib/bridge/src/android/text/format/DateFormat_Delegate.java b/tools/layoutlib/bridge/src/android/text/format/DateFormat_Delegate.java
index 8cd1a69..1e4f213 100644
--- a/tools/layoutlib/bridge/src/android/text/format/DateFormat_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/text/format/DateFormat_Delegate.java
@@ -34,4 +34,9 @@
/*package*/ static boolean is24HourFormat(Context context) {
return false;
}
+
+ @LayoutlibDelegate
+ /*package*/ static boolean is24HourFormat(Context context, int userHandle) {
+ return false;
+ }
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
index 0af04ec..4d2c2fc 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
@@ -22,6 +22,7 @@
import com.android.annotations.NonNull;
import com.android.ide.common.rendering.api.Capability;
import com.android.ide.common.rendering.api.DrawableParams;
+import com.android.ide.common.rendering.api.Features;
import com.android.ide.common.rendering.api.LayoutLog;
import com.android.ide.common.rendering.api.RenderSession;
import com.android.ide.common.rendering.api.Result;
@@ -180,7 +181,7 @@
*/
private static LayoutLog sCurrentLog = sDefaultLog;
- private EnumSet<Capability> mCapabilities;
+ private static final int LAST_SUPPORTED_FEATURE = Features.PREFERENCES_RENDERING;
@Override
public int getApiLevel() {
@@ -188,8 +189,16 @@
}
@Override
+ @Deprecated
public EnumSet<Capability> getCapabilities() {
- return mCapabilities;
+ // The Capability class is deprecated and frozen. All Capabilities enumerated there are
+ // supported by this version of LayoutLibrary. So, it's safe to use EnumSet.allOf()
+ return EnumSet.allOf(Capability.class);
+ }
+
+ @Override
+ public boolean supports(int feature) {
+ return feature <= LAST_SUPPORTED_FEATURE;
}
@Override
@@ -200,26 +209,6 @@
sPlatformProperties = platformProperties;
sEnumValueMap = enumValueMap;
- // don't use EnumSet.allOf(), because the bridge doesn't come with its specific version
- // of layoutlib_api. It is provided by the client which could have a more recent version
- // with newer, unsupported capabilities.
- mCapabilities = EnumSet.of(
- Capability.UNBOUND_RENDERING,
- Capability.CUSTOM_BACKGROUND_COLOR,
- Capability.RENDER,
- Capability.LAYOUT_ONLY,
- Capability.EMBEDDED_LAYOUT,
- Capability.VIEW_MANIPULATION,
- Capability.PLAY_ANIMATION,
- Capability.ANIMATED_VIEW_MANIPULATION,
- Capability.ADAPTER_BINDING,
- Capability.EXTENDED_VIEWINFO,
- Capability.FIXED_SCALABLE_NINE_PATCH,
- Capability.RTL,
- Capability.ACTION_BAR,
- Capability.SIMULATE_PLATFORM);
-
-
BridgeAssetManager.initSystem();
// When DEBUG_LAYOUT is set and is not 0 or false, setup a default listener
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
index e74debb..3953624 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
@@ -74,6 +74,7 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
+import android.view.accessibility.AccessibilityManager;
import android.view.textservice.TextServicesManager;
import java.io.File;
@@ -93,8 +94,15 @@
*/
public final class BridgeContext extends Context {
- private Resources mSystemResources;
+ /** The map adds cookies to each view so that IDE can link xml tags to views. */
private final HashMap<View, Object> mViewKeyMap = new HashMap<View, Object>();
+ /**
+ * In some cases, when inflating an xml, some objects are created. Then later, the objects are
+ * converted to views. This map stores the mapping from objects to cookies which can then be
+ * used to populate the mViewKeyMap.
+ */
+ private final HashMap<Object, Object> mViewKeyHelpMap = new HashMap<Object, Object>();
+ private Resources mSystemResources;
private final Object mProjectKey;
private final DisplayMetrics mMetrics;
private final RenderResources mRenderResources;
@@ -121,8 +129,9 @@
private BridgeContentResolver mContentResolver;
private final Stack<BridgeXmlBlockParser> mParserStack = new Stack<BridgeXmlBlockParser>();
+ private SharedPreferences mSharedPreferences;
- /**
+ /**
* @param projectKey An Object identifying the project. This is used for the cache mechanism.
* @param metrics the {@link DisplayMetrics}.
* @param renderResources the configured resources (both framework and projects) for this
@@ -190,6 +199,14 @@
return mViewKeyMap.get(view);
}
+ public void addCookie(Object o, Object cookie) {
+ mViewKeyHelpMap.put(o, cookie);
+ }
+
+ public Object getCookie(Object o) {
+ return mViewKeyHelpMap.get(o);
+ }
+
public Object getProjectKey() {
return mProjectKey;
}
@@ -461,6 +478,10 @@
return mDisplayManager;
}
+ if (ACCESSIBILITY_SERVICE.equals(service)) {
+ return AccessibilityManager.getInstance(this);
+ }
+
throw new UnsupportedOperationException("Unsupported Service: " + service);
}
@@ -476,19 +497,22 @@
@Override
public final BridgeTypedArray obtainStyledAttributes(int resid, int[] attrs)
throws Resources.NotFoundException {
+ StyleResourceValue style = null;
// get the StyleResourceValue based on the resId;
- StyleResourceValue style = getStyleByDynamicId(resid);
+ if (resid != 0) {
+ style = getStyleByDynamicId(resid);
- if (style == null) {
- // In some cases, style may not be a dynamic id, so we do a full search.
- ResourceReference ref = resolveId(resid);
- if (ref != null) {
- style = mRenderResources.getStyle(ref.getName(), ref.isFramework());
+ if (style == null) {
+ // In some cases, style may not be a dynamic id, so we do a full search.
+ ResourceReference ref = resolveId(resid);
+ if (ref != null) {
+ style = mRenderResources.getStyle(ref.getName(), ref.isFramework());
+ }
}
- }
- if (style == null) {
- throw new Resources.NotFoundException();
+ if (style == null) {
+ throw new Resources.NotFoundException();
+ }
}
if (mTypedArrayCache == null) {
@@ -1176,8 +1200,10 @@
@Override
public SharedPreferences getSharedPreferences(String arg0, int arg1) {
- // pass
- return null;
+ if (mSharedPreferences == null) {
+ mSharedPreferences = new BridgeSharedPreferences();
+ }
+ return mSharedPreferences;
}
@Override
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeSharedPreferences.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeSharedPreferences.java
new file mode 100644
index 0000000..132ff2f
--- /dev/null
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeSharedPreferences.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.layoutlib.bridge.android;
+
+import android.content.SharedPreferences;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * An empty shared preferences implementation which doesn't store anything. It always returns
+ * null, 0 or false.
+ */
+public class BridgeSharedPreferences implements SharedPreferences {
+ private Editor mEditor;
+
+ @Override
+ public Map<String, ?> getAll() {
+ return null;
+ }
+
+ @Override
+ public String getString(String key, String defValue) {
+ return null;
+ }
+
+ @Override
+ public Set<String> getStringSet(String key, Set<String> defValues) {
+ return null;
+ }
+
+ @Override
+ public int getInt(String key, int defValue) {
+ return 0;
+ }
+
+ @Override
+ public long getLong(String key, long defValue) {
+ return 0;
+ }
+
+ @Override
+ public float getFloat(String key, float defValue) {
+ return 0;
+ }
+
+ @Override
+ public boolean getBoolean(String key, boolean defValue) {
+ return false;
+ }
+
+ @Override
+ public boolean contains(String key) {
+ return false;
+ }
+
+ @Override
+ public Editor edit() {
+ if (mEditor != null) {
+ return mEditor;
+ }
+ mEditor = new Editor() {
+ @Override
+ public Editor putString(String key, String value) {
+ return null;
+ }
+
+ @Override
+ public Editor putStringSet(String key, Set<String> values) {
+ return null;
+ }
+
+ @Override
+ public Editor putInt(String key, int value) {
+ return null;
+ }
+
+ @Override
+ public Editor putLong(String key, long value) {
+ return null;
+ }
+
+ @Override
+ public Editor putFloat(String key, float value) {
+ return null;
+ }
+
+ @Override
+ public Editor putBoolean(String key, boolean value) {
+ return null;
+ }
+
+ @Override
+ public Editor remove(String key) {
+ return null;
+ }
+
+ @Override
+ public Editor clear() {
+ return null;
+ }
+
+ @Override
+ public boolean commit() {
+ return false;
+ }
+
+ @Override
+ public void apply() {
+ }
+ };
+ return mEditor;
+ }
+
+ @Override
+ public void registerOnSharedPreferenceChangeListener(
+ OnSharedPreferenceChangeListener listener) {
+ }
+
+ @Override
+ public void unregisterOnSharedPreferenceChangeListener(
+ OnSharedPreferenceChangeListener listener) {
+ }
+}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/SessionParamsFlags.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/SessionParamsFlags.java
new file mode 100644
index 0000000..e00ea6a
--- /dev/null
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/SessionParamsFlags.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.layoutlib.bridge.android;
+
+import com.android.ide.common.rendering.api.SessionParams;
+
+/**
+ * This contains all known keys for the {@link SessionParams#getFlag(SessionParams.Key)}.
+ * <p/>
+ * The IDE has its own copy of this class which may be newer or older than this one.
+ * <p/>
+ * Constants should never be modified or removed from this class.
+ */
+public final class SessionParamsFlags {
+
+ public static final SessionParams.Key<String> FLAG_KEY_ROOT_TAG =
+ new SessionParams.Key<String>("rootTag", String.class);
+
+ // Disallow instances.
+ private SessionParamsFlags() {}
+}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
index 20eddd6..fd976af 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
@@ -36,6 +36,7 @@
import com.android.ide.common.rendering.api.Result.Status;
import com.android.ide.common.rendering.api.SessionParams;
import com.android.ide.common.rendering.api.SessionParams.RenderingMode;
+import com.android.ide.common.rendering.api.StyleResourceValue;
import com.android.ide.common.rendering.api.ViewInfo;
import com.android.ide.common.rendering.api.ViewType;
import com.android.internal.util.XmlUtils;
@@ -49,6 +50,7 @@
import com.android.layoutlib.bridge.android.BridgeContext;
import com.android.layoutlib.bridge.android.BridgeLayoutParamsMapAttributes;
import com.android.layoutlib.bridge.android.BridgeXmlBlockParser;
+import com.android.layoutlib.bridge.android.SessionParamsFlags;
import com.android.layoutlib.bridge.bars.Config;
import com.android.layoutlib.bridge.bars.NavigationBar;
import com.android.layoutlib.bridge.bars.StatusBar;
@@ -73,6 +75,7 @@
import android.graphics.Bitmap_Delegate;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
+import android.preference.Preference_Delegate;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.AttachInfo_Accessor;
@@ -87,7 +90,6 @@
import android.view.ViewGroup.MarginLayoutParams;
import android.view.ViewParent;
import android.view.WindowManagerGlobal_Delegate;
-import android.view.ViewParent;
import android.widget.AbsListView;
import android.widget.AbsSpinner;
import android.widget.ActionMenuView;
@@ -133,6 +135,7 @@
private int mMeasuredScreenHeight = -1;
private boolean mIsAlphaChannelImage;
private boolean mWindowIsFloating;
+ private Boolean mIsThemeAppCompat;
private int mStatusBarSize;
private int mNavigationBarSize;
@@ -193,11 +196,9 @@
DisplayMetrics metrics = getContext().getMetrics();
// use default of true in case it's not found to use alpha by default
- mIsAlphaChannelImage = getBooleanThemeValue(resources,
- "windowIsFloating", true /*defaultValue*/);
-
- mWindowIsFloating = getBooleanThemeValue(resources, "windowIsFloating",
- true /*defaultValue*/);
+ mIsAlphaChannelImage = getBooleanThemeValue(resources, "windowIsFloating", true, true);
+ // FIXME: Find out why both variables are taking the same value.
+ mWindowIsFloating = getBooleanThemeValue(resources, "windowIsFloating", true, true);
findBackground(resources);
findStatusBar(resources, metrics);
@@ -397,7 +398,15 @@
// it can instantiate the custom Fragment.
Fragment_Delegate.setProjectCallback(params.getProjectCallback());
- View view = mInflater.inflate(mBlockParser, mContentRoot);
+ String rootTag = params.getFlag(SessionParamsFlags.FLAG_KEY_ROOT_TAG);
+ boolean isPreference = "PreferenceScreen".equals(rootTag);
+ View view;
+ if (isPreference) {
+ view = Preference_Delegate.inflatePreference(getContext(), mBlockParser,
+ mContentRoot);
+ } else {
+ view = mInflater.inflate(mBlockParser, mContentRoot);
+ }
// done with the parser, pop it.
context.popParser();
@@ -408,7 +417,7 @@
AttachInfo_Accessor.setAttachInfo(mViewRoot);
// post-inflate process. For now this supports TabHost/TabWidget
- postInflateProcess(view, params.getProjectCallback());
+ postInflateProcess(view, params.getProjectCallback(), isPreference ? view : null);
// get the background drawable
if (mWindowBackground != null) {
@@ -1050,7 +1059,7 @@
private void findStatusBar(RenderResources resources, DisplayMetrics metrics) {
boolean windowFullscreen = getBooleanThemeValue(resources,
- "windowFullscreen", false /*defaultValue*/);
+ "windowFullscreen", false, !isThemeAppCompat(resources));
if (!windowFullscreen && !mWindowIsFloating) {
// default value
@@ -1077,7 +1086,7 @@
}
boolean windowActionBar = getBooleanThemeValue(resources,
- "windowActionBar", true /*defaultValue*/);
+ "windowActionBar", true, !isThemeAppCompat(resources));
// if there's a value and it's false (default is true)
if (windowActionBar) {
@@ -1104,7 +1113,7 @@
} else {
// action bar overrides title bar so only look for this one if action bar is hidden
boolean windowNoTitle = getBooleanThemeValue(resources,
- "windowNoTitle", false /*defaultValue*/);
+ "windowNoTitle", false, !isThemeAppCompat(resources));
if (!windowNoTitle) {
@@ -1176,20 +1185,30 @@
}
}
+ private boolean isThemeAppCompat(RenderResources resources) {
+ // Ideally, we should check if the corresponding activity extends
+ // android.support.v7.app.ActionBarActivity, and not care about the theme name at all.
+ if (mIsThemeAppCompat == null) {
+ StyleResourceValue defaultTheme = resources.getDefaultTheme();
+ StyleResourceValue val = resources.getStyle("Theme.AppCompat", false);
+ mIsThemeAppCompat = defaultTheme == val || resources.themeIsParentOf(val, defaultTheme);
+ }
+ return mIsThemeAppCompat;
+ }
+
/**
- * Looks for a attribute in the current theme. The attribute is in the android
- * namespace.
+ * Looks for an attribute in the current theme.
*
* @param resources the render resources
* @param name the name of the attribute
* @param defaultValue the default value.
+ * @param isFrameworkAttr if the attribute is in android namespace
* @return the value of the attribute or the default one if not found.
*/
private boolean getBooleanThemeValue(RenderResources resources,
- String name, boolean defaultValue) {
+ String name, boolean defaultValue, boolean isFrameworkAttr) {
- // get the title bar flag from the current theme.
- ResourceValue value = resources.findItemInTheme(name, true /*isFrameworkAttr*/);
+ ResourceValue value = resources.findItemInTheme(name, isFrameworkAttr);
// because it may reference something else, we resolve it.
value = resources.resolveResValue(value);
@@ -1210,12 +1229,16 @@
* based on the content of the {@link FrameLayout}.
* @param view the root view to process.
* @param projectCallback callback to the project.
+ * @param skip the view and it's children are not processed.
*/
@SuppressWarnings("deprecation") // For the use of Pair
- private void postInflateProcess(View view, IProjectCallback projectCallback)
+ private void postInflateProcess(View view, IProjectCallback projectCallback, View skip)
throws PostInflateException {
+ if (view == skip) {
+ return;
+ }
if (view instanceof TabHost) {
- setupTabHost((TabHost)view, projectCallback);
+ setupTabHost((TabHost) view, projectCallback);
} else if (view instanceof QuickContactBadge) {
QuickContactBadge badge = (QuickContactBadge) view;
badge.setImageToDefault();
@@ -1248,7 +1271,7 @@
boolean skipCallbackParser = false;
int count = binding.getHeaderCount();
- for (int i = 0 ; i < count ; i++) {
+ for (int i = 0; i < count; i++) {
Pair<View, Boolean> pair = context.inflateView(
binding.getHeaderAt(i),
list, false /*attachToRoot*/, skipCallbackParser);
@@ -1260,7 +1283,7 @@
}
count = binding.getFooterCount();
- for (int i = 0 ; i < count ; i++) {
+ for (int i = 0; i < count; i++) {
Pair<View, Boolean> pair = context.inflateView(
binding.getFooterAt(i),
list, false /*attachToRoot*/, skipCallbackParser);
@@ -1289,11 +1312,11 @@
}
}
} else if (view instanceof ViewGroup) {
- ViewGroup group = (ViewGroup)view;
+ ViewGroup group = (ViewGroup) view;
final int count = group.getChildCount();
- for (int c = 0 ; c < count ; c++) {
+ for (int c = 0; c < count; c++) {
View child = group.getChildAt(c);
- postInflateProcess(child, projectCallback);
+ postInflateProcess(child, projectCallback, skip);
}
}
}
@@ -1361,6 +1384,7 @@
for (int i = 0 ; i < count ; i++) {
View child = content.getChildAt(i);
String tabSpec = String.format("tab_spec%d", i+1);
+ @SuppressWarnings("ConstantConditions") // child cannot be null.
int id = child.getId();
@SuppressWarnings("deprecation")
Pair<ResourceType, String> resource = projectCallback.resolveResourceId(id);
diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/activity.png b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/activity.png
new file mode 100644
index 0000000..943cdf1
--- /dev/null
+++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/activity.png
Binary files differ
diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/layout.xml b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/layout.xml
index 2704c07..b8ec5661 100644
--- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/layout.xml
+++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/layout.xml
@@ -8,4 +8,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Some text"/>
+ <DatePicker
+ android:layout_width="100dp"
+ android:layout_height="100dp"/>
+ <CalendarView
+ android:layout_width="100dp"
+ android:layout_height="100dp"/>
</LinearLayout>
\ No newline at end of file
diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/ImageUtils.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/ImageUtils.java
new file mode 100644
index 0000000..e13ad72
--- /dev/null
+++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/ImageUtils.java
@@ -0,0 +1,336 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.layoutlib.bridge.intensive;
+
+import com.android.annotations.NonNull;
+
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.imageio.ImageIO;
+
+import static java.awt.RenderingHints.*;
+import static java.awt.image.BufferedImage.TYPE_INT_ARGB;
+import static java.io.File.separatorChar;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+
+// Adapted by taking the relevant pieces of code from the following classes:
+//
+// com.android.tools.idea.rendering.ImageUtils,
+// com.android.tools.idea.tests.gui.framework.fixture.layout.ImageFixture and
+// com.android.tools.idea.rendering.RenderTestBase
+/**
+ * Utilities related to image processing.
+ */
+public class ImageUtils {
+ /**
+ * Normally, this test will fail when there is a missing thumbnail. However, when
+ * you create creating a new test, it's useful to be able to turn this off such that
+ * you can generate all the missing thumbnails in one go, rather than having to run
+ * the test repeatedly to get to each new render assertion generating its thumbnail.
+ */
+ private static final boolean FAIL_ON_MISSING_THUMBNAIL = true;
+
+ private static final int THUMBNAIL_SIZE = 250;
+
+ private static final double MAX_PERCENT_DIFFERENCE = 0.1;
+
+ public static void requireSimilar(@NonNull String relativePath, @NonNull BufferedImage image)
+ throws IOException {
+ int maxDimension = Math.max(image.getWidth(), image.getHeight());
+ double scale = THUMBNAIL_SIZE / (double)maxDimension;
+ BufferedImage thumbnail = scale(image, scale, scale);
+
+ InputStream is = ImageUtils.class.getResourceAsStream(relativePath);
+ if (is == null) {
+ String message = "Unable to load golden thumbnail: " + relativePath + "\n";
+ message = saveImageAndAppendMessage(thumbnail, message, relativePath);
+ if (FAIL_ON_MISSING_THUMBNAIL) {
+ fail(message);
+ } else {
+ System.out.println(message);
+ }
+ }
+ else {
+ BufferedImage goldenImage = ImageIO.read(is);
+ assertImageSimilar(relativePath, goldenImage, thumbnail, MAX_PERCENT_DIFFERENCE);
+ }
+ }
+
+ public static void assertImageSimilar(String relativePath, BufferedImage goldenImage,
+ BufferedImage image, double maxPercentDifferent) throws IOException {
+ assertEquals("Only TYPE_INT_ARGB image types are supported", TYPE_INT_ARGB, image.getType());
+
+ if (goldenImage.getType() != TYPE_INT_ARGB) {
+ BufferedImage temp = new BufferedImage(goldenImage.getWidth(), goldenImage.getHeight(),
+ TYPE_INT_ARGB);
+ temp.getGraphics().drawImage(goldenImage, 0, 0, null);
+ goldenImage = temp;
+ }
+ assertEquals(TYPE_INT_ARGB, goldenImage.getType());
+
+ int imageWidth = Math.min(goldenImage.getWidth(), image.getWidth());
+ int imageHeight = Math.min(goldenImage.getHeight(), image.getHeight());
+
+ // Blur the images to account for the scenarios where there are pixel
+ // differences
+ // in where a sharp edge occurs
+ // goldenImage = blur(goldenImage, 6);
+ // image = blur(image, 6);
+
+ int width = 3 * imageWidth;
+ @SuppressWarnings("UnnecessaryLocalVariable")
+ int height = imageHeight; // makes code more readable
+ BufferedImage deltaImage = new BufferedImage(width, height, TYPE_INT_ARGB);
+ Graphics g = deltaImage.getGraphics();
+
+ // Compute delta map
+ long delta = 0;
+ for (int y = 0; y < imageHeight; y++) {
+ for (int x = 0; x < imageWidth; x++) {
+ int goldenRgb = goldenImage.getRGB(x, y);
+ int rgb = image.getRGB(x, y);
+ if (goldenRgb == rgb) {
+ deltaImage.setRGB(imageWidth + x, y, 0x00808080);
+ continue;
+ }
+
+ // If the pixels have no opacity, don't delta colors at all
+ if (((goldenRgb & 0xFF000000) == 0) && (rgb & 0xFF000000) == 0) {
+ deltaImage.setRGB(imageWidth + x, y, 0x00808080);
+ continue;
+ }
+
+ int deltaR = ((rgb & 0xFF0000) >>> 16) - ((goldenRgb & 0xFF0000) >>> 16);
+ int newR = 128 + deltaR & 0xFF;
+ int deltaG = ((rgb & 0x00FF00) >>> 8) - ((goldenRgb & 0x00FF00) >>> 8);
+ int newG = 128 + deltaG & 0xFF;
+ int deltaB = (rgb & 0x0000FF) - (goldenRgb & 0x0000FF);
+ int newB = 128 + deltaB & 0xFF;
+
+ int avgAlpha = ((((goldenRgb & 0xFF000000) >>> 24)
+ + ((rgb & 0xFF000000) >>> 24)) / 2) << 24;
+
+ int newRGB = avgAlpha | newR << 16 | newG << 8 | newB;
+ deltaImage.setRGB(imageWidth + x, y, newRGB);
+
+ delta += Math.abs(deltaR);
+ delta += Math.abs(deltaG);
+ delta += Math.abs(deltaB);
+ }
+ }
+
+ // 3 different colors, 256 color levels
+ long total = imageHeight * imageWidth * 3L * 256L;
+ float percentDifference = (float) (delta * 100 / (double) total);
+
+ String error = null;
+ String imageName = getName(relativePath);
+ if (percentDifference > maxPercentDifferent) {
+ error = String.format("Images differ (by %.1f%%)", percentDifference);
+ } else if (Math.abs(goldenImage.getWidth() - image.getWidth()) >= 2) {
+ error = "Widths differ too much for " + imageName + ": " +
+ goldenImage.getWidth() + "x" + goldenImage.getHeight() +
+ "vs" + image.getWidth() + "x" + image.getHeight();
+ } else if (Math.abs(goldenImage.getHeight() - image.getHeight()) >= 2) {
+ error = "Heights differ too much for " + imageName + ": " +
+ goldenImage.getWidth() + "x" + goldenImage.getHeight() +
+ "vs" + image.getWidth() + "x" + image.getHeight();
+ }
+
+ assertEquals(TYPE_INT_ARGB, image.getType());
+ if (error != null) {
+ // Expected on the left
+ // Golden on the right
+ g.drawImage(goldenImage, 0, 0, null);
+ g.drawImage(image, 2 * imageWidth, 0, null);
+
+ // Labels
+ if (imageWidth > 80) {
+ g.setColor(Color.RED);
+ g.drawString("Expected", 10, 20);
+ g.drawString("Actual", 2 * imageWidth + 10, 20);
+ }
+
+ File output = new File(getTempDir(), "delta-" + imageName);
+ if (output.exists()) {
+ boolean deleted = output.delete();
+ assertTrue(deleted);
+ }
+ ImageIO.write(deltaImage, "PNG", output);
+ error += " - see details in " + output.getPath() + "\n";
+ error = saveImageAndAppendMessage(image, error, relativePath);
+ System.out.println(error);
+ fail(error);
+ }
+
+ g.dispose();
+ }
+
+ /**
+ * Resize the given image
+ *
+ * @param source the image to be scaled
+ * @param xScale x scale
+ * @param yScale y scale
+ * @return the scaled image
+ */
+ @NonNull
+ public static BufferedImage scale(@NonNull BufferedImage source, double xScale, double yScale) {
+
+ int sourceWidth = source.getWidth();
+ int sourceHeight = source.getHeight();
+ int destWidth = Math.max(1, (int) (xScale * sourceWidth));
+ int destHeight = Math.max(1, (int) (yScale * sourceHeight));
+ int imageType = source.getType();
+ if (imageType == BufferedImage.TYPE_CUSTOM) {
+ imageType = BufferedImage.TYPE_INT_ARGB;
+ }
+ if (xScale > 0.5 && yScale > 0.5) {
+ BufferedImage scaled =
+ new BufferedImage(destWidth, destHeight, imageType);
+ Graphics2D g2 = scaled.createGraphics();
+ g2.setComposite(AlphaComposite.Src);
+ g2.setColor(new Color(0, true));
+ g2.fillRect(0, 0, destWidth, destHeight);
+ if (xScale == 1 && yScale == 1) {
+ g2.drawImage(source, 0, 0, null);
+ } else {
+ setRenderingHints(g2);
+ g2.drawImage(source, 0, 0, destWidth, destHeight, 0, 0, sourceWidth, sourceHeight,
+ null);
+ }
+ g2.dispose();
+ return scaled;
+ } else {
+ // When creating a thumbnail, using the above code doesn't work very well;
+ // you get some visible artifacts, especially for text. Instead use the
+ // technique of repeatedly scaling the image into half; this will cause
+ // proper averaging of neighboring pixels, and will typically (for the kinds
+ // of screen sizes used by this utility method in the layout editor) take
+ // about 3-4 iterations to get the result since we are logarithmically reducing
+ // the size. Besides, each successive pass in operating on much fewer pixels
+ // (a reduction of 4 in each pass).
+ //
+ // However, we may not be resizing to a size that can be reached exactly by
+ // successively diving in half. Therefore, once we're within a factor of 2 of
+ // the final size, we can do a resize to the exact target size.
+ // However, we can get even better results if we perform this final resize
+ // up front. Let's say we're going from width 1000 to a destination width of 85.
+ // The first approach would cause a resize from 1000 to 500 to 250 to 125, and
+ // then a resize from 125 to 85. That last resize can distort/blur a lot.
+ // Instead, we can start with the destination width, 85, and double it
+ // successfully until we're close to the initial size: 85, then 170,
+ // then 340, and finally 680. (The next one, 1360, is larger than 1000).
+ // So, now we *start* the thumbnail operation by resizing from width 1000 to
+ // width 680, which will preserve a lot of visual details such as text.
+ // Then we can successively resize the image in half, 680 to 340 to 170 to 85.
+ // We end up with the expected final size, but we've been doing an exact
+ // divide-in-half resizing operation at the end so there is less distortion.
+
+ int iterations = 0; // Number of halving operations to perform after the initial resize
+ int nearestWidth = destWidth; // Width closest to source width that = 2^x, x is integer
+ int nearestHeight = destHeight;
+ while (nearestWidth < sourceWidth / 2) {
+ nearestWidth *= 2;
+ nearestHeight *= 2;
+ iterations++;
+ }
+
+ BufferedImage scaled = new BufferedImage(nearestWidth, nearestHeight, imageType);
+
+ Graphics2D g2 = scaled.createGraphics();
+ setRenderingHints(g2);
+ g2.drawImage(source, 0, 0, nearestWidth, nearestHeight, 0, 0, sourceWidth, sourceHeight,
+ null);
+ g2.dispose();
+
+ sourceWidth = nearestWidth;
+ sourceHeight = nearestHeight;
+ source = scaled;
+
+ for (int iteration = iterations - 1; iteration >= 0; iteration--) {
+ int halfWidth = sourceWidth / 2;
+ int halfHeight = sourceHeight / 2;
+ scaled = new BufferedImage(halfWidth, halfHeight, imageType);
+ g2 = scaled.createGraphics();
+ setRenderingHints(g2);
+ g2.drawImage(source, 0, 0, halfWidth, halfHeight, 0, 0, sourceWidth, sourceHeight,
+ null);
+ g2.dispose();
+
+ sourceWidth = halfWidth;
+ sourceHeight = halfHeight;
+ source = scaled;
+ iterations--;
+ }
+ return scaled;
+ }
+ }
+
+ private static void setRenderingHints(@NonNull Graphics2D g2) {
+ g2.setRenderingHint(KEY_INTERPOLATION,VALUE_INTERPOLATION_BILINEAR);
+ g2.setRenderingHint(KEY_RENDERING, VALUE_RENDER_QUALITY);
+ g2.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
+ }
+
+ /**
+ * Temp directory where to write the thumbnails and deltas.
+ */
+ @NonNull
+ private static File getTempDir() {
+ if (System.getProperty("os.name").equals("Mac OS X")) {
+ return new File("/tmp"); //$NON-NLS-1$
+ }
+
+ return new File(System.getProperty("java.io.tmpdir")); //$NON-NLS-1$
+ }
+
+ /**
+ * Saves the generated thumbnail image and appends the info message to an initial message
+ */
+ @NonNull
+ private static String saveImageAndAppendMessage(@NonNull BufferedImage image,
+ @NonNull String initialMessage, @NonNull String relativePath) throws IOException {
+ File output = new File(getTempDir(), getName(relativePath));
+ if (output.exists()) {
+ boolean deleted = output.delete();
+ assertTrue(deleted);
+ }
+ ImageIO.write(image, "PNG", output);
+ initialMessage += "Thumbnail for current rendering stored at " + output.getPath();
+// initialMessage += "\nRun the following command to accept the changes:\n";
+// initialMessage += String.format("mv %1$s %2$s", output.getPath(),
+// ImageUtils.class.getResource(relativePath).getPath());
+ // The above has been commented out, since the destination path returned is in out dir
+ // and it makes the tests pass without the code being actually checked in.
+ return initialMessage;
+ }
+
+ private static String getName(@NonNull String relativePath) {
+ return relativePath.substring(relativePath.lastIndexOf(separatorChar) + 1);
+ }
+}
diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java
index a2588a6..a86fcdd 100644
--- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java
+++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java
@@ -39,6 +39,7 @@
import java.io.File;
import java.io.FileFilter;
+import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.Comparator;
@@ -75,7 +76,10 @@
private static final String PLATFORM_DIR;
private static final String TEST_RES_DIR;
- private static final String APP_TEST_RES = "/testApp/MyApplication/src/main/res";
+ /** Location of the app to test inside {@link #TEST_RES_DIR}*/
+ private static final String APP_TEST_DIR = "/testApp/MyApplication";
+ /** Location of the app's res dir inside {@link #TEST_RES_DIR}*/
+ private static final String APP_TEST_RES = APP_TEST_DIR + "/src/main/res";
private LayoutLog mLayoutLibLog;
private FrameworkResources mFrameworkRepo;
@@ -161,11 +165,27 @@
if (!out.isDirectory()) {
return null;
}
- File sdkDir = new File(out, "sdk" + File.separator + "sdk");
+ File sdkDir = new File(out, "sdk");
if (!sdkDir.isDirectory()) {
- // The directory we thought that should contain the sdk is not a directory.
return null;
}
+ File[] sdkDirs = sdkDir.listFiles(new FileFilter() {
+ @Override
+ public boolean accept(File path) {
+ // We need to search for $TARGET_PRODUCT (usually, sdk_phone_armv7)
+ return path.isDirectory() && path.getName().startsWith("sdk");
+ }
+ });
+ for (File dir : sdkDirs) {
+ String platformDir = getPlatformDirFromHostOutSdkSdk(dir);
+ if (platformDir != null) {
+ return platformDir;
+ }
+ }
+ return null;
+ }
+
+ private static String getPlatformDirFromHostOutSdkSdk(File sdkDir) {
File[] possibleSdks = sdkDir.listFiles(new FileFilter() {
@Override
public boolean accept(File path) {
@@ -280,6 +300,12 @@
getLogger().error(session.getResult().getException(),
session.getResult().getErrorMessage());
}
+ try {
+ String goldenImagePath = APP_TEST_DIR + "/golden/activity.png";
+ ImageUtils.requireSimilar(goldenImagePath, session.getImage());
+ } catch (IOException e) {
+ getLogger().error(e, e.getMessage());
+ }
}
/**
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 5897bd6..8f50c5d 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
@@ -20,6 +20,7 @@
import com.android.tools.layoutlib.java.AutoCloseable;
import com.android.tools.layoutlib.java.Charsets;
import com.android.tools.layoutlib.java.IntegralToString;
+import com.android.tools.layoutlib.java.LinkedHashMap_Delegate;
import com.android.tools.layoutlib.java.Objects;
import com.android.tools.layoutlib.java.System_Delegate;
import com.android.tools.layoutlib.java.UnsafeByteSequence;
@@ -133,6 +134,7 @@
UnsafeByteSequence.class,
Charsets.class,
System_Delegate.class,
+ LinkedHashMap_Delegate.class,
};
/**
@@ -152,6 +154,7 @@
"android.graphics.Typeface#getSystemFontConfigLocation",
"android.os.Handler#sendMessageAtTime",
"android.os.HandlerThread#run",
+ "android.preference.Preference#getView",
"android.text.format.DateFormat#is24HourFormat",
"android.util.Xml#newPullParser",
"android.view.Choreographer#getRefreshRate",
@@ -227,7 +230,6 @@
"android.os.SystemProperties",
"android.text.AndroidBidi",
"android.text.StaticLayout",
- "android.text.format.Time",
"android.view.Display",
"libcore.icu.DateIntervalFormat",
"libcore.icu.ICU",
@@ -272,6 +274,7 @@
private final static String[] EXCLUDED_CLASSES =
new String[] {
+ "android.preference.PreferenceActivity",
"org.kxml2.io.KXmlParser"
};
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java
index cd3c39e..fa570c8 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/Main.java
@@ -108,6 +108,7 @@
"android.graphics.drawable.*",
"android.content.*",
"android.content.res.*",
+ "android.preference.*",
"org.apache.harmony.xml.*",
"com.android.internal.R**",
"android.pim.*", // for datepicker
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ReplaceMethodCallsAdapter.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ReplaceMethodCallsAdapter.java
index 1e2623f..384d8ca 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ReplaceMethodCallsAdapter.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ReplaceMethodCallsAdapter.java
@@ -16,6 +16,7 @@
package com.android.tools.layoutlib.create;
+import com.android.tools.layoutlib.java.LinkedHashMap_Delegate;
import com.android.tools.layoutlib.java.System_Delegate;
import org.objectweb.asm.ClassVisitor;
@@ -26,8 +27,10 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
+import java.util.Map;
import java.util.Set;
/**
@@ -44,7 +47,7 @@
"([CI[CII)V", "([BI[BII)V", "([SI[SII)V", "([II[III)V",
"([JI[JII)V", "([FI[FII)V", "([DI[DII)V", "([ZI[ZII)V"));
- private static final List<MethodReplacer> METHOD_REPLACERS = new ArrayList<MethodReplacer>(2);
+ private static final List<MethodReplacer> METHOD_REPLACERS = new ArrayList<MethodReplacer>(5);
private static final String ANDROID_LOCALE_CLASS =
"com/android/layoutlib/bridge/android/AndroidLocale";
@@ -74,7 +77,8 @@
// Case 2: java.util.Locale.toLanguageTag() and java.util.Locale.getScript()
METHOD_REPLACERS.add(new MethodReplacer() {
- String LOCALE_TO_STRING = Type.getMethodDescriptor(STRING, Type.getType(Locale.class));
+ private final String LOCALE_TO_STRING =
+ Type.getMethodDescriptor(STRING, Type.getType(Locale.class));
@Override
public boolean isNeeded(String owner, String name, String desc) {
@@ -129,6 +133,30 @@
mi.owner = Type.getInternalName(System_Delegate.class);
}
});
+
+ // Case 5: java.util.LinkedHashMap.eldest()
+ METHOD_REPLACERS.add(new MethodReplacer() {
+
+ private final String VOID_TO_MAP_ENTRY =
+ Type.getMethodDescriptor(Type.getType(Map.Entry.class));
+ private final String LINKED_HASH_MAP = Type.getInternalName(LinkedHashMap.class);
+
+ @Override
+ public boolean isNeeded(String owner, String name, String desc) {
+ return LINKED_HASH_MAP.equals(owner) &&
+ "eldest".equals(name) &&
+ VOID_TO_MAP_ENTRY.equals(desc);
+ }
+
+ @Override
+ public void replace(MethodInformation mi) {
+ assert isNeeded(mi.owner, mi.name, mi.desc);
+ mi.opcode = Opcodes.INVOKESTATIC;
+ mi.owner = Type.getInternalName(LinkedHashMap_Delegate.class);
+ mi.desc = Type.getMethodDescriptor(
+ Type.getType(Map.Entry.class), Type.getType(LinkedHashMap.class));
+ }
+ });
}
public static boolean isReplacementNeeded(String owner, String name, String desc) {
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/java/LinkedHashMap_Delegate.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/java/LinkedHashMap_Delegate.java
new file mode 100644
index 0000000..59cc75f
--- /dev/null
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/java/LinkedHashMap_Delegate.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tools.layoutlib.java;
+
+import com.android.tools.layoutlib.create.ReplaceMethodCallsAdapter;
+
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+/**
+ * Provides alternate implementation to java.util.LinkedHashMap#eldest(), which is present as a
+ * non-public method in the Android VM, but not present on the host VM. This is injected in the
+ * layoutlib using {@link ReplaceMethodCallsAdapter}.
+ */
+public class LinkedHashMap_Delegate {
+ public static <K,V> Map.Entry<K,V> eldest(LinkedHashMap<K,V> map) {
+ Iterator<Entry<K, V>> iterator = map.entrySet().iterator();
+ return iterator.hasNext() ? iterator.next() : null;
+ }
+}