Merge "Fix missing clear identity in AMS.AppTaskImpl#moveToFront"
diff --git a/core/java/android/print/PrintFileDocumentAdapter.java b/core/java/android/print/PrintFileDocumentAdapter.java
index 5d655bf..747400d 100644
--- a/core/java/android/print/PrintFileDocumentAdapter.java
+++ b/core/java/android/print/PrintFileDocumentAdapter.java
@@ -46,7 +46,7 @@
*/
public class PrintFileDocumentAdapter extends PrintDocumentAdapter {
- private static final String LOG_TAG = "PrintedFileDocumentAdapter";
+ private static final String LOG_TAG = "PrintedFileDocAdapter";
private final Context mContext;
diff --git a/core/java/android/printservice/CustomPrinterIconCallback.java b/core/java/android/printservice/CustomPrinterIconCallback.java
index ea9ea8b..6b9d0d8 100644
--- a/core/java/android/printservice/CustomPrinterIconCallback.java
+++ b/core/java/android/printservice/CustomPrinterIconCallback.java
@@ -31,7 +31,7 @@
/** The printer the call back is for */
private final @NonNull PrinterId mPrinterId;
private final @NonNull IPrintServiceClient mObserver;
- private static final String LOG_TAG = "CustomPrinterIconCallback";
+ private static final String LOG_TAG = "CustomPrinterIconCB";
/**
* Create a callback class to be used once a icon is loaded
diff --git a/core/java/org/apache/http/conn/ssl/AbstractVerifier.java b/core/java/org/apache/http/conn/ssl/AbstractVerifier.java
index 66a5121..b9349b39 100644
--- a/core/java/org/apache/http/conn/ssl/AbstractVerifier.java
+++ b/core/java/org/apache/http/conn/ssl/AbstractVerifier.java
@@ -208,8 +208,8 @@
}
public static String[] getCNs(X509Certificate cert) {
- DistinguishedNameParser dnParser =
- new DistinguishedNameParser(cert.getSubjectX500Principal());
+ AndroidDistinguishedNameParser dnParser =
+ new AndroidDistinguishedNameParser(cert.getSubjectX500Principal());
List<String> cnList = dnParser.getAllMostSpecificFirst("cn");
if(!cnList.isEmpty()) {
diff --git a/core/java/org/apache/http/conn/ssl/DistinguishedNameParser.java b/core/java/org/apache/http/conn/ssl/AndroidDistinguishedNameParser.java
similarity index 99%
rename from core/java/org/apache/http/conn/ssl/DistinguishedNameParser.java
rename to core/java/org/apache/http/conn/ssl/AndroidDistinguishedNameParser.java
index b2d0e3e..4f0b726 100644
--- a/core/java/org/apache/http/conn/ssl/DistinguishedNameParser.java
+++ b/core/java/org/apache/http/conn/ssl/AndroidDistinguishedNameParser.java
@@ -29,7 +29,7 @@
* @hide
*/
@Deprecated
-final class DistinguishedNameParser {
+final class AndroidDistinguishedNameParser {
private final String dn;
private final int length;
private int pos;
@@ -42,7 +42,7 @@
/** distinguished name chars */
private char[] chars;
- public DistinguishedNameParser(X500Principal principal) {
+ public AndroidDistinguishedNameParser(X500Principal principal) {
// RFC2253 is used to ensure we get attributes in the reverse
// order of the underlying ASN.1 encoding, so that the most
// significant values of repeated attributes occur first.
diff --git a/core/res/res/layout-sw600dp/date_picker_dialog.xml b/core/res/res/layout-sw600dp/date_picker_dialog.xml
index f9b247f..f18485f 100644
--- a/core/res/res/layout-sw600dp/date_picker_dialog.xml
+++ b/core/res/res/layout-sw600dp/date_picker_dialog.xml
@@ -1,20 +1,18 @@
<?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.
-*/
+ 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.
-->
<DatePicker xmlns:android="http://schemas.android.com/apk/res/android"
@@ -23,5 +21,4 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:spinnersShown="true"
- android:calendarViewShown="true"
- />
+ android:calendarViewShown="true" />
diff --git a/core/res/res/layout/date_picker_dialog.xml b/core/res/res/layout/date_picker_dialog.xml
index db8f311..64ac1b9 100644
--- a/core/res/res/layout/date_picker_dialog.xml
+++ b/core/res/res/layout/date_picker_dialog.xml
@@ -1,20 +1,18 @@
<?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.
-*/
+ 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.
-->
<DatePicker xmlns:android="http://schemas.android.com/apk/res/android"
@@ -23,5 +21,4 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:spinnersShown="true"
- android:calendarViewShown="false"
- />
+ android:calendarViewShown="false" />
diff --git a/core/res/res/layout/date_picker_header_material.xml b/core/res/res/layout/date_picker_header_material.xml
index 821b588..cfc6d0d 100644
--- a/core/res/res/layout/date_picker_header_material.xml
+++ b/core/res/res/layout/date_picker_header_material.xml
@@ -19,35 +19,46 @@
android:id="@+id/date_picker_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingStart="?attr/dialogPreferredPadding"
- android:paddingEnd="?attr/dialogPreferredPadding"
- android:paddingTop="16dp"
- android:paddingBottom="18dp"
- android:orientation="vertical"
- android:clipToPadding="false"
- android:clipChildren="false">
+ android:orientation="vertical">
- <TextView
- android:id="@+id/date_picker_header_year"
- android:layout_width="wrap_content"
+ <ViewStub
+ android:id="@id/topPanel"
+ android:layout="@layout/alert_dialog_title_material"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:focusable="true"
- android:layout_marginStart="-8dp"
- android:layout_marginEnd="-8dp"
- android:layout_marginTop="-8dp"
- android:layout_marginBottom="-8dp"
- android:padding="8dp"
- android:background="?attr/selectableItemBackground"
- android:textAppearance="@style/TextAppearance.Material.DatePicker.YearLabel"
- android:nextFocusForward="@+id/prev" />
+ android:paddingStart="?attr/dialogPreferredPadding"
+ android:paddingEnd="?attr/dialogPreferredPadding"
+ android:paddingTop="16dp"
+ android:paddingBottom="18dp"
+ android:orientation="vertical"
+ android:clipToPadding="false"
+ android:clipChildren="false">
- <TextView
- android:id="@+id/date_picker_header_date"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="@style/TextAppearance.Material.DatePicker.DateLabel"
- android:gravity="start"
- android:maxLines="2"
- android:ellipsize="none" />
+ <TextView
+ android:id="@+id/date_picker_header_year"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:focusable="true"
+ android:layout_marginStart="-8dp"
+ android:layout_marginEnd="-8dp"
+ android:layout_marginTop="-8dp"
+ android:layout_marginBottom="-8dp"
+ android:padding="8dp"
+ android:background="?attr/selectableItemBackground"
+ android:textAppearance="@style/TextAppearance.Material.DatePicker.YearLabel"
+ android:nextFocusForward="@+id/prev" />
+ <TextView
+ android:id="@+id/date_picker_header_date"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.Material.DatePicker.DateLabel"
+ android:gravity="start"
+ android:maxLines="2"
+ android:ellipsize="none" />
+ </LinearLayout>
</LinearLayout>
diff --git a/data/fonts/fonts.xml b/data/fonts/fonts.xml
index 731bf42..961d0eb 100644
--- a/data/fonts/fonts.xml
+++ b/data/fonts/fonts.xml
@@ -341,15 +341,9 @@
<family lang="ko">
<font weight="400" style="normal" index="1">NotoSansCJK-Regular.ttc</font>
</family>
- <family>
- <font weight="400" style="normal">NanumGothic.ttf</font>
- </family>
<family lang="und-Zsye">
<font weight="400" style="normal">NotoColorEmoji.ttf</font>
</family>
- <family>
- <font weight="400" style="normal">DroidSansFallback.ttf</font>
- </family>
<!--
Tai Le and Mongolian are intentionally kept last, to make sure they don't override
the East Asian punctuation for Chinese.
diff --git a/libs/hwui/Texture.cpp b/libs/hwui/Texture.cpp
index 9fc0c19..c5000e4 100644
--- a/libs/hwui/Texture.cpp
+++ b/libs/hwui/Texture.cpp
@@ -95,28 +95,21 @@
void Texture::upload(GLint internalformat, uint32_t width, uint32_t height,
GLenum format, GLenum type, const void* pixels) {
GL_CHECKPOINT();
- bool needsAlloc = updateSize(width, height, internalformat);
- if (!needsAlloc && !pixels) {
- return;
- }
mCaches.textureState().activateTexture(0);
- GL_CHECKPOINT();
+ bool needsAlloc = updateSize(width, height, internalformat);
if (!mId) {
glGenTextures(1, &mId);
needsAlloc = true;
}
- GL_CHECKPOINT();
mCaches.textureState().bindTexture(GL_TEXTURE_2D, mId);
- GL_CHECKPOINT();
if (needsAlloc) {
glTexImage2D(GL_TEXTURE_2D, 0, mFormat, mWidth, mHeight, 0,
format, type, pixels);
- GL_CHECKPOINT();
- } else {
+ } else if (pixels) {
glTexSubImage2D(GL_TEXTURE_2D, 0, mFormat, mWidth, mHeight, 0,
format, type, pixels);
- GL_CHECKPOINT();
}
+ GL_CHECKPOINT();
}
static void uploadToTexture(bool resize, GLenum format, GLenum type, GLsizei stride, GLsizei bpp,
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java
index 13105aa..1aec253 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/SelectPrinterActivity.java
@@ -635,9 +635,9 @@
CharSequence description = printer.getDescription();
CharSequence subtitle;
- if (printServiceLabel == null) {
+ if (TextUtils.isEmpty(printServiceLabel)) {
subtitle = description;
- } else if (description == null) {
+ } else if (TextUtils.isEmpty(description)) {
subtitle = printServiceLabel;
} else {
subtitle = getString(R.string.printer_extended_description_template,
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 6ec757d..c1f97a8 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -152,6 +152,9 @@
<!-- Needed for passing extras with intent ACTION_SHOW_ADMIN_SUPPORT_DETAILS -->
<uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" />
+ <!-- TV picture-in-picture -->
+ <uses-permission android:name="android.permission.RECEIVE_MEDIA_RESOURCE_USAGE" />
+
<application
android:name=".SystemUIApplication"
android:persistent="true"
diff --git a/packages/SystemUI/res/layout/qs_customize_layout.xml b/packages/SystemUI/res/layout/qs_customize_layout.xml
index 91cf894..0b8e02f 100644
--- a/packages/SystemUI/res/layout/qs_customize_layout.xml
+++ b/packages/SystemUI/res/layout/qs_customize_layout.xml
@@ -21,14 +21,6 @@
android:layout_height="wrap_content"
android:orientation="vertical">
- <com.android.systemui.qs.QuickTileLayout
- android:id="@+id/quick_tile_layout"
- android:layout_width="match_parent"
- android:layout_height="@dimen/qs_quick_actions_height"
- android:orientation="horizontal"
- android:paddingStart="@dimen/qs_quick_actions_padding"
- android:paddingEnd="@dimen/qs_quick_actions_padding" />
-
<view
class="com.android.systemui.qs.PagedTileLayout$TilePage"
android:id="@+id/tile_page"
diff --git a/packages/SystemUI/res/values-land/config.xml b/packages/SystemUI/res/values-land/config.xml
index 43e7bac..e0affa1 100644
--- a/packages/SystemUI/res/values-land/config.xml
+++ b/packages/SystemUI/res/values-land/config.xml
@@ -38,4 +38,6 @@
while the stack is not focused. -->
<item name="recents_layout_unfocused_range_min" format="float" type="integer">-2</item>
<item name="recents_layout_unfocused_range_max" format="float" type="integer">1.5</item>
+
+ <integer name="quick_settings_num_columns">4</integer>
</resources>
diff --git a/packages/SystemUI/res/values-sw600dp-land/config.xml b/packages/SystemUI/res/values-sw600dp-land/config.xml
index f9b01c8..7e8d802 100644
--- a/packages/SystemUI/res/values-sw600dp-land/config.xml
+++ b/packages/SystemUI/res/values-sw600dp-land/config.xml
@@ -18,4 +18,6 @@
<!-- The maximum count of notifications on Keyguard. The rest will be collapsed in an overflow
card. -->
<integer name="keyguard_max_notification_count">3</integer>
+
+ <integer name="quick_settings_num_columns">3</integer>
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 3fb5f18..47eb05a 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -134,9 +134,7 @@
<dimen name="pull_span_min">25dp</dimen>
<dimen name="qs_tile_height">88dp</dimen>
- <dimen name="qs_new_tile_height">100dp</dimen>
- <dimen name="qs_quick_actions_height">88dp</dimen>
- <dimen name="qs_quick_actions_padding">25dp</dimen>
+ <dimen name="qs_tile_margin">16dp</dimen>
<dimen name="qs_quick_tile_size">48dp</dimen>
<dimen name="qs_quick_tile_padding">12dp</dimen>
<dimen name="qs_date_anim_translation">44.5dp</dimen>
diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
index 28ddf060..6bc8b50 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
@@ -62,27 +62,32 @@
@Override
public int getOffsetTop(TileRecord tile) {
- return ((ViewGroup) tile.tileView.getParent()).getTop();
+ return ((ViewGroup) tile.tileView.getParent()).getTop() + getTop();
}
@Override
public void addTile(TileRecord tile) {
mTiles.add(tile);
- distributeTiles();
+ postDistributeTiles();
}
@Override
public void removeTile(TileRecord tile) {
if (mTiles.remove(tile)) {
- distributeTiles();
+ postDistributeTiles();
}
}
+ private void postDistributeTiles() {
+ removeCallbacks(mDistribute);
+ post(mDistribute);
+ }
+
private void distributeTiles() {
if (DEBUG) Log.d(TAG, "Distributing tiles");
final int NP = mPages.size();
for (int i = 0; i < NP; i++) {
- mPages.get(i).clear();
+ mPages.get(i).removeAllViews();
}
int index = 0;
final int NT = mTiles.size();
@@ -107,10 +112,15 @@
}
@Override
- public void updateResources() {
+ public boolean updateResources() {
+ boolean changed = false;
for (int i = 0; i < mPages.size(); i++) {
- mPages.get(i).updateResources();
+ changed |= mPages.get(i).updateResources();
}
+ if (changed) {
+ distributeTiles();
+ }
+ return changed;
}
@Override
@@ -129,6 +139,13 @@
setMeasuredDimension(getMeasuredWidth(), maxHeight + mPageIndicator.getMeasuredHeight());
}
+ private final Runnable mDistribute = new Runnable() {
+ @Override
+ public void run() {
+ distributeTiles();
+ }
+ };
+
public static class TilePage extends TileLayout {
private int mMaxRows = 3;
@@ -137,21 +154,19 @@
updateResources();
}
+ @Override
+ public boolean updateResources() {
+ if (super.updateResources()) {
+ mMaxRows = mColumns != 3 ? 2 : 3;
+ return true;
+ }
+ return false;
+ }
+
public void setMaxRows(int maxRows) {
mMaxRows = maxRows;
}
- @Override
- protected int getCellHeight() {
- return mContext.getResources().getDimensionPixelSize(R.dimen.qs_new_tile_height);
- }
-
- private void clear() {
- if (DEBUG) Log.d(TAG, "Clearing page");
- removeAllViews();
- mRecords.clear();
- }
-
public boolean isFull() {
return mRecords.size() >= mColumns * mMaxRows;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index fd07e50..b5f146b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -557,8 +557,6 @@
public static final class TileRecord extends Record {
public QSTile<?> tile;
public QSTileBaseView tileView;
- public int row;
- public int col;
public boolean scanState;
public boolean openingDetail;
}
@@ -607,6 +605,6 @@
void addTile(TileRecord tile);
void removeTile(TileRecord tile);
int getOffsetTop(TileRecord tile);
- void updateResources();
+ boolean updateResources();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
index 56364e9..72629a3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
@@ -129,6 +129,10 @@
mHandler.obtainMessage(H.ADD_CALLBACK, callback).sendToTarget();
}
+ public void removeCallbacks() {
+ mHandler.sendEmptyMessage(H.REMOVE_CALLBACKS);
+ }
+
public void click() {
mHandler.sendEmptyMessage(H.CLICK);
}
@@ -188,6 +192,10 @@
handleRefreshState(null);
}
+ private void handleRemoveCallbacks() {
+ mCallbacks.clear();
+ }
+
protected void handleSecondaryClick() {
// Default to normal click.
handleClick();
@@ -285,6 +293,7 @@
private static final int SCAN_STATE_CHANGED = 9;
private static final int DESTROY = 10;
private static final int CLEAR_STATE = 11;
+ private static final int REMOVE_CALLBACKS = 12;
private H(Looper looper) {
super(looper);
@@ -296,7 +305,10 @@
try {
if (msg.what == ADD_CALLBACK) {
name = "handleAddCallback";
- handleAddCallback((QSTile.Callback)msg.obj);
+ handleAddCallback((QSTile.Callback) msg.obj);
+ } else if (msg.what == REMOVE_CALLBACKS) {
+ name = "handleRemoveCallbacks";
+ handleRemoveCallbacks();
} else if (msg.what == CLICK) {
name = "handleClick";
if (mState.disabledByPolicy) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index 5782800..b391c1e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -145,8 +145,9 @@
}
@Override
- public void updateResources() {
+ public boolean updateResources() {
// No resources here.
+ return false;
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
index ff11177..59a394f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
@@ -5,7 +5,6 @@
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
-
import com.android.systemui.R;
import com.android.systemui.qs.QSPanel.QSTileLayout;
import com.android.systemui.qs.QSPanel.TileRecord;
@@ -21,6 +20,7 @@
protected int mColumns;
private int mCellWidth;
private int mCellHeight;
+ private int mCellMargin;
protected final ArrayList<TileRecord> mRecords = new ArrayList<>();
@@ -54,52 +54,33 @@
super.removeAllViews();
}
- public void updateResources() {
+ public boolean updateResources() {
final Resources res = mContext.getResources();
final int columns = Math.max(1, res.getInteger(R.integer.quick_settings_num_columns));
- mCellHeight = getCellHeight();
- mCellWidth = (int) (mCellHeight * TILE_ASPECT);
+ mCellHeight = mContext.getResources().getDimensionPixelSize(R.dimen.qs_tile_height);
+ mCellMargin = res.getDimensionPixelSize(R.dimen.qs_tile_margin);
if (mColumns != columns) {
mColumns = columns;
postInvalidate();
+ return true;
}
- }
-
- protected int getCellHeight() {
- return mContext.getResources().getDimensionPixelSize(R.dimen.qs_tile_height);
+ return false;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ final int numTiles = mRecords.size();
final int width = MeasureSpec.getSize(widthMeasureSpec);
- int r = -1;
- int c = -1;
- int rows = 0;
- for (TileRecord record : mRecords) {
- if (record.tileView.getVisibility() == GONE) continue;
- // wrap to next column if we've reached the max # of columns
- // also don't allow dual + single tiles on the same row
- if (r == -1 || c == (mColumns - 1)) {
- r++;
- c = 0;
- } else {
- c++;
- }
- record.row = r;
- record.col = c;
- rows = r + 1;
- }
+ final int rows = (numTiles + mColumns - 1) / mColumns;
+ mCellWidth = (width - (mCellMargin * (mColumns + 1))) / mColumns;
View previousView = this;
for (TileRecord record : mRecords) {
if (record.tileView.getVisibility() == GONE) continue;
- final int cw = mCellWidth;
- final int ch = mCellHeight;
- record.tileView.measure(exactly(cw), exactly(ch));
+ record.tileView.measure(exactly(mCellWidth), exactly(mCellHeight));
previousView = record.tileView.updateAccessibilityOrder(previousView);
}
- int h = rows == 0 ? 0 : getRowTop(rows);
- setMeasuredDimension(width, h);
+ setMeasuredDimension(width, (mCellHeight + mCellMargin) * rows + mCellMargin);
}
private static int exactly(int size) {
@@ -110,37 +91,32 @@
protected void onLayout(boolean changed, int l, int t, int r, int b) {
final int w = getWidth();
boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
- for (TileRecord record : mRecords) {
- if (record.tileView.getVisibility() == GONE) continue;
- final int cols = getColumnCount(record.row);
- final int cw = mCellWidth;
- final int extra = (w - cw * cols) / (cols + 1);
- int left = record.col * cw + (record.col + 1) * extra;
- final int top = getRowTop(record.row);
+ int row = 0;
+ int column = 0;
+ for (int i = 0; i < mRecords.size(); i++, column++) {
+ if (column == mColumns) {
+ row++;
+ column -= mColumns;
+ }
+ TileRecord record = mRecords.get(i);
+ int left = getColumnStart(column);
+ final int top = getRowTop(row);
int right;
- int tileWith = record.tileView.getMeasuredWidth();
if (isRtl) {
right = w - left;
- left = right - tileWith;
+ left = right - mCellWidth;
} else {
- right = left + tileWith;
+ right = left + mCellWidth;
}
record.tileView.layout(left, top, right, top + record.tileView.getMeasuredHeight());
}
}
private int getRowTop(int row) {
- if (row <= 0) return 0;
- return row * mCellHeight;
+ return row * (mCellHeight + mCellMargin) + mCellMargin;
}
- private int getColumnCount(int row) {
- int cols = 0;
- for (TileRecord record : mRecords) {
- if (record.tileView.getVisibility() == GONE) continue;
- if (record.row == row) cols++;
- }
- return cols;
+ private int getColumnStart(int column) {
+ return column * (mCellWidth + mCellMargin) + mCellMargin;
}
-
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/NonPagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/customize/NonPagedTileLayout.java
index 3acbed8..8f0d194 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/NonPagedTileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/NonPagedTileLayout.java
@@ -31,7 +31,6 @@
import com.android.systemui.qs.QSPanel.QSTileLayout;
import com.android.systemui.qs.QSPanel.TileRecord;
import com.android.systemui.qs.QSTile;
-import com.android.systemui.qs.QuickTileLayout;
import java.util.ArrayList;
@@ -42,7 +41,6 @@
*/
public class NonPagedTileLayout extends LinearLayout implements QSTileLayout, OnTouchListener {
- private QuickTileLayout mQuickTiles;
private final ArrayList<TilePage> mPages = new ArrayList<>();
private final ArrayList<TileRecord> mTiles = new ArrayList<TileRecord>();
private CustomQSPanel mPanel;
@@ -58,8 +56,6 @@
@Override
protected void onFinishInflate() {
super.onFinishInflate();
- mQuickTiles = (QuickTileLayout) findViewById(R.id.quick_tile_layout);
- mQuickTiles.setVisibility(View.GONE);
TilePage page = (PagedTileLayout.TilePage) findViewById(R.id.tile_page);
page.setMaxRows(3 /* First page only gets 3 */);
mPages.add(page);
@@ -95,7 +91,6 @@
}
private void distributeTiles() {
- mQuickTiles.removeAllViews();
final int NP = mPages.size();
for (int i = 0; i < NP; i++) {
mPages.get(i).removeAllViews();
@@ -124,7 +119,8 @@
}
@Override
- public void updateResources() {
+ public boolean updateResources() {
+ return false;
}
@Override
@@ -133,24 +129,20 @@
case DragEvent.ACTION_DRAG_LOCATION:
float x = event.getX();
float y = event.getY();
- if (contains(mQuickTiles, x, y)) {
- // TODO: Reset to pre-drag state.
- } else {
- final int NP = mPages.size();
- for (int i = 0; i < NP; i++) {
- TilePage page = mPages.get(i);
- if (contains(page, x, y)) {
- x -= page.getLeft();
- y -= page.getTop();
- final int NC = page.getChildCount();
- for (int j = 0; j < NC; j++) {
- View child = page.getChildAt(j);
- if (contains(child, x, y)) {
- mPanel.tileSelected((QSTile<?>) child.getTag(), mCurrentClip);
- }
+ final int NP = mPages.size();
+ for (int i = 0; i < NP; i++) {
+ TilePage page = mPages.get(i);
+ if (contains(page, x, y)) {
+ x -= page.getLeft();
+ y -= page.getTop();
+ final int NC = page.getChildCount();
+ for (int j = 0; j < NC; j++) {
+ View child = page.getChildAt(j);
+ if (contains(child, x, y)) {
+ mPanel.tileSelected((QSTile<?>) child.getTag(), mCurrentClip);
}
- break;
}
+ break;
}
}
break;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
index 4a7d67f..cc4ce70 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
@@ -45,7 +45,6 @@
import com.android.systemui.statusbar.phone.PhoneStatusBar;
import com.android.systemui.statusbar.phone.QSTileHost;
import com.android.systemui.statusbar.phone.SystemUIDialog;
-import com.android.systemui.tuner.QSPagingSwitch;
import java.util.ArrayList;
@@ -145,7 +144,8 @@
private void reset() {
ArrayList<String> tiles = new ArrayList<>();
- for (String tile : QSPagingSwitch.QS_PAGE_TILES.split(",")) {
+ String defTiles = mContext.getString(R.string.quick_settings_tiles_default);
+ for (String tile : defTiles.split(",")) {
tiles.add(tile);
}
mQsPanel.setTiles(tiles);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
index a6a7143..6e22dde 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
@@ -37,13 +37,11 @@
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.TextView;
-
import com.android.systemui.R;
import com.android.systemui.qs.QSTile;
import com.android.systemui.qs.QSTile.Icon;
import com.android.systemui.qs.external.CustomTile;
import com.android.systemui.statusbar.phone.QSTileHost;
-import com.android.systemui.tuner.QSPagingSwitch;
import java.util.ArrayList;
import java.util.Collection;
@@ -74,8 +72,9 @@
}
mCurrentTiles = tileSpecs;
final TileGroup group = new TileGroup("com.android.settings", mContext);
- // TODO: Pull this list from a more authoritative place.
- String[] possibleTiles = QSPagingSwitch.QS_PAGE_TILES.split(",");
+ String possible = mContext.getString(R.string.quick_settings_tiles_default)
+ + ",user,hotspot,inversion";
+ String[] possibleTiles = possible.split(",");
for (int i = 0; i < possibleTiles.length; i++) {
final String spec = possibleTiles[i];
if (spec.startsWith("q")) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
index 29ad5d1c..7e27856 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
@@ -295,6 +295,7 @@
if (mTiles.containsKey(tileSpec)) {
QSTile<?> tile = mTiles.get(tileSpec);
if (DEBUG) Log.d(TAG, "Adding " + tile);
+ tile.removeCallbacks();
newTiles.put(tileSpec, tile);
} else {
if (DEBUG) Log.d(TAG, "Creating tile: " + tileSpec);
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/QSPagingSwitch.java b/packages/SystemUI/src/com/android/systemui/tuner/QSPagingSwitch.java
deleted file mode 100644
index d19a825..0000000
--- a/packages/SystemUI/src/com/android/systemui/tuner/QSPagingSwitch.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.android.systemui.tuner;
-
-import android.content.Context;
-import android.provider.Settings;
-import android.util.AttributeSet;
-
-import com.android.systemui.statusbar.phone.QSTileHost;
-
-public class QSPagingSwitch extends TunerSwitch {
-
- public static final String QS_PAGE_TILES =
- "dnd,cell,battery,user,rotation,flashlight,location,"
- + "hotspot,inversion,cast";
-
- public QSPagingSwitch(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- protected boolean persistBoolean(boolean value) {
- Settings.Secure.putString(getContext().getContentResolver(), QSTileHost.TILES_SETTING,
- value ? QS_PAGE_TILES : "default");
- return super.persistBoolean(value);
- }
-
-}
diff --git a/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java b/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java
index 2aac69a..3d91d62 100644
--- a/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java
@@ -29,6 +29,7 @@
import android.graphics.Rect;
import android.os.Handler;
import android.os.RemoteException;
+import android.os.UserHandle;
import android.util.Log;
import java.util.ArrayList;
@@ -37,6 +38,9 @@
import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
+import android.app.ActivityManager;
+import android.app.ActivityManager.RunningTaskInfo;
+
/**
* Manages the picture-in-picture (PIP) UI and states.
*/
@@ -46,10 +50,15 @@
private static PipManager sPipManager;
+ private static final int MAX_RUNNING_TASKS_COUNT = 10;
+
private static final int STATE_NO_PIP = 0;
private static final int STATE_PIP_OVERLAY = 1;
private static final int STATE_PIP_MENU = 2;
+ private static final int TASK_ID_NO_PIP = -1;
+ private static final int INVALID_RESOURCE_TYPE = -1;
+
private Context mContext;
private IActivityManager mActivityManager;
private int mState = STATE_NO_PIP;
@@ -58,6 +67,8 @@
private Rect mPipBound;
private Rect mMenuModePipBound;
private boolean mInitialized;
+ private int mPipTaskId = TASK_ID_NO_PIP;
+
private final Runnable mOnActivityPinnedRunnable = new Runnable() {
@Override
public void run() {
@@ -74,6 +85,7 @@
}
if (DEBUG) Log.d(TAG, "PINNED_STACK:" + stackInfo);
mState = STATE_PIP_OVERLAY;
+ mPipTaskId = stackInfo.taskIds[stackInfo.taskIds.length - 1];
launchPipOverlayActivity();
}
};
@@ -86,15 +98,27 @@
}
};
- private final BroadcastReceiver mPipButtonReceiver = new BroadcastReceiver() {
+ private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- if (DEBUG) Log.d(TAG, "PIP button pressed");
- if (!hasPipTasks()) {
- startPip();
- } else if (mState == STATE_PIP_OVERLAY) {
- showPipMenu();
+ String action = intent.getAction();
+ if (Intent.ACTION_PICTURE_IN_PICTURE_BUTTON.equals(action)) {
+ if (DEBUG) Log.d(TAG, "PIP button pressed");
+ if (!hasPipTasks()) {
+ startPip();
+ } else if (mState == STATE_PIP_OVERLAY) {
+ showPipMenu();
+ }
+ } else if (Intent.ACTION_MEDIA_RESOURCE_GRANTED.equals(action)) {
+ String[] packageNames = intent.getStringArrayExtra(Intent.EXTRA_PACKAGES);
+ int resourceType = intent.getIntExtra(Intent.EXTRA_MEDIA_RESOURCE_TYPE,
+ INVALID_RESOURCE_TYPE);
+ if (mState != STATE_NO_PIP && packageNames != null && packageNames.length > 0
+ && resourceType == Intent.EXTRA_MEDIA_RESOURCE_TYPE_VIDEO_CODEC) {
+ handleMediaResourceGranted(packageNames);
+ }
}
+
}
};
@@ -125,7 +149,8 @@
}
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_PICTURE_IN_PICTURE_BUTTON);
- mContext.registerReceiver(mPipButtonReceiver, intentFilter);
+ intentFilter.addAction(Intent.ACTION_MEDIA_RESOURCE_GRANTED);
+ mContext.registerReceiver(mBroadcastReceiver, intentFilter);
}
private void startPip() {
@@ -142,6 +167,7 @@
*/
public void closePip() {
mState = STATE_NO_PIP;
+ mPipTaskId = TASK_ID_NO_PIP;
StackInfo stackInfo = null;
try {
stackInfo = mActivityManager.getStackInfo(PINNED_STACK_ID);
@@ -166,6 +192,7 @@
*/
public void movePipToFullscreen() {
mState = STATE_NO_PIP;
+ mPipTaskId = TASK_ID_NO_PIP;
for (int i = mListeners.size() - 1; i >= 0; --i) {
mListeners.get(i).onMoveToFullscreen();
}
@@ -251,6 +278,45 @@
}
}
+ private void handleMediaResourceGranted(String[] packageNames) {
+ StackInfo fullscreenStack = null;
+ try {
+ fullscreenStack = mActivityManager.getStackInfo(FULLSCREEN_WORKSPACE_STACK_ID);
+ } catch (RemoteException e) {
+ Log.e(TAG, "getStackInfo failed", e);
+ }
+ if (fullscreenStack == null) {
+ return;
+ }
+ int fullscreenTopTaskId = fullscreenStack.taskIds[fullscreenStack.taskIds.length - 1];
+ List<RunningTaskInfo> tasks = null;
+ try {
+ tasks = mActivityManager.getTasks(MAX_RUNNING_TASKS_COUNT, 0);
+ } catch (RemoteException e) {
+ Log.e(TAG, "getTasks failed", e);
+ }
+ if (tasks == null) {
+ return;
+ }
+ boolean wasGrantedInFullscreen = false;
+ boolean wasGrantedInPip = false;
+ for (int i = tasks.size() - 1; i >= 0; --i) {
+ RunningTaskInfo task = tasks.get(i);
+ for (int j = packageNames.length - 1; j >= 0; --j) {
+ if (task.topActivity.getPackageName().equals(packageNames[j])) {
+ if (task.id == fullscreenTopTaskId) {
+ wasGrantedInFullscreen = true;
+ } else if (task.id == mPipTaskId) {
+ wasGrantedInPip= true;
+ }
+ }
+ }
+ }
+ if (wasGrantedInFullscreen && !wasGrantedInPip) {
+ closePip();
+ }
+ }
+
private class TaskStackListener extends ITaskStackListener.Stub {
@Override
public void onTaskStackChanged() throws RemoteException {