diff options
194 files changed, 5260 insertions, 953 deletions
@@ -485,6 +485,7 @@ package android { field public static final int focusable = 16842970; // 0x10100da field public static final int focusableInTouchMode = 16842971; // 0x10100db field public static final int focusedMonthDateColor = 16843587; // 0x1010343 + field public static final int fontFamily = 16843692; // 0x10103ac field public static final int footerDividersEnabled = 16843311; // 0x101022f field public static final int foreground = 16843017; // 0x1010109 field public static final int foregroundGravity = 16843264; // 0x1010200 @@ -5822,6 +5823,7 @@ package android.content { field public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000 field public static final int FLAG_ACTIVITY_CLEAR_TOP = 67108864; // 0x4000000 field public static final int FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET = 524288; // 0x80000 + field public static final int FLAG_ACTIVITY_CLOSE_SYSTEM_DIALOGS = 8192; // 0x2000 field public static final int FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS = 8388608; // 0x800000 field public static final int FLAG_ACTIVITY_FORWARD_RESULT = 33554432; // 0x2000000 field public static final int FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY = 1048576; // 0x100000 diff --git a/api/current.txt b/api/current.txt index 8402f31..1a694a8 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5823,6 +5823,7 @@ package android.content { field public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000 field public static final int FLAG_ACTIVITY_CLEAR_TOP = 67108864; // 0x4000000 field public static final int FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET = 524288; // 0x80000 + field public static final int FLAG_ACTIVITY_CLOSE_SYSTEM_DIALOGS = 8192; // 0x2000 field public static final int FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS = 8388608; // 0x800000 field public static final int FLAG_ACTIVITY_FORWARD_RESULT = 33554432; // 0x2000000 field public static final int FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY = 1048576; // 0x100000 diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index 044c0c2..ce82a98 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -59,9 +59,14 @@ import com.android.internal.os.HandlerCaller; * An accessibility is declared as any other service in an AndroidManifest.xml but it * must also specify that it handles the "android.accessibilityservice.AccessibilityService" * {@link android.content.Intent}. Failure to declare this intent will cause the system to - * ignore the accessibility service. Following is an example declaration: + * ignore the accessibility service. Additionally an accessibility service must request + * {@link android.Manifest.permission#BIND_ACCESSIBILITY_SERVICE + * android.permission.BIND_ACCESSIBILITY_SERVICE} permission to ensure that only the system + * can bind to it. Failure to declare this intent will cause the system to ignore the + * accessibility service. Following is an example declaration: * </p> - * <pre> <service android:name=".MyAccessibilityService"> + * <pre> <service android:name=".MyAccessibilityService" + * android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE> * <intent-filter> * <action android:name="android.accessibilityservice.AccessibilityService" /> * </intent-filter> diff --git a/core/java/android/accounts/ChooseTypeAndAccountActivity.java b/core/java/android/accounts/ChooseTypeAndAccountActivity.java index 136c68c..291e75e 100644 --- a/core/java/android/accounts/ChooseTypeAndAccountActivity.java +++ b/core/java/android/accounts/ChooseTypeAndAccountActivity.java @@ -119,8 +119,6 @@ public class ChooseTypeAndAccountActivity extends Activity + savedInstanceState + ")"); } - setContentView(R.layout.choose_type_and_account); - if (savedInstanceState != null) { mPendingRequest = savedInstanceState.getInt(KEY_INSTANCE_STATE_PENDING_REQUEST); mExistingAccounts = @@ -164,14 +162,29 @@ public class ChooseTypeAndAccountActivity extends Activity } } - // Read the validAccountTypes, if present, and add them to the setOfAllowableAccountTypes - Set<String> setOfAllowableAccountTypes = null; - final String[] validAccountTypes = + // An account type is relevant iff it is allowed by the caller and supported by the account + // manager. + Set<String> setOfRelevantAccountTypes = null; + final String[] allowedAccountTypes = intent.getStringArrayExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY); - if (validAccountTypes != null) { - setOfAllowableAccountTypes = new HashSet<String>(validAccountTypes.length); - for (String type : validAccountTypes) { - setOfAllowableAccountTypes.add(type); + if (allowedAccountTypes != null) { + + setOfRelevantAccountTypes = new HashSet<String>(allowedAccountTypes.length); + Set<String> setOfAllowedAccountTypes = new HashSet<String>(allowedAccountTypes.length); + for (String type : allowedAccountTypes) { + setOfAllowedAccountTypes.add(type); + } + + AuthenticatorDescription[] descs = AccountManager.get(this).getAuthenticatorTypes(); + Set<String> supportedAccountTypes = new HashSet<String>(descs.length); + for (AuthenticatorDescription desc : descs) { + supportedAccountTypes.add(desc.type); + } + + for (String acctType : setOfAllowedAccountTypes) { + if (supportedAccountTypes.contains(acctType)) { + setOfRelevantAccountTypes.add(acctType); + } } } @@ -185,8 +198,8 @@ public class ChooseTypeAndAccountActivity extends Activity && !setOfAllowableAccounts.contains(account)) { continue; } - if (setOfAllowableAccountTypes != null - && !setOfAllowableAccountTypes.contains(account.type)) { + if (setOfRelevantAccountTypes != null + && !setOfRelevantAccountTypes.contains(account.type)) { continue; } mAccountInfos.add(new AccountInfo(account, @@ -194,6 +207,29 @@ public class ChooseTypeAndAccountActivity extends Activity account.equals(selectedAccount))); } + if (mPendingRequest == REQUEST_NULL) { + // If there are no relevant accounts and only one relevant account typoe go directly to + // add account. Otherwise let the user choose. + if (mAccountInfos.isEmpty()) { + if (setOfRelevantAccountTypes.size() == 1) { + runAddAccountForAuthenticator(setOfRelevantAccountTypes.iterator().next()); + } else { + startChooseAccountTypeActivity(); + } + return; + } + + // if there is only one allowable account return it + if (!intent.getBooleanExtra(EXTRA_ALWAYS_PROMPT_FOR_ACCOUNT, false) + && mAccountInfos.size() == 1) { + Account account = mAccountInfos.get(0).account; + setResultAndFinish(account.name, account.type); + return; + } + } + + setContentView(R.layout.choose_type_and_account); + // there is more than one allowable account. initialize the list adapter to allow // the user to select an account. ListView list = (ListView) findViewById(android.R.id.list); @@ -201,6 +237,7 @@ public class ChooseTypeAndAccountActivity extends Activity android.R.layout.simple_list_item_1, mAccountInfos)); list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { onListItemClick((ListView)parent, v, position, id); } @@ -209,26 +246,11 @@ public class ChooseTypeAndAccountActivity extends Activity // set the listener for the addAccount button Button addAccountButton = (Button) findViewById(R.id.addAccount); addAccountButton.setOnClickListener(new View.OnClickListener() { + @Override public void onClick(final View v) { startChooseAccountTypeActivity(); } }); - - if (mPendingRequest == REQUEST_NULL) { - // If there are no allowable accounts go directly to add account - if (shouldSkipToChooseAccountTypeFlow()) { - startChooseAccountTypeActivity(); - return; - } - - // if there is only one allowable account return it - if (!intent.getBooleanExtra(EXTRA_ALWAYS_PROMPT_FOR_ACCOUNT, false) - && mAccountInfos.size() == 1) { - Account account = mAccountInfos.get(0).account; - setResultAndFinish(account.name, account.type); - return; - } - } } @Override @@ -267,7 +289,7 @@ public class ChooseTypeAndAccountActivity extends Activity if (resultCode == RESULT_CANCELED) { // if cancelling out of addAccount and the original state caused us to skip this, // finish this activity - if (shouldSkipToChooseAccountTypeFlow()) { + if (mAccountInfos.isEmpty()) { setResult(Activity.RESULT_CANCELED); finish(); } @@ -324,14 +346,6 @@ public class ChooseTypeAndAccountActivity extends Activity finish(); } - /** - * convenience method to check if we should skip the accounts list display and immediately - * jump to the flow that asks the user to select from the account type list - */ - private boolean shouldSkipToChooseAccountTypeFlow() { - return mAccountInfos.isEmpty(); - } - protected void runAddAccountForAuthenticator(String type) { if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "runAddAccountForAuthenticator: " + type); diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index ac55abe..69ee434 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -2713,7 +2713,16 @@ public class Activity extends ContextThemeWrapper onCreateNavigateUpTaskStack(b); onPrepareNavigateUpTaskStack(b); b.startActivities(); - finishAffinity(); + + // We can't finishAffinity if we have a result. + // Fall back and simply finish the current activity instead. + if (mResultCode != RESULT_CANCELED || mResultData != null) { + // Tell the developer what's going on to avoid hair-pulling. + Log.i(TAG, "onNavigateUp only finishing topmost activity to return a result"); + finish(); + } else { + finishAffinity(); + } } else { navigateUpTo(upIntent); } diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 0c47069..9a8d802 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -907,6 +907,8 @@ public class Notification implements Parcelable * </pre> */ public static class Builder { + private static final int MAX_ACTION_BUTTONS = 2; + private Context mContext; private long mWhen; @@ -938,7 +940,7 @@ public class Notification implements Parcelable private ArrayList<String> mKindList = new ArrayList<String>(1); private Bundle mExtras; private int mPriority; - private ArrayList<Action> mActions = new ArrayList<Action>(3); + private ArrayList<Action> mActions = new ArrayList<Action>(MAX_ACTION_BUTTONS); private boolean mUseChronometer; private Style mStyle; @@ -1460,7 +1462,7 @@ public class Notification implements Parcelable if (N > 0) { // Log.d("Notification", "has actions: " + mContentText); big.setViewVisibility(R.id.actions, View.VISIBLE); - if (N>3) N=3; + if (N>MAX_ACTION_BUTTONS) N=MAX_ACTION_BUTTONS; big.removeAllViews(R.id.actions); for (int i=0; i<N; i++) { final RemoteViews button = generateActionButton(mActions.get(i)); @@ -1500,18 +1502,14 @@ public class Notification implements Parcelable } private RemoteViews generateActionButton(Action action) { - RemoteViews button = new RemoteViews(mContext.getPackageName(), R.layout.notification_action); + final boolean tombstone = (action.actionIntent == null); + RemoteViews button = new RemoteViews(mContext.getPackageName(), + tombstone ? R.layout.notification_action_tombstone + : R.layout.notification_action); button.setTextViewCompoundDrawables(R.id.action0, action.icon, 0, 0, 0); button.setTextViewText(R.id.action0, action.title); - if (action.actionIntent != null) { + if (!tombstone) { button.setOnClickPendingIntent(R.id.action0, action.actionIntent); - //button.setBoolean(R.id.action0, "setEnabled", true); - button.setFloat(R.id.button0, "setAlpha", 1.0f); - button.setBoolean(R.id.button0, "setClickable", true); - } else { - //button.setBoolean(R.id.action0, "setEnabled", false); - button.setFloat(R.id.button0, "setAlpha", 0.5f); - button.setBoolean(R.id.button0, "setClickable", false); } button.setContentDescription(R.id.action0, action.title); return button; @@ -1639,15 +1637,21 @@ public class Notification implements Parcelable if (mBuilder.mSubText == null) { contentView.setViewVisibility(R.id.line3, View.GONE); + } else { + contentView.setViewVisibility(R.id.line3, View.VISIBLE); } if (mBigContentTitle != null && mBigContentTitle.equals("")) { contentView.setViewVisibility(R.id.line1, View.GONE); + } else { + contentView.setViewVisibility(R.id.line1, View.VISIBLE); } if (mSummaryText != null && !mSummaryText.equals("")) { contentView.setViewVisibility(R.id.overflow_title, View.VISIBLE); contentView.setTextViewText(R.id.overflow_title, mSummaryText); + } else { + contentView.setViewVisibility(R.id.overflow_title, View.GONE); } return contentView; @@ -1854,6 +1858,8 @@ public class Notification implements Parcelable if (str != null && !str.equals("")) { contentView.setViewVisibility(rowIds[i], View.VISIBLE); contentView.setTextViewText(rowIds[i], str); + } else { + contentView.setViewVisibility(rowIds[i], View.GONE); } i++; } diff --git a/core/java/android/app/TaskStackBuilder.java b/core/java/android/app/TaskStackBuilder.java index 14c5736..f21b3fd 100644 --- a/core/java/android/app/TaskStackBuilder.java +++ b/core/java/android/app/TaskStackBuilder.java @@ -161,18 +161,12 @@ public class TaskStackBuilder { ActivityInfo info = pm.getActivityInfo( new ComponentName(mSourceContext, sourceActivityClass), 0); String parentActivity = info.parentActivityName; - Intent parent = new Intent().setComponent( - new ComponentName(mSourceContext, parentActivity)); - while (parent != null) { + while (parentActivity != null) { + Intent parent = new Intent().setComponent( + new ComponentName(mSourceContext, parentActivity)); mIntents.add(insertAt, parent); info = pm.getActivityInfo(parent.getComponent(), 0); parentActivity = info.parentActivityName; - if (parentActivity != null) { - parent = new Intent().setComponent( - new ComponentName(mSourceContext, parentActivity)); - } else { - parent = null; - } } } catch (NameNotFoundException e) { Log.e(TAG, "Bad ComponentName while traversing activity parent metadata"); diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java index 01b68d4..ed95ae5 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -38,6 +38,7 @@ import android.util.SparseArray; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.Adapter; import android.widget.AdapterView; import android.widget.BaseAdapter; @@ -523,6 +524,12 @@ public class AppWidgetHostView extends FrameLayout { return tv; } + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(AppWidgetHostView.class.getName()); + } + private static class ParcelableSparseArray extends SparseArray<Parcelable> implements Parcelable { public int describeContents() { return 0; diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java index 7a8c1fb..3aa5181 100644 --- a/core/java/android/appwidget/AppWidgetManager.java +++ b/core/java/android/appwidget/AppWidgetManager.java @@ -320,6 +320,10 @@ public class AppWidgetManager { * It is okay to call this method both inside an {@link #ACTION_APPWIDGET_UPDATE} broadcast, * and outside of the handler. * This method will only work when called from the uid that owns the AppWidget provider. + * + * <p> + * The total Bitmap memory used by the RemoteViews object cannot exceed that required to + * fill the screen once, ie. (screen width x screen height x 4) bytes. * * @param appWidgetIds The AppWidget instances for which to set the RemoteViews. * @param views The RemoteViews object to show. @@ -385,6 +389,10 @@ public class AppWidgetManager { * and outside of the handler. * This method will only work when called from the uid that owns the AppWidget provider. * + * <p> + * The total Bitmap memory used by the RemoteViews object cannot exceed that required to + * fill the screen once, ie. (screen width x screen height x 4) bytes. + * * @param appWidgetId The AppWidget instance for which to set the RemoteViews. * @param views The RemoteViews object to show. */ diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index da09a18..718a917 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -808,13 +808,16 @@ public class Intent implements Parcelable, Cloneable { * always present to the user a list of the things they can do, with a * nice title given by the caller such as "Send this photo with:". * <p> + * If you need to grant URI permissions through a chooser, you must specify + * the permissions to be granted on the ACTION_CHOOSER Intent + * <em>in addition</em> to the EXTRA_INTENT inside. This means using + * {@link #setClipData} to specify the URIs to be granted as well as + * {@link #FLAG_GRANT_READ_URI_PERMISSION} and/or + * {@link #FLAG_GRANT_WRITE_URI_PERMISSION} as appropriate. + * <p> * As a convenience, an Intent of this form can be created with the * {@link #createChooser} function. * <p> - * If the target {@link #EXTRA_INTENT} contains {@link ClipData}, you should - * also copy it to this intent along with relevant flags, such as - * {@link #FLAG_GRANT_READ_URI_PERMISSION}. - * <p> * Input: No data should be specified. get*Extra must have * a {@link #EXTRA_INTENT} field containing the Intent being executed, * and can optionally have a {@link #EXTRA_TITLE} field containing the @@ -828,6 +831,14 @@ public class Intent implements Parcelable, Cloneable { /** * Convenience function for creating a {@link #ACTION_CHOOSER} Intent. * + * <p>Builds a new {@link #ACTION_CHOOSER} Intent that wraps the given + * target intent, also optionally supplying a title. If the target + * intent has specified {@link #FLAG_GRANT_READ_URI_PERMISSION} or + * {@link #FLAG_GRANT_WRITE_URI_PERMISSION}, then these flags will also be + * set in the returned chooser intent, with its ClipData set appropriately: + * either a direct reflection of {@link #getClipData()} if that is non-null, + * or a new ClipData build from {@link #getData()}. + * * @param target The Intent that the user will be selecting an activity * to perform. * @param title Optional title that will be displayed in the chooser. @@ -843,12 +854,26 @@ public class Intent implements Parcelable, Cloneable { } // Migrate any clip data and flags from target. - final ClipData targetClipData = target.getClipData(); - if (targetClipData != null) { - intent.setClipData(targetClipData); - intent.addFlags(target.getFlags() - & (FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION)); + int permFlags = target.getFlags() + & (FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); + if (permFlags != 0) { + ClipData targetClipData = target.getClipData(); + if (targetClipData == null && target.getData() != null) { + ClipData.Item item = new ClipData.Item(target.getData()); + String[] mimeTypes; + if (target.getType() != null) { + mimeTypes = new String[] { target.getType() }; + } else { + mimeTypes = new String[] { }; + } + targetClipData = new ClipData(null, mimeTypes, item); + } + if (targetClipData != null) { + intent.setClipData(targetClipData); + intent.addFlags(permFlags); + } } + return intent; } @@ -3078,6 +3103,17 @@ public class Intent implements Parcelable, Cloneable { */ public static final int FLAG_ACTIVITY_TASK_ON_HOME = 0X00004000; /** + * If set in an Intent passed to {@link Context#startActivity Context.startActivity()}, + * upon starting the activity the system will also clear any system dialogs that + * are currently shown. This is intended primarily for any actions that are + * associated with buttons in a notification: tapping on the button to launch + * the activity needs to also dismiss the notification window (which is one + * of the system dialogs); setting this flag on the Intent associated with that + * action will ensure that and other system dialogs are dismissed so that the + * user arrives in the new activity. + */ + public static final int FLAG_ACTIVITY_CLOSE_SYSTEM_DIALOGS = 0X00002000; + /** * If set, when sending a broadcast only registered receivers will be * called -- no BroadcastReceiver components will be launched. */ diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java index aeb46cf..b8ad818 100644 --- a/core/java/android/hardware/SensorManager.java +++ b/core/java/android/hardware/SensorManager.java @@ -1122,9 +1122,9 @@ public abstract class SensorManager { /** Helper function to compute the angle change between two rotation matrices. * Given a current rotation matrix (R) and a previous rotation matrix - * (prevR) computes the rotation around the x,y, and z axes which + * (prevR) computes the rotation around the z,x, and y axes which * transforms prevR to R. - * outputs a 3 element vector containing the x,y, and z angle + * outputs a 3 element vector containing the z,x, and y angle * change at indexes 0, 1, and 2 respectively. * <p> Each input matrix is either as a 3x3 or 4x4 row-major matrix * depending on the length of the passed array: @@ -1143,14 +1143,13 @@ public abstract class SensorManager { *</pre> * @param R current rotation matrix * @param prevR previous rotation matrix - * @param angleChange an array of floats in which the angle change is stored + * @param angleChange an an array of floats (z, x, and y) in which the angle change is stored */ public static void getAngleChange( float[] angleChange, float[] R, float[] prevR) { float rd1=0,rd4=0, rd6=0,rd7=0, rd8=0; float ri0=0,ri1=0,ri2=0,ri3=0,ri4=0,ri5=0,ri6=0,ri7=0,ri8=0; float pri0=0, pri1=0, pri2=0, pri3=0, pri4=0, pri5=0, pri6=0, pri7=0, pri8=0; - int i, j, k; if(R.length == 9) { ri0 = R[0]; diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java index c0240fe..d2050b7 100644 --- a/core/java/android/os/Trace.java +++ b/core/java/android/os/Trace.java @@ -43,7 +43,7 @@ public final class Trace { public static final int TRACE_FLAGS_START_BIT = 1; public static final String[] TRACE_TAGS = { "Graphics", "Input", "View", "WebView", "Window Manager", - "Activity Manager", "Sync Manager", "Audio" + "Activity Manager", "Sync Manager", "Audio", "Video", }; public static final String PROPERTY_TRACE_TAG_ENABLEFLAGS = "debug.atrace.tags.enableflags"; diff --git a/core/java/android/preference/MultiSelectListPreference.java b/core/java/android/preference/MultiSelectListPreference.java index 2e8d551..553ce80 100644 --- a/core/java/android/preference/MultiSelectListPreference.java +++ b/core/java/android/preference/MultiSelectListPreference.java @@ -125,8 +125,9 @@ public class MultiSelectListPreference extends DialogPreference { * @param values The values to set for the key. */ public void setValues(Set<String> values) { - mValues = values; - + mValues.clear(); + mValues.addAll(values); + persistStringSet(values); } diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java index 09bf42b..1ef0916 100644 --- a/core/java/android/provider/CalendarContract.java +++ b/core/java/android/provider/CalendarContract.java @@ -105,6 +105,17 @@ public final class CalendarContract { * and it should call {@link Activity#setResult(int)} with * {@link Activity#RESULT_OK} or {@link Activity#RESULT_CANCELED} to * acknowledge whether the action was handled or not. + * + * The custom app should have an intent-filter like the following + * <pre> + * {@code + * <intent-filter> + * <action android:name="android.provider.calendar.action.HANDLE_CUSTOM_EVENT" /> + * <category android:name="android.intent.category.DEFAULT" /> + * <data android:mimeType="vnd.android.cursor.item/event" /> + * </intent-filter> + * } + * </pre> * <p> * Input: {@link Intent#getData} has the event URI. The extra * {@link #EXTRA_EVENT_BEGIN_TIME} has the start time of the instance. The diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java index 16f9a18..6dc31dd 100644 --- a/core/java/android/view/AccessibilityInteractionController.java +++ b/core/java/android/view/AccessibilityInteractionController.java @@ -29,7 +29,6 @@ import android.util.Poolable; import android.util.PoolableManager; import android.util.Pools; import android.util.SparseLongArray; -import android.view.ViewGroup.ChildListForAccessibility; import android.view.accessibility.AccessibilityInteractionClient; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeProvider; @@ -623,6 +622,8 @@ final class AccessibilityInteractionController { private static final int MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE = 50; + private final ArrayList<View> mTempViewList = new ArrayList<View>(); + public void prefetchAccessibilityNodeInfos(View view, int virtualViewId, int prefetchFlags, List<AccessibilityNodeInfo> outInfos) { AccessibilityNodeProvider provider = view.getAccessibilityNodeProvider(); @@ -663,8 +664,6 @@ final class AccessibilityInteractionController { while (parent instanceof View && outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) { View parentView = (View) parent; - final long parentNodeId = AccessibilityNodeInfo.makeNodeId( - parentView.getAccessibilityViewId(), AccessibilityNodeInfo.UNDEFINED); AccessibilityNodeInfo info = parentView.createAccessibilityNodeInfo(); if (info != null) { outInfos.add(info); @@ -678,19 +677,21 @@ final class AccessibilityInteractionController { ViewParent parent = current.getParentForAccessibility(); if (parent instanceof ViewGroup) { ViewGroup parentGroup = (ViewGroup) parent; - ChildListForAccessibility children = ChildListForAccessibility.obtain(parentGroup, - false); + ArrayList<View> children = mTempViewList; + children.clear(); try { - final int childCount = children.getChildCount(); + parentGroup.addChildrenForAccessibility(children); + final int childCount = children.size(); for (int i = 0; i < childCount; i++) { if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) { return; } - View child = children.getChildAt(i); + View child = children.get(i); if (child.getAccessibilityViewId() != current.getAccessibilityViewId() && isShown(child)) { AccessibilityNodeInfo info = null; - AccessibilityNodeProvider provider = child.getAccessibilityNodeProvider(); + AccessibilityNodeProvider provider = + child.getAccessibilityNodeProvider(); if (provider == null) { info = child.createAccessibilityNodeInfo(); } else { @@ -703,7 +704,7 @@ final class AccessibilityInteractionController { } } } finally { - children.recycle(); + children.clear(); } } } @@ -716,14 +717,16 @@ final class AccessibilityInteractionController { ViewGroup rootGroup = (ViewGroup) root; HashMap<View, AccessibilityNodeInfo> addedChildren = new HashMap<View, AccessibilityNodeInfo>(); - ChildListForAccessibility children = ChildListForAccessibility.obtain(rootGroup, false); + ArrayList<View> children = mTempViewList; + children.clear(); try { - final int childCount = children.getChildCount(); + root.addChildrenForAccessibility(children); + final int childCount = children.size(); for (int i = 0; i < childCount; i++) { if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) { return; } - View child = children.getChildAt(i); + View child = children.get(i); if (isShown(child)) { AccessibilityNodeProvider provider = child.getAccessibilityNodeProvider(); if (provider == null) { @@ -743,7 +746,7 @@ final class AccessibilityInteractionController { } } } finally { - children.recycle(); + children.clear(); } if (outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) { for (Map.Entry<View, AccessibilityNodeInfo> entry : addedChildren.entrySet()) { diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java index 825f351..183cb88 100644 --- a/core/java/android/view/Choreographer.java +++ b/core/java/android/view/Choreographer.java @@ -491,14 +491,32 @@ public final class Choreographer { } } - private final class FrameDisplayEventReceiver extends DisplayEventReceiver { + private final class FrameDisplayEventReceiver extends DisplayEventReceiver + implements Runnable { + private long mTimestampNanos; + private int mFrame; + public FrameDisplayEventReceiver(Looper looper) { super(looper); } @Override public void onVsync(long timestampNanos, int frame) { - doFrame(timestampNanos, frame); + // Post the vsync event to the Handler. + // The idea is to prevent incoming vsync events from completely starving + // the message queue. If there are no messages in the queue with timestamps + // earlier than the frame time, then the vsync event will be processed immediately. + // Otherwise, messages that predate the vsync event will be handled first. + mTimestampNanos = timestampNanos; + mFrame = frame; + Message msg = Message.obtain(mHandler, this); + msg.setAsynchronous(true); + mHandler.sendMessageAtTime(msg, timestampNanos / NANOS_PER_MS); + } + + @Override + public void run() { + doFrame(mTimestampNanos, mFrame); } } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index f698e57..62c267f 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -6159,7 +6159,8 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal ViewRootImpl viewRootImpl = getViewRootImpl(); if (viewRootImpl != null) { View focusHost = viewRootImpl.getAccessibilityFocusedHost(); - if (focusHost != null && ViewRootImpl.isViewDescendantOf(focusHost, this)) { + if (focusHost != null && focusHost != this + && ViewRootImpl.isViewDescendantOf(focusHost, this)) { viewRootImpl.setAccessibilityFocusedHost(null); } } @@ -6637,7 +6638,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal private boolean nextAtGranularity(int granularity) { CharSequence text = getIterableTextForAccessibility(); - if (text != null && text.length() > 0) { + if (text == null || text.length() == 0) { return false; } TextSegmentIterator iterator = getIteratorForGranularity(granularity); @@ -6661,7 +6662,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal private boolean previousAtGranularity(int granularity) { CharSequence text = getIterableTextForAccessibility(); - if (text != null && text.length() > 0) { + if (text == null || text.length() == 0) { return false; } TextSegmentIterator iterator = getIteratorForGranularity(granularity); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 41cd887..d9e3545 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1076,7 +1076,7 @@ public final class ViewRootImpl implements ViewParent, if (baseSize != 0 && desiredWindowWidth > baseSize) { childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width); childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height); - host.measure(childWidthMeasureSpec, childHeightMeasureSpec); + performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": measured (" + host.getMeasuredWidth() + "," + host.getMeasuredHeight() + ")"); if ((host.getMeasuredWidthAndState()&View.MEASURED_STATE_TOO_SMALL) == 0) { @@ -1087,7 +1087,7 @@ public final class ViewRootImpl implements ViewParent, if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": next baseSize=" + baseSize); childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width); - host.measure(childWidthMeasureSpec, childHeightMeasureSpec); + performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": measured (" + host.getMeasuredWidth() + "," + host.getMeasuredHeight() + ")"); if ((host.getMeasuredWidthAndState()&View.MEASURED_STATE_TOO_SMALL) == 0) { @@ -1101,7 +1101,7 @@ public final class ViewRootImpl implements ViewParent, if (!goodMeasure) { childWidthMeasureSpec = getRootMeasureSpec(desiredWindowWidth, lp.width); childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height); - host.measure(childWidthMeasureSpec, childHeightMeasureSpec); + performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); if (mWidth != host.getMeasuredWidth() || mHeight != host.getMeasuredHeight()) { windowSizeMayChange = true; } @@ -1650,7 +1650,7 @@ public final class ViewRootImpl implements ViewParent, + " coveredInsetsChanged=" + contentInsetsChanged); // Ask host how big it wants to be - host.measure(childWidthMeasureSpec, childHeightMeasureSpec); + performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); // Implementation of weights from WindowManager.LayoutParams // We just grow the dimensions as needed and re-measure if @@ -1676,7 +1676,7 @@ public final class ViewRootImpl implements ViewParent, if (DEBUG_LAYOUT) Log.v(TAG, "And hey let's measure once more: width=" + width + " height=" + height); - host.measure(childWidthMeasureSpec, childHeightMeasureSpec); + performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); } layoutRequested = true; @@ -1688,28 +1688,7 @@ public final class ViewRootImpl implements ViewParent, boolean triggerGlobalLayoutListener = didLayout || attachInfo.mRecomputeGlobalAttributes; if (didLayout) { - mLayoutRequested = false; - mScrollMayChange = true; - if (DEBUG_ORIENTATION || DEBUG_LAYOUT) Log.v( - TAG, "Laying out " + host + " to (" + - host.getMeasuredWidth() + ", " + host.getMeasuredHeight() + ")"); - long startTime = 0L; - if (ViewDebug.DEBUG_PROFILE_LAYOUT) { - startTime = SystemClock.elapsedRealtime(); - } - host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight()); - - if (false && ViewDebug.consistencyCheckEnabled) { - if (!host.dispatchConsistencyCheck(ViewDebug.CONSISTENCY_LAYOUT)) { - throw new IllegalStateException("The view hierarchy is an inconsistent state," - + "please refer to the logs with the tag " - + ViewDebug.CONSISTENCY_LOG_TAG + " for more infomation."); - } - } - - if (ViewDebug.DEBUG_PROFILE_LAYOUT) { - EventLog.writeEvent(60001, SystemClock.elapsedRealtime() - startTime); - } + performLayout(); // By this point all views have been sized and positionned // We can compute the transparent area @@ -1867,6 +1846,49 @@ public final class ViewRootImpl implements ViewParent, } } + private void performMeasure(int childWidthMeasureSpec, int childHeightMeasureSpec) { + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "measure"); + try { + mView.measure(childWidthMeasureSpec, childHeightMeasureSpec); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } + } + + private void performLayout() { + mLayoutRequested = false; + mScrollMayChange = true; + + final View host = mView; + if (DEBUG_ORIENTATION || DEBUG_LAYOUT) { + Log.v(TAG, "Laying out " + host + " to (" + + host.getMeasuredWidth() + ", " + host.getMeasuredHeight() + ")"); + } + + final long startTime; + if (ViewDebug.DEBUG_PROFILE_LAYOUT) { + startTime = SystemClock.elapsedRealtime(); + } + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "layout"); + try { + host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight()); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } + + if (ViewDebug.DEBUG_PROFILE_LAYOUT) { + EventLog.writeEvent(60001, SystemClock.elapsedRealtime() - startTime); + } + + if (false && ViewDebug.consistencyCheckEnabled) { + if (!host.dispatchConsistencyCheck(ViewDebug.CONSISTENCY_LAYOUT)) { + throw new IllegalStateException("The view hierarchy is an inconsistent state," + + "please refer to the logs with the tag " + + ViewDebug.CONSISTENCY_LOG_TAG + " for more infomation."); + } + } + } + public void requestTransparentRegion(View child) { // the test below should not fail unless someone is messing with us checkThread(); @@ -2183,6 +2205,18 @@ public final class ViewRootImpl implements ViewParent, private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int yoff, boolean scalingRequired, Rect dirty) { + // If we get here with a disabled & requested hardware renderer, something went + // wrong (an invalidate posted right before we destroyed the hardware surface + // for instance) so we should just bail out. Locking the surface with software + // rendering at this point would lock it forever and prevent hardware renderer + // from doing its job when it comes back. + if (attachInfo.mHardwareRenderer != null && !attachInfo.mHardwareRenderer.isEnabled() && + attachInfo.mHardwareRenderer.isRequested()) { + mFullRedrawNeeded = true; + scheduleTraversals(); + return false; + } + // Draw with software renderer. Canvas canvas; try { @@ -4435,6 +4469,7 @@ public final class ViewRootImpl implements ViewParent, for (int i = 0; i < viewCount; i++) { mTempViews[i].invalidate(); + mTempViews[i] = null; } for (int i = 0; i < viewRectCount; i++) { diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java index bd341d0..20b5f17 100644 --- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java +++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java @@ -19,6 +19,7 @@ package android.view.accessibility; import android.accessibilityservice.IAccessibilityServiceConnection; import android.graphics.Rect; import android.os.Binder; +import android.os.Build; import android.os.Bundle; import android.os.Message; import android.os.Process; @@ -27,10 +28,14 @@ import android.os.SystemClock; import android.util.Log; import android.util.LongSparseArray; import android.util.SparseArray; +import android.util.SparseLongArray; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedList; import java.util.List; +import java.util.Queue; import java.util.concurrent.atomic.AtomicInteger; /** @@ -74,6 +79,8 @@ public final class AccessibilityInteractionClient private static final boolean DEBUG = false; + private static final boolean CHECK_INTEGRITY = true; + private static final long TIMEOUT_INTERACTION_MILLIS = 5000; private static final Object sStaticLock = new Object(); @@ -491,6 +498,9 @@ public final class AccessibilityInteractionClient result = Collections.emptyList(); } clearResultLocked(); + if (Build.IS_DEBUGGABLE && CHECK_INTEGRITY) { + checkFindAccessibilityNodeInfoResultIntegrity(result); + } return result; } } @@ -696,4 +706,56 @@ public final class AccessibilityInteractionClient sConnectionCache.remove(connectionId); } } + + /** + * Checks whether the infos are a fully connected tree with no duplicates. + * + * @param infos The result list to check. + */ + private void checkFindAccessibilityNodeInfoResultIntegrity(List<AccessibilityNodeInfo> infos) { + if (infos.size() == 0) { + return; + } + // Find the root node. + AccessibilityNodeInfo root = infos.get(0); + final int infoCount = infos.size(); + for (int i = 1; i < infoCount; i++) { + for (int j = i; j < infoCount; j++) { + AccessibilityNodeInfo candidate = infos.get(j); + if (root.getParentNodeId() == candidate.getSourceNodeId()) { + root = candidate; + break; + } + } + } + if (root == null) { + Log.e(LOG_TAG, "No root."); + } + // Check for duplicates. + HashSet<AccessibilityNodeInfo> seen = new HashSet<AccessibilityNodeInfo>(); + Queue<AccessibilityNodeInfo> fringe = new LinkedList<AccessibilityNodeInfo>(); + fringe.add(root); + while (!fringe.isEmpty()) { + AccessibilityNodeInfo current = fringe.poll(); + if (!seen.add(current)) { + Log.e(LOG_TAG, "Duplicate node."); + return; + } + SparseLongArray childIds = current.getChildNodeIds(); + final int childCount = childIds.size(); + for (int i = 0; i < childCount; i++) { + final long childId = childIds.valueAt(i); + for (int j = 0; j < infoCount; j++) { + AccessibilityNodeInfo child = infos.get(j); + if (child.getSourceNodeId() == childId) { + fringe.add(child); + } + } + } + } + final int disconnectedCount = infos.size() - seen.size(); + if (disconnectedCount > 0) { + Log.e(LOG_TAG, disconnectedCount + " Disconnected nodes."); + } + } } diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfoCache.java b/core/java/android/view/accessibility/AccessibilityNodeInfoCache.java index 52b7772..14954be 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfoCache.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfoCache.java @@ -244,7 +244,7 @@ public class AccessibilityNodeInfoCache { /** * We are enforcing the invariant for a single accessibility focus. * - * @param currentInputFocusId The current input focused node. + * @param currentAccessibilityFocusId The current input focused node. */ private void clearSubtreeWithOldAccessibilityFocusLocked(long currentAccessibilityFocusId) { final int cacheSize = mCacheImpl.size(); diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java index 5d42da1..7786564 100644 --- a/core/java/android/webkit/WebViewClassic.java +++ b/core/java/android/webkit/WebViewClassic.java @@ -934,7 +934,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc private static final int RELEASE_SINGLE_TAP = 5; private static final int REQUEST_FORM_DATA = 6; private static final int DRAG_HELD_MOTIONLESS = 8; - private static final int AWAKEN_SCROLL_BARS = 9; private static final int PREVENT_DEFAULT_TIMEOUT = 10; private static final int SCROLL_SELECT_TEXT = 11; @@ -1002,7 +1001,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc "REQUEST_FORM_DATA", // = 6; "RESUME_WEBCORE_PRIORITY", // = 7; "DRAG_HELD_MOTIONLESS", // = 8; - "AWAKEN_SCROLL_BARS", // = 9; + "", // = 9; "PREVENT_DEFAULT_TIMEOUT", // = 10; "SCROLL_SELECT_TEXT" // = 11; }; @@ -1598,8 +1597,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc private void init() { OnTrimMemoryListener.init(mContext); mWebView.setWillNotDraw(false); - mWebView.setFocusable(true); - mWebView.setFocusableInTouchMode(true); mWebView.setClickable(true); mWebView.setLongClickable(true); @@ -1716,6 +1713,10 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc mZoomManager.updateDefaultZoomDensity(density); } + /* package */ int getScaledNavSlop() { + return viewToContentDimension(mNavSlop); + } + /* package */ boolean onSavePassword(String schemePlusHost, String username, String password, final Message resumeMsg) { boolean rVal = false; @@ -2939,6 +2940,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc // premature data from webkit, ignore if ((w | h) == 0) { + invalidate(); return; } @@ -2951,10 +2953,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc // updated when we get out of that mode. if (!mDrawHistory) { // repin our scroll, taking into account the new content size - if (updateScrollCoordinates(pinLocX(getScrollX()), - pinLocY(getScrollY()))) { - invalidate(); - } + updateScrollCoordinates(pinLocX(getScrollX()), pinLocY(getScrollY())); if (!mScroller.isFinished()) { // We are in the middle of a scroll. Repin the final scroll // position. @@ -2962,6 +2961,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc mScroller.setFinalY(pinLocY(mScroller.getFinalY())); } } + invalidate(); } contentSizeChanged(updateLayout); } @@ -3772,7 +3772,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc // Log.d(LOGTAG, "startScroll: " + dx + " " + dy); mScroller.startScroll(getScrollX(), getScrollY(), dx, dy, animationDuration > 0 ? animationDuration : computeDuration(dx, dy)); - mWebViewPrivate.awakenScrollBars(mScroller.getDuration()); invalidate(); } else { mWebView.scrollTo(x, y); @@ -4155,15 +4154,11 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc if (mTouchMode == TOUCH_DRAG_MODE) { if (mHeldMotionless == MOTIONLESS_PENDING) { mPrivateHandler.removeMessages(DRAG_HELD_MOTIONLESS); - mPrivateHandler.removeMessages(AWAKEN_SCROLL_BARS); mHeldMotionless = MOTIONLESS_FALSE; } if (mHeldMotionless == MOTIONLESS_FALSE) { mPrivateHandler.sendMessageDelayed(mPrivateHandler .obtainMessage(DRAG_HELD_MOTIONLESS), MOTIONLESS_TIME); - mPrivateHandler.sendMessageDelayed(mPrivateHandler - .obtainMessage(AWAKEN_SCROLL_BARS), - ViewConfiguration.getScrollDefaultDelay()); mHeldMotionless = MOTIONLESS_PENDING; } } @@ -4339,10 +4334,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc } private void removeTouchHighlight() { - if (mWebViewCore != null) { - mWebViewCore.removeMessages(EventHub.HIT_TEST); - } - mPrivateHandler.removeMessages(HIT_TEST_RESULT); setTouchHighlightRects(null); } @@ -5768,14 +5759,15 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc return false; } - if (!mWebView.isFocused()) { - mWebView.requestFocus(); - } - if (mInputDispatcher == null) { return false; } + if (mWebView.isFocusable() && mWebView.isFocusableInTouchMode() + && !mWebView.isFocused()) { + mWebView.requestFocus(); + } + if (mInputDispatcher.postPointerEvent(ev, getScrollX(), getScrollY() - getTitleHeight(), mZoomManager.getInvScale())) { mInputDispatcher.dispatchUiEvents(); @@ -5817,7 +5809,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc switch (action) { case MotionEvent.ACTION_DOWN: { mConfirmMove = false; - mInitialHitTestResult = null; if (!mEditTextScroller.isFinished()) { mEditTextScroller.abortAnimation(); } @@ -5839,23 +5830,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc } } else { // the normal case mTouchMode = TOUCH_INIT_MODE; - // TODO: Have WebViewInputDispatch handle this - TouchHighlightData data = new TouchHighlightData(); - data.mX = contentX; - data.mY = contentY; - data.mNativeLayerRect = new Rect(); - if (mNativeClass != 0) { - data.mNativeLayer = nativeScrollableLayer(mNativeClass, - contentX, contentY, data.mNativeLayerRect, null); - } else { - data.mNativeLayer = 0; - } - data.mSlop = viewToContentDimension(mNavSlop); - removeTouchHighlight(); - if (!mBlockWebkitViewMessages && mWebViewCore != null) { - mWebViewCore.sendMessageAtFrontOfQueue( - EventHub.HIT_TEST, data); - } if (mLogEvent && eventTime - mLastTouchUpTime < 1000) { EventLog.writeEvent(EventLogTags.BROWSER_DOUBLE_TAP_DURATION, (eventTime - mLastTouchUpTime), eventTime); @@ -6067,27 +6041,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc } } - // Turn off scrollbars when dragging a layer. - if (keepScrollBarsVisible && - mTouchMode != TOUCH_DRAG_LAYER_MODE && - mTouchMode != TOUCH_DRAG_TEXT_MODE) { - if (mHeldMotionless != MOTIONLESS_TRUE) { - mHeldMotionless = MOTIONLESS_TRUE; - invalidate(); - } - // keep the scrollbar on the screen even there is no scroll - mWebViewPrivate.awakenScrollBars(ViewConfiguration.getScrollDefaultDelay(), - false); - // Post a message so that we'll keep them alive while we're not scrolling. - mPrivateHandler.sendMessageDelayed(mPrivateHandler - .obtainMessage(AWAKEN_SCROLL_BARS), - ViewConfiguration.getScrollDefaultDelay()); - // return false to indicate that we can't pan out of the - // view space - return; - } else { - mPrivateHandler.removeMessages(AWAKEN_SCROLL_BARS); - } break; } case MotionEvent.ACTION_UP: { @@ -6135,7 +6088,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc case TOUCH_DRAG_LAYER_MODE: case TOUCH_DRAG_TEXT_MODE: mPrivateHandler.removeMessages(DRAG_HELD_MOTIONLESS); - mPrivateHandler.removeMessages(AWAKEN_SCROLL_BARS); // if the user waits a while w/o moving before the // up, we don't want to do a fling if (eventTime - mLastTouchTime <= MIN_FLING_TIME) { @@ -6401,7 +6353,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc mPrivateHandler.removeMessages(SWITCH_TO_SHORTPRESS); mPrivateHandler.removeMessages(SWITCH_TO_LONGPRESS); mPrivateHandler.removeMessages(DRAG_HELD_MOTIONLESS); - mPrivateHandler.removeMessages(AWAKEN_SCROLL_BARS); removeTouchHighlight(); mHeldMotionless = MOTIONLESS_TRUE; mTouchMode = TOUCH_DONE_MODE; @@ -6833,17 +6784,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc // no horizontal overscroll if the content just fits mScroller.fling(scrollX, scrollY, -vx, -vy, 0, maxX, 0, maxY, maxX == 0 ? 0 : overflingDistance, overflingDistance); - // Duration is calculated based on velocity. With range boundaries and overscroll - // we may not know how long the final animation will take. (Hence the deprecation - // warning on the call below.) It's not a big deal for scroll bars but if webcore - // resumes during this effect we will take a performance hit. See computeScroll; - // we resume webcore there when the animation is finished. - final int time = mScroller.getDuration(); - - // Suppress scrollbars for layer scrolling. - if (mTouchMode != TOUCH_DRAG_LAYER_MODE && mTouchMode != TOUCH_DRAG_TEXT_MODE) { - mWebViewPrivate.awakenScrollBars(time); - } invalidate(); } @@ -7381,17 +7321,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc case DRAG_HELD_MOTIONLESS: mHeldMotionless = MOTIONLESS_TRUE; invalidate(); - // fall through to keep scrollbars awake - - case AWAKEN_SCROLL_BARS: - if (mTouchMode == TOUCH_DRAG_MODE - && mHeldMotionless == MOTIONLESS_TRUE) { - mWebViewPrivate.awakenScrollBars(ViewConfiguration - .getScrollDefaultDelay(), false); - mPrivateHandler.sendMessageDelayed(mPrivateHandler - .obtainMessage(AWAKEN_SCROLL_BARS), - ViewConfiguration.getScrollDefaultDelay()); - } break; case SCREEN_ON: @@ -7956,7 +7885,8 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc } // update the zoom information based on the new picture - mZoomManager.onNewPicture(draw); + if (mZoomManager.onNewPicture(draw)) + invalidate(); if (isPictureAfterFirstLayout) { mViewManager.postReadyToDrawAll(); diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 7aa9a0b..76cd1c9 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -1143,8 +1143,6 @@ public final class WebViewCore { static final int ADD_PACKAGE_NAME = 185; static final int REMOVE_PACKAGE_NAME = 186; - static final int HIT_TEST = 187; - // accessibility support static final int MODIFY_SELECTION = 190; @@ -1648,18 +1646,6 @@ public final class WebViewCore { (Set<String>) msg.obj); break; - case HIT_TEST: - TouchHighlightData d = (TouchHighlightData) msg.obj; - if (d.mNativeLayer != 0) { - nativeScrollLayer(mNativeClass, - d.mNativeLayer, d.mNativeLayerRect); - } - WebKitHitTest hit = performHitTest(d.mX, d.mY, d.mSlop, true); - mWebViewClassic.mPrivateHandler.obtainMessage( - WebViewClassic.HIT_TEST_RESULT, hit) - .sendToTarget(); - break; - case SET_USE_MOCK_DEVICE_ORIENTATION: setUseMockDeviceOrientation(); break; @@ -1792,6 +1778,15 @@ public final class WebViewCore { return false; } switch (eventType) { + case WebViewInputDispatcher.EVENT_TYPE_HIT_TEST: + int x = Math.round(event.getX()); + int y = Math.round(event.getY()); + WebKitHitTest hit = performHitTest(x, y, + mWebViewClassic.getScaledNavSlop(), true); + mWebViewClassic.mPrivateHandler.obtainMessage( + WebViewClassic.HIT_TEST_RESULT, hit).sendToTarget(); + return false; + case WebViewInputDispatcher.EVENT_TYPE_CLICK: return nativeMouseClick(mNativeClass); diff --git a/core/java/android/webkit/WebViewInputDispatcher.java b/core/java/android/webkit/WebViewInputDispatcher.java index 9328d8c..9eeb311 100644 --- a/core/java/android/webkit/WebViewInputDispatcher.java +++ b/core/java/android/webkit/WebViewInputDispatcher.java @@ -204,6 +204,11 @@ final class WebViewInputDispatcher { public static final int EVENT_TYPE_DOUBLE_TAP = 5; /** + * Event type: Indicates that a hit test should be performed + */ + public static final int EVENT_TYPE_HIT_TEST = 6; + + /** * Flag: This event is private to this queue. Do not forward it. */ public static final int FLAG_PRIVATE = 1 << 0; @@ -499,13 +504,17 @@ final class WebViewInputDispatcher { } private void enqueueDoubleTapLocked(MotionEvent event) { - unscheduleClickLocked(); - hideTapCandidateLocked(); MotionEvent eventToEnqueue = MotionEvent.obtainNoHistory(event); DispatchEvent d = obtainDispatchEventLocked(eventToEnqueue, EVENT_TYPE_DOUBLE_TAP, 0, mPostLastWebKitXOffset, mPostLastWebKitYOffset, mPostLastWebKitScale); enqueueEventLocked(d); - mIsDoubleTapCandidate = false; + } + + private void enqueueHitTestLocked(MotionEvent event) { + MotionEvent eventToEnqueue = MotionEvent.obtainNoHistory(event); + DispatchEvent d = obtainDispatchEventLocked(eventToEnqueue, EVENT_TYPE_HIT_TEST, 0, + mPostLastWebKitXOffset, mPostLastWebKitYOffset, mPostLastWebKitScale); + enqueueEventLocked(d); } private void checkForSlopLocked(MotionEvent event) { @@ -545,6 +554,7 @@ final class WebViewInputDispatcher { mInitialDownX = event.getX(); mInitialDownY = event.getY(); scheduleShowTapHighlightLocked(); + enqueueHitTestLocked(event); } else if (action == MotionEvent.ACTION_UP) { unscheduleLongPressLocked(); if (isClickCandidateLocked(event)) { @@ -824,6 +834,7 @@ final class WebViewInputDispatcher { case EVENT_TYPE_CLICK: case EVENT_TYPE_HOVER: case EVENT_TYPE_SCROLL: + case EVENT_TYPE_HIT_TEST: return false; case EVENT_TYPE_TOUCH: return !mPostSendTouchEventsToWebKit diff --git a/core/java/android/webkit/ZoomManager.java b/core/java/android/webkit/ZoomManager.java index 2247678..1da59e4 100644 --- a/core/java/android/webkit/ZoomManager.java +++ b/core/java/android/webkit/ZoomManager.java @@ -1008,8 +1008,10 @@ class ZoomManager { /** * Updates zoom values when Webkit produces a new picture. This method * should only be called from the UI thread's message handler. + * + * @return True if zoom value has changed */ - public void onNewPicture(WebViewCore.DrawData drawData) { + public boolean onNewPicture(WebViewCore.DrawData drawData) { final int viewWidth = mWebView.getViewWidth(); final boolean zoomOverviewWidthChanged = setupZoomOverviewWidth(drawData, viewWidth); final float newZoomOverviewScale = getZoomOverviewScale(); @@ -1056,6 +1058,8 @@ class ZoomManager { // so next new picture could be forced into overview mode if it's true. mInitialZoomOverview = mInZoomOverview; } + + return scaleHasDiff; } /** diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java index ae68794..e217e4f 100644 --- a/core/java/android/widget/AbsSeekBar.java +++ b/core/java/android/widget/AbsSeekBar.java @@ -21,6 +21,7 @@ import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.os.Bundle; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.MotionEvent; @@ -486,5 +487,46 @@ public abstract class AbsSeekBar extends ProgressBar { public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); info.setClassName(AbsSeekBar.class.getName()); + + if (isEnabled()) { + final int progress = getProgress(); + if (progress > 0) { + info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD); + } + if (progress < getMax()) { + info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); + } + } + } + + @Override + public boolean performAccessibilityAction(int action, Bundle arguments) { + if (super.performAccessibilityAction(action, arguments)) { + return true; + } + if (!isEnabled()) { + return false; + } + final int progress = getProgress(); + final int increment = Math.max(1, Math.round((float) getMax() / 5)); + switch (action) { + case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: { + if (progress <= 0) { + return false; + } + setProgress(progress - increment, true); + onKeyChange(); + return true; + } + case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: { + if (progress >= getMax()) { + return false; + } + setProgress(progress + increment, true); + onKeyChange(); + return true; + } + } + return false; } } diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index 16b8afa..b60ffc5 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -2503,7 +2503,7 @@ public class NumberPicker extends LinearLayout { info.addChild(NumberPicker.this, VIRTUAL_VIEW_ID_INCREMENT); } - info.setParent((View) getParent()); + info.setParent((View) getParentForAccessibility()); info.setEnabled(NumberPicker.this.isEnabled()); info.setScrollable(true); Rect boundsInParent = mTempRect; diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 56c4bd8..51c957a 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -1445,7 +1445,8 @@ public class RemoteViews implements Parcelable, Filter { /** * Returns an estimate of the bitmap heap memory usage for this RemoteViews. */ - int estimateMemoryUsage() { + /** @hide */ + public int estimateMemoryUsage() { return mMemoryUsageCounter.getMemoryUsage(); } diff --git a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java index 60cd895..6136206 100644 --- a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java +++ b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java @@ -79,18 +79,17 @@ public class MultiWaveView extends View { private static final int SHOW_ANIMATION_DURATION = 200; private static final int SHOW_ANIMATION_DELAY = 0; private static final float TAP_RADIUS_SCALE_ACCESSIBILITY_ENABLED = 1.3f; - private static final long RING_EXPAND_DURATION = 200; private static final float TARGET_INITIAL_POSITION_SCALE = 0.8f; private TimeInterpolator mChevronAnimationInterpolator = Ease.Quad.easeOut; private ArrayList<TargetDrawable> mTargetDrawables = new ArrayList<TargetDrawable>(); private ArrayList<TargetDrawable> mChevronDrawables = new ArrayList<TargetDrawable>(); - private ArrayList<Tweener> mChevronAnimations = new ArrayList<Tweener>(); - private ArrayList<Tweener> mTargetAnimations = new ArrayList<Tweener>(); + private AnimationBundle mChevronAnimations = new AnimationBundle(); + private AnimationBundle mTargetAnimations = new AnimationBundle(); + private AnimationBundle mHandleAnimations = new AnimationBundle(); private ArrayList<String> mTargetDescriptions; private ArrayList<String> mDirectionDescriptions; - private Tweener mHandleAnimation; private OnTriggerListener mOnTriggerListener; private TargetDrawable mHandleDrawable; private TargetDrawable mOuterRing; @@ -114,6 +113,33 @@ public class MultiWaveView extends View { private boolean mDragging; private int mNewTargetResources; + private class AnimationBundle extends ArrayList<Tweener> { + private static final long serialVersionUID = 0xA84D78726F127468L; + private boolean mSuspended; + + public void start() { + if (mSuspended) return; // ignore attempts to start animations + final int count = size(); + for (int i = 0; i < count; i++) { + Tweener anim = get(i); + anim.animator.start(); + } + } + + public void stop() { + final int count = size(); + for (int i = 0; i < count; i++) { + Tweener anim = get(i); + anim.animator.end(); + } + clear(); + } + + public void setSuspended(boolean suspend) { + mSuspended = suspend; + } + }; + private AnimatorListener mResetListener = new AnimatorListenerAdapter() { public void onAnimationEnd(Animator animator) { switchToState(STATE_IDLE, mWaveCenterX, mWaveCenterY); @@ -239,6 +265,7 @@ public class MultiWaveView extends View { a.recycle(); setVibrateEnabled(mVibrationDuration > 0); + assignDefaultsIfNeeded(); } private void dump() { @@ -254,6 +281,21 @@ public class MultiWaveView extends View { Log.v(TAG, "VerticalOffset = " + mVerticalOffset); } + public void suspendAnimations() { + mChevronAnimations.setSuspended(true); + mTargetAnimations.setSuspended(true); + mHandleAnimations.setSuspended(true); + } + + public void resumeAnimations() { + mChevronAnimations.setSuspended(false); + mTargetAnimations.setSuspended(false); + mHandleAnimations.setSuspended(false); + mChevronAnimations.start(); + mTargetAnimations.start(); + mHandleAnimations.start(); + } + @Override protected int getSuggestedMinimumWidth() { // View should be large enough to contain the background + handle and @@ -334,12 +376,12 @@ public class MultiWaveView extends View { private void startChevronAnimation() { final float chevronStartDistance = mHandleDrawable.getWidth() * 0.8f; final float chevronStopDistance = mOuterRadius * 0.9f / 2.0f; - mChevronAnimations.clear(); final float startScale = 0.5f; final float endScale = 2.0f; - final int directionCount = mFeedbackCount > 0 ? mChevronDrawables.size()/mFeedbackCount : 0; + mChevronAnimations.stop(); + // Add an animation for all chevron drawables. There are mFeedbackCount drawables // in each direction and directionCount directions. for (int direction = 0; direction < directionCount; direction++) { @@ -367,24 +409,21 @@ public class MultiWaveView extends View { "onUpdate", mUpdateListener)); } } + mChevronAnimations.start(); } private void stopChevronAnimation() { - for (Tweener anim : mChevronAnimations) { - anim.animator.end(); - } - mChevronAnimations.clear(); + mChevronAnimations.stop(); } private void stopHandleAnimation() { - if (mHandleAnimation != null) { - mHandleAnimation.animator.end(); - mHandleAnimation = null; - } + mHandleAnimations.stop(); } private void deactivateTargets() { - for (TargetDrawable target : mTargetDrawables) { + final int count = mTargetDrawables.size(); + for (int i = 0; i < count; i++) { + TargetDrawable target = mTargetDrawables.get(i); target.setState(TargetDrawable.STATE_INACTIVE); } mActiveTarget = -1; @@ -445,14 +484,16 @@ public class MultiWaveView extends View { // Animate handle back to the center based on current state. int delay = targetHit ? RETURN_TO_HOME_DELAY : 0; int duration = targetHit ? 0 : RETURN_TO_HOME_DURATION; - mHandleAnimation = Tweener.to(mHandleDrawable, duration, + mHandleAnimations.stop(); + mHandleAnimations.add(Tweener.to(mHandleDrawable, duration, "ease", Ease.Quart.easeOut, "delay", delay, "alpha", 1.0f, "x", 0, "y", 0, "onUpdate", mUpdateListener, - "onComplete", (mDragging && !targetHit) ? mResetListenerWithPing : mResetListener); + "onComplete", (mDragging && !targetHit) ? mResetListenerWithPing : mResetListener)); + mHandleAnimations.start(); setGrabbedState(OnTriggerListener.NO_HANDLE); } @@ -467,9 +508,7 @@ public class MultiWaveView extends View { } private void hideTargets(boolean animate) { - if (mTargetAnimations.size() > 0) { - stopTargetAnimation(); - } + mTargetAnimations.stop(); // Note: these animations should complete at the same time so that we can swap out // the target assets asynchronously from the setTargetResources() call. mAnimatingTargets = animate; @@ -497,12 +536,12 @@ public class MultiWaveView extends View { "delay", delay, "onUpdate", mUpdateListener, "onComplete", mTargetUpdateListener)); + + mTargetAnimations.start(); } private void showTargets(boolean animate) { - if (mTargetAnimations.size() > 0) { - stopTargetAnimation(); - } + mTargetAnimations.stop(); mAnimatingTargets = animate; final int delay = animate ? SHOW_ANIMATION_DELAY : 0; final int length = mTargetDrawables.size(); @@ -521,7 +560,7 @@ public class MultiWaveView extends View { } mOuterRing.setScaleX(0.5f); mOuterRing.setScaleY(0.5f); - mTargetAnimations.add(Tweener.to(mOuterRing, animate ? RING_EXPAND_DURATION : 0, + mTargetAnimations.add(Tweener.to(mOuterRing, animate ? SHOW_ANIMATION_DURATION : 0, "ease", Ease.Cubic.easeOut, "alpha", 1.0f, "scaleX", 1.0f, @@ -529,13 +568,12 @@ public class MultiWaveView extends View { "delay", delay, "onUpdate", mUpdateListener, "onComplete", mTargetUpdateListener)); + + mTargetAnimations.start(); } private void stopTargetAnimation() { - for (Tweener anim : mTargetAnimations) { - anim.animator.end(); - } - mTargetAnimations.clear(); + mTargetAnimations.stop(); } private void vibrate() { @@ -658,7 +696,6 @@ public class MultiWaveView extends View { * */ public void ping() { - stopChevronAnimation(); startChevronAnimation(); } @@ -721,7 +758,7 @@ public class MultiWaveView extends View { } private void handleDown(MotionEvent event) { - if (!trySwitchToFirstTouchState(event)) { + if (!trySwitchToFirstTouchState(event.getX(), event.getY())) { mDragging = false; stopTargetAnimation(); ping(); @@ -747,14 +784,11 @@ public class MultiWaveView extends View { } private void handleMove(MotionEvent event) { - if (!mDragging) { - trySwitchToFirstTouchState(event); - return; - } - int activeTarget = -1; final int historySize = event.getHistorySize(); - final boolean singleTarget = mTargetDrawables.size() == 1; + ArrayList<TargetDrawable> targets = mTargetDrawables; + int ntargets = targets.size(); + final boolean singleTarget = ntargets == 1; float x = 0.0f; float y = 0.0f; for (int k = 0; k < historySize + 1; k++) { @@ -768,25 +802,29 @@ public class MultiWaveView extends View { float limitX = tx * scale; float limitY = ty * scale; - if (singleTarget) { - // Snap to outer ring if there's only one target - float snapRadius = mOuterRadius - mSnapMargin; - if (touchRadius > snapRadius) { - activeTarget = 0; - } + if (!mDragging) { + trySwitchToFirstTouchState(eventX, eventY); } else { - // If there's more than one target, snap to the closest one less than hitRadius away. - float best = Float.MAX_VALUE; - final float hitRadius2 = mHitRadius * mHitRadius; - for (int i = 0; i < mTargetDrawables.size(); i++) { - // Snap to the first target in range - TargetDrawable target = mTargetDrawables.get(i); - float dx = limitX - target.getX(); - float dy = limitY - target.getY(); - float dist2 = dx*dx + dy*dy; - if (target.isEnabled() && dist2 < hitRadius2 && dist2 < best) { - activeTarget = i; - best = dist2; + if (singleTarget) { + // Snap to outer ring if there's only one target + float snapRadius = mOuterRadius - mSnapMargin; + if (touchRadius > snapRadius) { + activeTarget = 0; + } + } else { + // For more than one target, snap to the closest one less than hitRadius away. + float best = Float.MAX_VALUE; + final float hitRadius2 = mHitRadius * mHitRadius; + for (int i = 0; i < ntargets; i++) { + // Snap to the first target in range + TargetDrawable target = targets.get(i); + float dx = limitX - target.getX(); + float dy = limitY - target.getY(); + float dist2 = dx*dx + dy*dy; + if (target.isEnabled() && dist2 < hitRadius2 && dist2 < best) { + activeTarget = i; + best = dist2; + } } } } @@ -794,9 +832,13 @@ public class MultiWaveView extends View { y = limitY; } + if (!mDragging) { + return; + } + if (activeTarget != -1) { switchToState(STATE_SNAP, x,y); - TargetDrawable target = mTargetDrawables.get(activeTarget); + TargetDrawable target = targets.get(activeTarget); float newX = singleTarget ? x : target.getX(); float newY = singleTarget ? y : target.getY(); moveHandleTo(newX, newY, false); @@ -812,7 +854,7 @@ public class MultiWaveView extends View { if (mActiveTarget != activeTarget) { // Defocus the old target if (mActiveTarget != -1) { - TargetDrawable target = mTargetDrawables.get(mActiveTarget); + TargetDrawable target = targets.get(mActiveTarget); if (target.hasState(TargetDrawable.STATE_FOCUSED)) { target.setState(TargetDrawable.STATE_INACTIVE); mHandleDrawable.setAlpha(1.0f); @@ -820,7 +862,7 @@ public class MultiWaveView extends View { } // Focus the new target if (activeTarget != -1) { - TargetDrawable target = mTargetDrawables.get(activeTarget); + TargetDrawable target = targets.get(activeTarget); if (target.hasState(TargetDrawable.STATE_FOCUSED)) { target.setState(TargetDrawable.STATE_FOCUSED); mHandleDrawable.setAlpha(0.0f); @@ -877,9 +919,7 @@ public class MultiWaveView extends View { } } - private boolean trySwitchToFirstTouchState(MotionEvent event) { - final float x = event.getX(); - final float y = event.getY(); + private boolean trySwitchToFirstTouchState(float x, float y) { final float tx = x - mWaveCenterX; final float ty = y - mWaveCenterY; if (mAlwaysTrackFinger || dist2(tx,ty) <= getScaledTapRadiusSquared()) { @@ -892,9 +932,9 @@ public class MultiWaveView extends View { return false; } - private void assignDefaultsIfNeeded(float centerX, float centerY) { + private void assignDefaultsIfNeeded() { if (mOuterRadius == 0.0f) { - mOuterRadius = 0.5f*(float) Math.hypot(centerX, centerY); + mOuterRadius = Math.max(mOuterRing.getWidth(), mOuterRing.getHeight())/2.0f; } if (mHitRadius == 0.0f) { // Use the radius of inscribed circle of the first target. @@ -941,6 +981,7 @@ public class MultiWaveView extends View { super.onLayout(changed, left, top, right, bottom); final int width = right - left; final int height = bottom - top; + // Target placement width/height. This puts the targets on the greater of the ring // width or the specified outer radius. final float placementWidth = Math.max(mOuterRing.getWidth(), 2 * mOuterRadius); @@ -950,8 +991,6 @@ public class MultiWaveView extends View { float newWaveCenterY = mVerticalOffset + mVerticalInset + Math.max(height, + mMaxTargetHeight + placementHeight) / 2; - assignDefaultsIfNeeded(newWaveCenterX, newWaveCenterY); - if (mInitialLayout) { hideChevrons(); hideTargets(false); @@ -976,9 +1015,12 @@ public class MultiWaveView extends View { private void updateTargetPositions(float centerX, float centerY) { // Reposition the target drawables if the view changed. - for (int i = 0; i < mTargetDrawables.size(); i++) { - final TargetDrawable targetIcon = mTargetDrawables.get(i); - double angle = -2.0f * Math.PI * i / mTargetDrawables.size(); + ArrayList<TargetDrawable> targets = mTargetDrawables; + final int size = targets.size(); + final float alpha = (float) (-2.0f * Math.PI / size); + for (int i = 0; i < size; i++) { + final TargetDrawable targetIcon = targets.get(i); + final float angle = alpha * i; targetIcon.setPositionX(centerX); targetIcon.setPositionY(centerY); targetIcon.setX(mOuterRadius * (float) Math.cos(angle)); @@ -987,7 +1029,10 @@ public class MultiWaveView extends View { } private void updateChevronPositions(float centerX, float centerY) { - for (TargetDrawable target : mChevronDrawables) { + ArrayList<TargetDrawable> chevrons = mChevronDrawables; + final int size = chevrons.size(); + for (int i = 0; i < size; i++) { + TargetDrawable target = chevrons.get(i); if (target != null) { target.setPositionX(centerX); target.setPositionY(centerY); @@ -996,7 +1041,10 @@ public class MultiWaveView extends View { } private void hideChevrons() { - for (TargetDrawable chevron : mChevronDrawables) { + ArrayList<TargetDrawable> chevrons = mChevronDrawables; + final int size = chevrons.size(); + for (int i = 0; i < size; i++) { + TargetDrawable chevron = chevrons.get(i); if (chevron != null) { chevron.setAlpha(0.0f); } @@ -1006,14 +1054,18 @@ public class MultiWaveView extends View { @Override protected void onDraw(Canvas canvas) { mOuterRing.draw(canvas); - for (TargetDrawable target : mTargetDrawables) { + final int ntargets = mTargetDrawables.size(); + for (int i = 0; i < ntargets; i++) { + TargetDrawable target = mTargetDrawables.get(i); if (target != null) { target.draw(canvas); } } - for (TargetDrawable target : mChevronDrawables) { - if (target != null) { - target.draw(canvas); + final int nchevrons = mChevronDrawables.size(); + for (int i = 0; i < nchevrons; i++) { + TargetDrawable chevron = mChevronDrawables.get(i); + if (chevron != null) { + chevron.draw(canvas); } } mHandleDrawable.draw(canvas); diff --git a/core/java/com/android/internal/widget/multiwaveview/Tweener.java b/core/java/com/android/internal/widget/multiwaveview/Tweener.java index bc8a62f..1d502ba 100644 --- a/core/java/com/android/internal/widget/multiwaveview/Tweener.java +++ b/core/java/com/android/internal/widget/multiwaveview/Tweener.java @@ -122,7 +122,6 @@ class Tweener { anim.addListener(listener); } anim.addListener(mCleanupListener); - anim.start(); return tween; } diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp index 673c38d..c85b09c 100644 --- a/core/jni/android/graphics/TextLayoutCache.cpp +++ b/core/jni/android/graphics/TextLayoutCache.cpp @@ -332,15 +332,7 @@ uint32_t TextLayoutValue::getElapsedTime() { } TextLayoutShaper::TextLayoutShaper() : mShaperItemGlyphArraySize(0) { - mDefaultTypeface = SkFontHost::CreateTypeface(NULL, NULL, NULL, 0, SkTypeface::kNormal); - mArabicTypeface = NULL; - mHebrewRegularTypeface = NULL; - mHebrewBoldTypeface = NULL; - mBengaliTypeface = NULL; - mThaiTypeface = NULL; - mDevanagariRegularTypeface = NULL; - mTamilRegularTypeface = NULL; - mTamilBoldTypeface = NULL; + init(); mFontRec.klass = &harfbuzzSkiaClass; mFontRec.userData = 0; @@ -359,7 +351,19 @@ TextLayoutShaper::TextLayoutShaper() : mShaperItemGlyphArraySize(0) { mShaperItem.font->userData = &mShapingPaint; } -TextLayoutShaper::~TextLayoutShaper() { +void TextLayoutShaper::init() { + mDefaultTypeface = SkFontHost::CreateTypeface(NULL, NULL, NULL, 0, SkTypeface::kNormal); + mArabicTypeface = NULL; + mHebrewRegularTypeface = NULL; + mHebrewBoldTypeface = NULL; + mBengaliTypeface = NULL; + mThaiTypeface = NULL; + mDevanagariRegularTypeface = NULL; + mTamilRegularTypeface = NULL; + mTamilBoldTypeface = NULL; +} + +void TextLayoutShaper::unrefTypefaces() { SkSafeUnref(mDefaultTypeface); SkSafeUnref(mArabicTypeface); SkSafeUnref(mHebrewRegularTypeface); @@ -369,6 +373,10 @@ TextLayoutShaper::~TextLayoutShaper() { SkSafeUnref(mDevanagariRegularTypeface); SkSafeUnref(mTamilRegularTypeface); SkSafeUnref(mTamilBoldTypeface); +} + +TextLayoutShaper::~TextLayoutShaper() { + unrefTypefaces(); deleteShaperItemGlyphArrays(); } @@ -983,6 +991,12 @@ HB_Face TextLayoutShaper::getCachedHBFace(SkTypeface* typeface) { return face; } +void TextLayoutShaper::purgeCaches() { + mCachedHBFaces.clear(); + unrefTypefaces(); + init(); +} + TextLayoutEngine::TextLayoutEngine() { mShaper = new TextLayoutShaper(); #if USE_TEXT_LAYOUT_CACHE @@ -1018,6 +1032,10 @@ sp<TextLayoutValue> TextLayoutEngine::getValue(const SkPaint* paint, const jchar void TextLayoutEngine::purgeCaches() { #if USE_TEXT_LAYOUT_CACHE mTextLayoutCache->clear(); + mShaper->purgeCaches(); +#if DEBUG_GLYPHS + ALOGD("Purged TextLayoutEngine caches"); +#endif #endif } diff --git a/core/jni/android/graphics/TextLayoutCache.h b/core/jni/android/graphics/TextLayoutCache.h index 027e888..cb15a2a 100644 --- a/core/jni/android/graphics/TextLayoutCache.h +++ b/core/jni/android/graphics/TextLayoutCache.h @@ -169,6 +169,8 @@ public: void computeValues(TextLayoutValue* value, const SkPaint* paint, const UChar* chars, size_t start, size_t count, size_t contextCount, int dirFlags); + void purgeCaches(); + private: /** * Harfbuzz shaper item @@ -218,6 +220,9 @@ private: */ UnicodeString mBuffer; + void init(); + void unrefTypefaces(); + SkTypeface* typefaceForUnichar(const SkPaint* paint, SkTypeface* typeface, SkUnichar unichar, HB_Script script); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index dbc60f9..04a29e7 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1551,6 +1551,13 @@ android:description="@string/permdesc_bindInputMethod" android:protectionLevel="signature" /> + <!-- Must be required by an {@link android.accessibilityservice.AccessibilityService}, + to ensure that only the system can bind to it. --> + <permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" + android:label="@string/permlab_bindAccessibilityService" + android:description="@string/permdesc_bindAccessibilityService" + android:protectionLevel="signature" /> + <!-- Must be required by a TextService (e.g. SpellCheckerService) to ensure that only the system can bind to it. --> <permission android:name="android.permission.BIND_TEXT_SERVICE" diff --git a/core/res/res/anim-land/task_close_enter.xml b/core/res/res/anim-land/task_close_enter.xml index 805ff6c..facc42b 100644 --- a/core/res/res/anim-land/task_close_enter.xml +++ b/core/res/res/anim-land/task_close_enter.xml @@ -23,21 +23,20 @@ <alpha android:fromAlpha="0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350"/> + android:startOffset="300" + android:duration="400"/> - <translate android:fromXDelta="-140%" android:toXDelta="0" + <translate android:fromXDelta="-120%" android:toXDelta="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_cubic" - android:startOffset="150" - android:duration="350"/> + android:interpolator="@interpolator/decelerate_quint" + android:startOffset="300" + android:duration="400" /> - <scale android:fromXScale=".6" android:toXScale="1.0" - android:fromYScale=".6" android:toYScale="1.0" - android:pivotX="50%p" android:pivotY="50%p" + <scale android:fromXScale=".5" android:toXScale="1.0" + android:fromYScale=".5" android:toYScale="1.0" + android:pivotY="50%p" android:pivotX="0%p" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350" /> - + android:startOffset="300" + android:duration="400" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-land/task_close_exit.xml b/core/res/res/anim-land/task_close_exit.xml index 3e97149..e104c33 100644 --- a/core/res/res/anim-land/task_close_exit.xml +++ b/core/res/res/anim-land/task_close_exit.xml @@ -19,25 +19,25 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:background="#ff000000" android:shareInterpolator="false" android:zAdjustment="normal"> + <alpha android:fromAlpha="1.0" android:toAlpha="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/accelerate_quad" - android:duration="350"/> + android:duration="300"/> - <translate android:fromXDelta="0" android:toXDelta="140%" + <translate android:fromXDelta="0" android:toXDelta="120%" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_quad" - android:duration="350"/> + android:interpolator="@interpolator/accelerate_cubic" + android:duration="300"/> - <scale android:fromXScale="1.0" android:toXScale="0.6" - android:fromYScale="1.0" android:toYScale="0.6" + <scale android:fromXScale="1.0" android:toXScale="0.5" + android:fromYScale="1.0" android:toYScale="0.5" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:pivotX="50%p" android:pivotY="50%p" - android:interpolator="@interpolator/decelerate_cubic" - android:duration="350" /> + android:pivotY="50%p" android:pivotX="100%p" + android:interpolator="@interpolator/accelerate_quad" + android:duration="300" /> <!-- This is needed to keep the animation running while task_open_enter completes --> <alpha android:fromAlpha="1.0" android:toAlpha="1.0" - android:interpolator="@interpolator/accelerate_quad" - android:duration="500" /> + android:duration="700" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-land/task_open_enter.xml b/core/res/res/anim-land/task_open_enter.xml index fb1c5d6..dc7c7a9 100644 --- a/core/res/res/anim-land/task_open_enter.xml +++ b/core/res/res/anim-land/task_open_enter.xml @@ -23,21 +23,20 @@ <alpha android:fromAlpha="0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350"/> + android:startOffset="300" + android:duration="400"/> - <translate android:fromXDelta="140%" android:toXDelta="0" + <translate android:fromXDelta="120%" android:toXDelta="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_cubic" - android:startOffset="150" - android:duration="350"/> + android:interpolator="@interpolator/decelerate_quint" + android:startOffset="300" + android:duration="400" /> - <scale android:fromXScale=".6" android:toXScale="1.0" - android:fromYScale=".6" android:toYScale="1.0" - android:pivotX="50%p" android:pivotY="50%p" + <scale android:fromXScale=".5" android:toXScale="1.0" + android:fromYScale=".5" android:toYScale="1.0" + android:pivotY="50%p" android:pivotX="100%p" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350" /> - + android:startOffset="300" + android:duration="400" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-land/task_open_exit.xml b/core/res/res/anim-land/task_open_exit.xml index 8d15324..701afa6 100644 --- a/core/res/res/anim-land/task_open_exit.xml +++ b/core/res/res/anim-land/task_open_exit.xml @@ -19,25 +19,25 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:background="#ff000000" android:shareInterpolator="false" android:zAdjustment="normal"> + <alpha android:fromAlpha="1.0" android:toAlpha="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/accelerate_quad" - android:duration="350"/> + android:duration="300"/> - <translate android:fromXDelta="0" android:toXDelta="-140%" + <translate android:fromXDelta="0" android:toXDelta="-120%" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_quad" - android:duration="350"/> + android:interpolator="@interpolator/accelerate_cubic" + android:duration="300"/> - <scale android:fromXScale="1.0" android:toXScale="0.6" - android:fromYScale="1.0" android:toYScale="0.6" + <scale android:fromXScale="1.0" android:toXScale="0.5" + android:fromYScale="1.0" android:toYScale="0.5" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:pivotX="50%p" android:pivotY="50%p" - android:interpolator="@interpolator/decelerate_cubic" - android:duration="350" /> + android:pivotY="50%p" android:pivotX="0%p" + android:interpolator="@interpolator/accelerate_quad" + android:duration="300" /> <!-- This is needed to keep the animation running while task_open_enter completes --> <alpha android:fromAlpha="1.0" android:toAlpha="1.0" - android:interpolator="@interpolator/accelerate_quad" - android:duration="500" /> + android:duration="700" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-port/task_close_enter.xml b/core/res/res/anim-port/task_close_enter.xml index 1806eed..9a747a1 100644 --- a/core/res/res/anim-port/task_close_enter.xml +++ b/core/res/res/anim-port/task_close_enter.xml @@ -23,21 +23,20 @@ <alpha android:fromAlpha="0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350"/> + android:startOffset="300" + android:duration="400"/> - <translate android:fromYDelta="-140%" android:toYDelta="0" + <translate android:fromYDelta="-120%" android:toYDelta="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_cubic" - android:startOffset="150" - android:duration="350"/> + android:interpolator="@interpolator/decelerate_quint" + android:startOffset="300" + android:duration="400" /> - <scale android:fromXScale=".6" android:toXScale="1.0" - android:fromYScale=".6" android:toYScale="1.0" - android:pivotX="50%p" android:pivotY="50%p" + <scale android:fromXScale=".5" android:toXScale="1.0" + android:fromYScale=".5" android:toYScale="1.0" + android:pivotX="50%p" android:pivotY="0%p" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350" /> - + android:startOffset="300" + android:duration="400" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-port/task_close_exit.xml b/core/res/res/anim-port/task_close_exit.xml index 958a7a2..35b1aa3 100644 --- a/core/res/res/anim-port/task_close_exit.xml +++ b/core/res/res/anim-port/task_close_exit.xml @@ -19,25 +19,25 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:background="#ff000000" android:shareInterpolator="false" android:zAdjustment="normal"> + <alpha android:fromAlpha="1.0" android:toAlpha="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/accelerate_quad" - android:duration="350"/> + android:duration="300"/> - <translate android:fromYDelta="0" android:toYDelta="140%" + <translate android:fromYDelta="0" android:toYDelta="120%" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_quad" - android:duration="350"/> + android:interpolator="@interpolator/accelerate_cubic" + android:duration="300"/> - <scale android:fromXScale="1.0" android:toXScale="0.6" - android:fromYScale="1.0" android:toYScale="0.6" + <scale android:fromXScale="1.0" android:toXScale="0.5" + android:fromYScale="1.0" android:toYScale="0.5" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:pivotX="50%p" android:pivotY="50%p" - android:interpolator="@interpolator/decelerate_cubic" - android:duration="350" /> + android:pivotX="50%p" android:pivotY="100%p" + android:interpolator="@interpolator/accelerate_quad" + android:duration="300" /> <!-- This is needed to keep the animation running while task_open_enter completes --> <alpha android:fromAlpha="1.0" android:toAlpha="1.0" - android:interpolator="@interpolator/accelerate_quad" - android:duration="500" /> + android:duration="700" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-port/task_open_enter.xml b/core/res/res/anim-port/task_open_enter.xml index 54a2d93..5e4ae18 100644 --- a/core/res/res/anim-port/task_open_enter.xml +++ b/core/res/res/anim-port/task_open_enter.xml @@ -23,21 +23,20 @@ <alpha android:fromAlpha="0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350"/> + android:startOffset="300" + android:duration="400"/> - <translate android:fromYDelta="140%" android:toYDelta="0" + <translate android:fromYDelta="120%" android:toYDelta="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_cubic" - android:startOffset="150" - android:duration="350"/> + android:interpolator="@interpolator/decelerate_quint" + android:startOffset="300" + android:duration="400" /> - <scale android:fromXScale=".6" android:toXScale="1.0" - android:fromYScale=".6" android:toYScale="1.0" - android:pivotX="50%p" android:pivotY="50%p" + <scale android:fromXScale=".5" android:toXScale="1.0" + android:fromYScale=".5" android:toYScale="1.0" + android:pivotX="50%p" android:pivotY="100%p" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350" /> - + android:startOffset="300" + android:duration="400" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-port/task_open_exit.xml b/core/res/res/anim-port/task_open_exit.xml index 18e6550..0ba35d7 100644 --- a/core/res/res/anim-port/task_open_exit.xml +++ b/core/res/res/anim-port/task_open_exit.xml @@ -19,25 +19,25 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:background="#ff000000" android:shareInterpolator="false" android:zAdjustment="normal"> + <alpha android:fromAlpha="1.0" android:toAlpha="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/accelerate_quad" - android:duration="350"/> + android:duration="300"/> - <translate android:fromYDelta="0" android:toYDelta="-140%" + <translate android:fromYDelta="0" android:toYDelta="-120%" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_quad" - android:duration="350"/> + android:interpolator="@interpolator/accelerate_cubic" + android:duration="300"/> - <scale android:fromXScale="1.0" android:toXScale="0.6" - android:fromYScale="1.0" android:toYScale="0.6" + <scale android:fromXScale="1.0" android:toXScale="0.5" + android:fromYScale="1.0" android:toYScale="0.5" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:pivotX="50%p" android:pivotY="50%p" - android:interpolator="@interpolator/decelerate_cubic" - android:duration="350" /> + android:pivotX="50%p" android:pivotY="0%p" + android:interpolator="@interpolator/accelerate_quad" + android:duration="300" /> <!-- This is needed to keep the animation running while task_open_enter completes --> <alpha android:fromAlpha="1.0" android:toAlpha="1.0" - android:interpolator="@interpolator/accelerate_quad" - android:duration="500" /> + android:duration="700" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-sw720dp/task_close_enter.xml b/core/res/res/anim-sw720dp/task_close_enter.xml index 1806eed..9a747a1 100644 --- a/core/res/res/anim-sw720dp/task_close_enter.xml +++ b/core/res/res/anim-sw720dp/task_close_enter.xml @@ -23,21 +23,20 @@ <alpha android:fromAlpha="0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350"/> + android:startOffset="300" + android:duration="400"/> - <translate android:fromYDelta="-140%" android:toYDelta="0" + <translate android:fromYDelta="-120%" android:toYDelta="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_cubic" - android:startOffset="150" - android:duration="350"/> + android:interpolator="@interpolator/decelerate_quint" + android:startOffset="300" + android:duration="400" /> - <scale android:fromXScale=".6" android:toXScale="1.0" - android:fromYScale=".6" android:toYScale="1.0" - android:pivotX="50%p" android:pivotY="50%p" + <scale android:fromXScale=".5" android:toXScale="1.0" + android:fromYScale=".5" android:toYScale="1.0" + android:pivotX="50%p" android:pivotY="0%p" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350" /> - + android:startOffset="300" + android:duration="400" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-sw720dp/task_close_exit.xml b/core/res/res/anim-sw720dp/task_close_exit.xml index 958a7a2..35b1aa3 100644 --- a/core/res/res/anim-sw720dp/task_close_exit.xml +++ b/core/res/res/anim-sw720dp/task_close_exit.xml @@ -19,25 +19,25 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:background="#ff000000" android:shareInterpolator="false" android:zAdjustment="normal"> + <alpha android:fromAlpha="1.0" android:toAlpha="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/accelerate_quad" - android:duration="350"/> + android:duration="300"/> - <translate android:fromYDelta="0" android:toYDelta="140%" + <translate android:fromYDelta="0" android:toYDelta="120%" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_quad" - android:duration="350"/> + android:interpolator="@interpolator/accelerate_cubic" + android:duration="300"/> - <scale android:fromXScale="1.0" android:toXScale="0.6" - android:fromYScale="1.0" android:toYScale="0.6" + <scale android:fromXScale="1.0" android:toXScale="0.5" + android:fromYScale="1.0" android:toYScale="0.5" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:pivotX="50%p" android:pivotY="50%p" - android:interpolator="@interpolator/decelerate_cubic" - android:duration="350" /> + android:pivotX="50%p" android:pivotY="100%p" + android:interpolator="@interpolator/accelerate_quad" + android:duration="300" /> <!-- This is needed to keep the animation running while task_open_enter completes --> <alpha android:fromAlpha="1.0" android:toAlpha="1.0" - android:interpolator="@interpolator/accelerate_quad" - android:duration="500" /> + android:duration="700" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-sw720dp/task_open_enter.xml b/core/res/res/anim-sw720dp/task_open_enter.xml index 54a2d93..5e4ae18 100644 --- a/core/res/res/anim-sw720dp/task_open_enter.xml +++ b/core/res/res/anim-sw720dp/task_open_enter.xml @@ -23,21 +23,20 @@ <alpha android:fromAlpha="0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350"/> + android:startOffset="300" + android:duration="400"/> - <translate android:fromYDelta="140%" android:toYDelta="0" + <translate android:fromYDelta="120%" android:toYDelta="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_cubic" - android:startOffset="150" - android:duration="350"/> + android:interpolator="@interpolator/decelerate_quint" + android:startOffset="300" + android:duration="400" /> - <scale android:fromXScale=".6" android:toXScale="1.0" - android:fromYScale=".6" android:toYScale="1.0" - android:pivotX="50%p" android:pivotY="50%p" + <scale android:fromXScale=".5" android:toXScale="1.0" + android:fromYScale=".5" android:toYScale="1.0" + android:pivotX="50%p" android:pivotY="100%p" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350" /> - + android:startOffset="300" + android:duration="400" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-sw720dp/task_open_exit.xml b/core/res/res/anim-sw720dp/task_open_exit.xml index 18e6550..0ba35d7 100644 --- a/core/res/res/anim-sw720dp/task_open_exit.xml +++ b/core/res/res/anim-sw720dp/task_open_exit.xml @@ -19,25 +19,25 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:background="#ff000000" android:shareInterpolator="false" android:zAdjustment="normal"> + <alpha android:fromAlpha="1.0" android:toAlpha="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/accelerate_quad" - android:duration="350"/> + android:duration="300"/> - <translate android:fromYDelta="0" android:toYDelta="-140%" + <translate android:fromYDelta="0" android:toYDelta="-120%" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_quad" - android:duration="350"/> + android:interpolator="@interpolator/accelerate_cubic" + android:duration="300"/> - <scale android:fromXScale="1.0" android:toXScale="0.6" - android:fromYScale="1.0" android:toYScale="0.6" + <scale android:fromXScale="1.0" android:toXScale="0.5" + android:fromYScale="1.0" android:toYScale="0.5" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:pivotX="50%p" android:pivotY="50%p" - android:interpolator="@interpolator/decelerate_cubic" - android:duration="350" /> + android:pivotX="50%p" android:pivotY="0%p" + android:interpolator="@interpolator/accelerate_quad" + android:duration="300" /> <!-- This is needed to keep the animation running while task_open_enter completes --> <alpha android:fromAlpha="1.0" android:toAlpha="1.0" - android:interpolator="@interpolator/accelerate_quad" - android:duration="500" /> + android:duration="700" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim/wallpaper_open_enter.xml b/core/res/res/anim/wallpaper_open_enter.xml index ee7ab60..12a1bdf 100644 --- a/core/res/res/anim/wallpaper_open_enter.xml +++ b/core/res/res/anim/wallpaper_open_enter.xml @@ -21,5 +21,5 @@ android:detachWallpaper="true" android:shareInterpolator="false" android:zAdjustment="normal"> <alpha android:fromAlpha="1.0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:duration="300"/> + android:duration="375"/> </set>
\ No newline at end of file diff --git a/core/res/res/anim/wallpaper_open_exit.xml b/core/res/res/anim/wallpaper_open_exit.xml index 905743e..b0f97d1 100644 --- a/core/res/res/anim/wallpaper_open_exit.xml +++ b/core/res/res/anim/wallpaper_open_exit.xml @@ -20,13 +20,13 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" android:zAdjustment="top"> <alpha android:fromAlpha="1.0" android:toAlpha="0.0" - android:interpolator="@interpolator/linear" + android:interpolator="@interpolator/accelerate_decelerate" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:duration="200" /> - <scale android:fromXScale="1.0" android:toXScale="0.4" - android:fromYScale="1.0" android:toYScale="0.4" + <scale android:fromXScale="1.0" android:toXScale="0.5" + android:fromYScale="1.0" android:toYScale="0.5" android:pivotX="50%p" android:pivotY="50%p" android:interpolator="@interpolator/decelerate_quad" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:duration="250" /> + android:duration="375" /> </set>
\ No newline at end of file diff --git a/core/res/res/layout/notification_action.xml b/core/res/res/layout/notification_action.xml index 28812a9..33cbab9 100644 --- a/core/res/res/layout/notification_action.xml +++ b/core/res/res/layout/notification_action.xml @@ -17,11 +17,14 @@ <Button xmlns:android="http://schemas.android.com/apk/res/android" style="?android:attr/borderlessButtonStyle" android:id="@+id/action0" - android:layout_width="match_parent" + android:layout_width="0dp" android:layout_height="48dp" + android:layout_weight="1" android:gravity="left|center_vertical" android:drawablePadding="8dp" android:paddingLeft="8dp" android:textColor="#ccc" android:textSize="14dp" + android:singleLine="true" + android:ellipsize="end" /> diff --git a/core/res/res/layout/notification_action_list.xml b/core/res/res/layout/notification_action_list.xml new file mode 100644 index 0000000..fa0a8c8 --- /dev/null +++ b/core/res/res/layout/notification_action_list.xml @@ -0,0 +1,28 @@ +<?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. +--> + +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/actions" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:visibility="gone" + android:showDividers="middle" + android:divider="?android:attr/listDivider" + > + <!-- actions will be added here --> +</LinearLayout> diff --git a/core/res/res/layout/notification_action_tombstone.xml b/core/res/res/layout/notification_action_tombstone.xml index e61e15f..992b37c 100644 --- a/core/res/res/layout/notification_action_tombstone.xml +++ b/core/res/res/layout/notification_action_tombstone.xml @@ -15,12 +15,18 @@ --> <Button xmlns:android="http://schemas.android.com/apk/res/android" + style="?android:attr/borderlessButtonStyle" android:id="@+id/action0" - android:layout_width="match_parent" + android:layout_width="0dp" android:layout_height="48dp" + android:layout_weight="1" android:gravity="left|center_vertical" android:drawablePadding="8dp" android:paddingLeft="8dp" - android:textColor="#666" + android:textColor="#ccc" android:textSize="14dp" + android:singleLine="true" + android:ellipsize="end" + android:alpha="0.5" + android:enabled="false" /> diff --git a/core/res/res/layout/notification_template_big_base.xml b/core/res/res/layout/notification_template_big_base.xml index 378161c..d50b792 100644 --- a/core/res/res/layout/notification_template_big_base.xml +++ b/core/res/res/layout/notification_template_big_base.xml @@ -143,14 +143,11 @@ style="?android:attr/progressBarStyleHorizontal" /> </LinearLayout> - <LinearLayout + <include + layout="@layout/notification_action_list" android:id="@+id/actions" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" - android:visibility="gone" - > - <!-- actions will be added here --> - </LinearLayout> + /> </LinearLayout> </FrameLayout> diff --git a/core/res/res/layout/notification_template_big_picture.xml b/core/res/res/layout/notification_template_big_picture.xml index 51e46b2..f98970a 100644 --- a/core/res/res/layout/notification_template_big_picture.xml +++ b/core/res/res/layout/notification_template_big_picture.xml @@ -27,11 +27,12 @@ android:id="@+id/big_picture" android:layout_width="match_parent" android:layout_height="192dp" + android:layout_marginTop="64dp" + android:layout_gravity="bottom" android:scaleType="centerCrop" /> <include layout="@layout/notification_template_base" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="192dp" /> </FrameLayout> diff --git a/core/res/res/layout/notification_template_big_text.xml b/core/res/res/layout/notification_template_big_text.xml index 77a5f11..210bc13 100644 --- a/core/res/res/layout/notification_template_big_text.xml +++ b/core/res/res/layout/notification_template_big_text.xml @@ -105,16 +105,13 @@ android:layout_weight="1" /> </LinearLayout> - <LinearLayout - android:id="@+id/actions" + <include + layout="@layout/notification_action_list" android:layout_width="match_parent" android:layout_height="0dp" - android:orientation="vertical" android:visibility="gone" android:layout_weight="1" - > - <!-- actions will be added here --> - </LinearLayout> + /> <TextView android:id="@+id/overflow_title" android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Title" android:layout_width="match_parent" diff --git a/core/res/res/layout/notification_template_inbox.xml b/core/res/res/layout/notification_template_inbox.xml index 05ec1d8..eb5e759 100644 --- a/core/res/res/layout/notification_template_inbox.xml +++ b/core/res/res/layout/notification_template_inbox.xml @@ -93,8 +93,6 @@ android:layout_height="0dp" android:singleLine="true" android:ellipsize="end" - android:paddingTop="4dp" - android:paddingBottom="4dp" android:visibility="gone" android:layout_weight="1" /> @@ -104,8 +102,6 @@ android:layout_height="0dp" android:singleLine="true" android:ellipsize="end" - android:paddingTop="4dp" - android:paddingBottom="4dp" android:visibility="gone" android:layout_weight="1" /> @@ -115,8 +111,6 @@ android:layout_height="0dp" android:singleLine="true" android:ellipsize="end" - android:paddingTop="4dp" - android:paddingBottom="4dp" android:visibility="gone" android:layout_weight="1" /> @@ -126,8 +120,6 @@ android:layout_height="0dp" android:singleLine="true" android:ellipsize="end" - android:paddingTop="4dp" - android:paddingBottom="4dp" android:visibility="gone" android:layout_weight="1" /> @@ -137,21 +129,16 @@ android:layout_height="0dp" android:singleLine="true" android:ellipsize="end" - android:paddingTop="4dp" - android:paddingBottom="4dp" android:visibility="gone" android:layout_weight="1" /> - <LinearLayout + <include + layout="@layout/notification_action_list" android:id="@+id/actions" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" android:layout_weight="0" - android:visibility="gone" - > - <!-- actions will be added here --> - </LinearLayout> + /> <TextView android:id="@+id/overflow_title" android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Title" android:layout_width="match_parent" diff --git a/core/res/res/raw/accessibility_gestures.bin b/core/res/res/raw/accessibility_gestures.bin Binary files differindex f7e6615..96fa1ec 100644 --- a/core/res/res/raw/accessibility_gestures.bin +++ b/core/res/res/raw/accessibility_gestures.bin diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index b739835..732b0ab 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -176,9 +176,9 @@ <string name="permgrouplab_network" msgid="5808983377727109831">"Netwerkkommunikasie"</string> <string name="permgroupdesc_network" msgid="4478299413241861987">"Kry toegang tot verskeie netwerkfunksies."</string> <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string> - <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Toegangstoestelle en netwerke deur Bluetooth."</string> + <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Kry toegang tot toestelle en netwerke deur Bluetooth."</string> <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Kortreeks-netwerke"</string> - <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Toegangstoestelle met kortreeks-netwerke soos NFC."</string> + <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Kry toegang tot toestelle met kortreeks-netwerke soos NFC."</string> <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Oudio-instellings"</string> <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Verander oudio-instellings."</string> <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Affekteer battery"</string> @@ -561,7 +561,7 @@ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Laat die program toe om die USB-berging se inhoud te lees, wat foto\'s en media kan insluit."</string> <string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Laat die program toe om die SD-kaart se inhoud te lees, wat foto\'s en media kan insluit."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"verander of vee die inhoud van jou USB-berging uit"</string> - <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"Verander of skrap die inhoud van jou SD-kaart"</string> + <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"Verander of vee die inhoud van jou SD-kaart uit"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Laat die program toe om die USB-geheue te skryf."</string> <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Laat die program toe om na die SD-kaart te skryf."</string> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"verander/vee uit interne mediabergingsinhoud"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 25cfb7f..4ec0197 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -185,10 +185,10 @@ <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Bruge funktioner, der hurtigt kan dræne batteriet."</string> <string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string> <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Direkte adgang til kalender og begivenheder."</string> - <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Læs brugerordbog"</string> - <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Læs ord i brugerordbogen."</string> - <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Skriv brugerordbog"</string> - <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Føj ord til brugerordbogen."</string> + <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Læse brugerordbog"</string> + <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Læse ord i brugerordbogen."</string> + <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Skrive brugerordbog"</string> + <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Føje ord til brugerordbogen."</string> <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Bogmærker og historik"</string> <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Direkte adgang til bogmærker og browserhistorik."</string> <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarm"</string> @@ -561,7 +561,7 @@ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Tillader, at appen læser USB-lagerets indhold, herunder billeder og mediefiler."</string> <string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Tillader, at appen læser SD-kortets indhold, som kan omfatte billeder og mediefiler."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"ændre eller slette indhold på USB-lager"</string> - <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"skift eller slet indholdet på dit SD-kort"</string> + <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"ændre eller slette indholdet på dit SD-kort"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Lader appen skrive til USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Tillader, at appen kan skrive til SD-kortet."</string> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"Rediger/slet internt medielagringsindhold"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 3d51570..4ca2b86 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1091,7 +1091,7 @@ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"Bei der Verwendung Ihres USB-Speichers als USB-Massenspeicher ist ein Problem aufgetreten."</string> <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"Bei der Verwendung Ihrer SD-Karte als USB-Massenspeicher ist ein Problem aufgetreten."</string> <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB-Verbindung"</string> - <string name="usb_storage_notification_message" msgid="939822783828183763">"Zum Kopieren von Dateien auf den/von dem Computer berühren"</string> + <string name="usb_storage_notification_message" msgid="939822783828183763">"Zum Kopieren von Dateien berühren"</string> <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB-Speicher deaktivieren"</string> <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"Zum Deaktivieren des USB-Speichers berühren"</string> <string name="usb_storage_stop_title" msgid="660129851708775853">"USB-Speicher in Verwendung"</string> @@ -1114,7 +1114,7 @@ <string name="extmedia_format_message" product="default" msgid="14131895027543830">"Alle Daten auf Ihrer Karte gehen verloren."</string> <string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-Debugging"</string> - <string name="adb_active_notification_message" msgid="1016654627626476142">"Zum Deaktivieren von USB-Debugging tippen"</string> + <string name="adb_active_notification_message" msgid="1016654627626476142">"Zum Deaktivieren von USB-Debugging berühren"</string> <string name="select_input_method" msgid="4653387336791222978">"Eingabemethode wählen"</string> <string name="configure_input_methods" msgid="9091652157722495116">"Eingabemethoden einrichten"</string> <string name="use_physical_keyboard" msgid="6203112478095117625">"Physische Tastatur"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 0da38aa..72132dd 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Enviando..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"¿Deseas iniciar el navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"¿Aceptar la llamada?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Siempre"</string> <string name="activity_resolver_use_once" msgid="405646673463328329">"Solo una vez"</string> </resources> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 616b9be..5bca912 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -185,12 +185,9 @@ <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Menggunakan fitur yang dapat menguras baterai dengan cepat."</string> <string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string> <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Akses langsung ke kalender dan acara."</string> - <!-- no translation found for permgrouplab_dictionary (4148597128843641379) --> - <skip /> - <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) --> - <skip /> - <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) --> - <skip /> + <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Membaca Kamus Pengguna"</string> + <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Membaca kata dalam kamus pengguna."</string> + <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Menulis Kamus Pengguna"</string> <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Menambahkan kata ke kamus pengguna."</string> <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Bookmark dan Riwayat"</string> <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Akses langsung ke bookmark dan riwayat browser."</string> @@ -564,8 +561,7 @@ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Izinkan aplikasi membaca konten penyimpanan USB, yang mungkin mencakup foto dan media."</string> <string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Izinkan aplikasi membaca konten kartu SD, yang mungkin mencakup foto dan media."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"ubah/hapus konten pympanan USB"</string> - <!-- no translation found for permlab_sdcardWrite (8805693630050458763) --> - <skip /> + <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"mengubah atau menghapus konten kartu SD Anda"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Mengizinkan apl menulis ke penyimpanan USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Memungkinkan apl menulis ke kartu SD."</string> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"ubah/hapus konten penyimpanan media internal"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 3c705ec..f5132c1 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Siunčiama…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Paleisti naršyklę?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Priimti skambutį?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Visada"</string> <string name="activity_resolver_use_once" msgid="405646673463328329">"Tik kartą"</string> </resources> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 0b96365..e6c8d99 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Notiek sūtīšana…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Vai palaist pārlūkprogrammu?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Vai atbildēt uz zvanu?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Vienmēr"</string> <string name="activity_resolver_use_once" msgid="405646673463328329">"Tikai vienreiz"</string> </resources> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 47aa00a..1ab7002 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -177,7 +177,7 @@ <string name="permgroupdesc_network" msgid="4478299413241861987">"Akses pelbagai ciri rangkaian."</string> <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string> <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Akses peranti dan rangkaian melalui Bluetooth."</string> - <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Rangkaian jarak-pendek"</string> + <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Rangkaian jarak-dekat"</string> <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Akses peranti melalui rangkaian jarak dekat seperti NFC."</string> <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Tetapan Audio"</string> <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Tukar tetapan audio."</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 4bb3b2f..e7a809c 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -178,7 +178,7 @@ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string> <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Aceder a dispositivos e redes através de Bluetooth."</string> <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Redes de Curto Alcance"</string> - <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Aceder a dispositivos através de redes de curto alcance como NFC."</string> + <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Aceder a dispositivos através de redes de curto alcance tal como a NFC."</string> <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Definições de Áudio"</string> <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Alterar as definições de áudio."</string> <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Afetar a Bateria"</string> @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"A enviar..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Iniciar Navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string> <string name="activity_resolver_use_once" msgid="405646673463328329">"Só Uma Vez"</string> </resources> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 4236d50..84ce4bb 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -1104,7 +1104,7 @@ <string name="dlg_error_title" msgid="7323658469626514207">"Falha na operação do USB"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> <string name="usb_mtp_notification_title" msgid="3699913097391550394">"Conectado como um dispositivo de mídia"</string> - <string name="usb_ptp_notification_title" msgid="1960817192216064833">"Conectadas como uma câmera"</string> + <string name="usb_ptp_notification_title" msgid="1960817192216064833">"Conectado como câmera"</string> <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Conectados como um instalador"</string> <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Conectado a um acessório USB"</string> <string name="usb_notification_message" msgid="2290859399983720271">"Toque para obter outras opções USB."</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index e943dda..3b416fe 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -175,28 +175,20 @@ <string name="permgroupdesc_location" msgid="5704679763124170100">"Надгледајте своју физичку локацију."</string> <string name="permgrouplab_network" msgid="5808983377727109831">"Комуникација преко мреже"</string> <string name="permgroupdesc_network" msgid="4478299413241861987">"Приступајте разним функцијама мреже."</string> - <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) --> - <skip /> - <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) --> - <skip /> - <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) --> - <skip /> - <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) --> - <skip /> + <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string> + <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Приступање уређајима и мрежама преко Bluetooth-а."</string> + <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Мреже кратког домета"</string> + <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Приступање уређајима преко мрежа кратког домета, као што је NFC."</string> <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Аудио подешавања"</string> <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Промена аудио подешавања."</string> <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Утицај на батерију"</string> <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Коришћење функција које могу брзо да истроше батерију."</string> <string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string> <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Директан приступ календару и догађајима."</string> - <!-- no translation found for permgrouplab_dictionary (4148597128843641379) --> - <skip /> - <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) --> - <skip /> - <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) --> - <skip /> - <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) --> - <skip /> + <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Читање речника корисника"</string> + <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Читање речи у речнику корисника."</string> + <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Уписивање у речник корисника"</string> + <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Додавање речи у речник корисника."</string> <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Обележивачи и историја"</string> <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Директан приступ обележивачима и историји прегледача."</string> <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Аларм"</string> @@ -569,8 +561,7 @@ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Дозвољава апликацији читање садржаја USB меморије, што могу да буду слике и медиа датотеке."</string> <string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Дозвољава апликацији да чита садржај SD картице, који може да обухвата слике и медиа датотеке."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"измена или брисање садржаја USB меморије"</string> - <!-- no translation found for permlab_sdcardWrite (8805693630050458763) --> - <skip /> + <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"мењање или брисање садржаја SD картице"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Дозвољава апликацији да уписује податке на USB меморију."</string> <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Дозвољава апликацији да уписује податке на SD картицу."</string> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"измена/брисање интерне меморије медија"</string> @@ -1090,8 +1081,7 @@ <string name="date_time_set" msgid="5777075614321087758">"Подеси"</string> <string name="date_time_done" msgid="2507683751759308828">"Готово"</string> <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"НОВО: "</font></string> - <!-- no translation found for perms_description_app (5139836143293299417) --> - <skip /> + <string name="perms_description_app" msgid="5139836143293299417">"Омогућава <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="no_permissions" msgid="7283357728219338112">"Није потребна ниједна дозвола"</string> <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB великог капацитета"</string> <string name="usb_storage_title" msgid="5901459041398751495">"USB је повезан"</string> @@ -1322,6 +1312,5 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Желите ли да покренете прегледач?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Желите ли да прихватите позив?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Увек"</string> - <!-- no translation found for activity_resolver_use_once (405646673463328329) --> - <skip /> + <string name="activity_resolver_use_once" msgid="405646673463328329">"Само једном"</string> </resources> diff --git a/core/res/res/values-sw720dp-land/arrays.xml b/core/res/res/values-sw720dp-land/arrays.xml new file mode 100644 index 0000000..d845875 --- /dev/null +++ b/core/res/res/values-sw720dp-land/arrays.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* //device/apps/common/assets/res/any/colors.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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <array name="lockscreen_chevron_drawables"> + <item>@drawable/ic_lockscreen_chevron_right</item> + <item>@null</item> + <item>@null</item> + <item>@null</item> + </array> + +</resources> diff --git a/core/res/res/values-sw720dp-port/arrays.xml b/core/res/res/values-sw720dp-port/arrays.xml new file mode 100644 index 0000000..d845875 --- /dev/null +++ b/core/res/res/values-sw720dp-port/arrays.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* //device/apps/common/assets/res/any/colors.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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <array name="lockscreen_chevron_drawables"> + <item>@drawable/ic_lockscreen_chevron_right</item> + <item>@null</item> + <item>@null</item> + <item>@null</item> + </array> + +</resources> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 46c58e3..17dcf64 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -175,28 +175,20 @@ <string name="permgroupdesc_location" msgid="5704679763124170100">"ตรวจดูตำแหน่งทางกายภาพของคุณ"</string> <string name="permgrouplab_network" msgid="5808983377727109831">"การสื่อสารของเครือข่าย"</string> <string name="permgroupdesc_network" msgid="4478299413241861987">"เข้าถึงคุณลักษณะเครือข่ายต่างๆ"</string> - <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) --> - <skip /> - <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) --> - <skip /> - <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) --> - <skip /> - <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) --> - <skip /> + <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"บลูทูธ"</string> + <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"เข้าถึงอุปกรณ์และเครือข่ายผ่านบลูทูธ"</string> + <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"เครือข่ายระยะใกล้"</string> + <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"เข้าถึงอุปกรณ์ผ่านเครือข่ายระยะใกล้ เช่น NFC"</string> <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"การตั้งค่าเสียง"</string> <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"เปลี่ยนการตั้งค่าเสียง"</string> <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"มีผลต่อแบตเตอรี่"</string> <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"ใช้คุณลักษณะที่ทำให้พลังงานแบตเตอรี่ลดลงอย่างรวดเร็ว"</string> <string name="permgrouplab_calendar" msgid="5863508437783683902">"ปฏิทิน"</string> <string name="permgroupdesc_calendar" msgid="5777534316982184416">"เข้าถึงปฏิทินและกิจกรรมโดยตรง"</string> - <!-- no translation found for permgrouplab_dictionary (4148597128843641379) --> - <skip /> - <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) --> - <skip /> - <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) --> - <skip /> - <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) --> - <skip /> + <string name="permgrouplab_dictionary" msgid="4148597128843641379">"อ่านพจนานุกรมผู้ใช้"</string> + <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"อ่านคำในพจนานุกรมผู้ใช้"</string> + <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"เขียนพจนานุกรมผู้ใช้"</string> + <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"เพิ่มคำลงในพจนานุกรมผู้ใช้"</string> <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"บุ๊กมาร์กและประวัติ"</string> <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"เข้าถึงบุ๊กมาร์กและประวัติของเบราว์เซอร์โดยตรง"</string> <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"เตือน"</string> @@ -569,8 +561,7 @@ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"อนุญาตให้แอปอ่านเนื้อหาในที่จัดเก็บข้อมูล USB ซึ่งอาจรวมไปถึงรูปภาพและสื่อ"</string> <string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"อนุญาตให้แอปอ่านเนื้อหาในการ์ด SD ซึ่งอาจรวมไปถึงรูปภาพและสื่อ"</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"แก้ไขหรือลบเนื้อหาใน USB"</string> - <!-- no translation found for permlab_sdcardWrite (8805693630050458763) --> - <skip /> + <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"แก้ไขหรือลบเนื้อหาในการ์ด SD ของคุณ"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"อนุญาตให้แอปฯ เขียนลงใน USB"</string> <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"อนุญาตให้แอปพลิเคชันเขียนลงบนการ์ด SD"</string> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"แก้/ลบเนื้อหาข้อมูลสื่อภายใน"</string> @@ -1090,8 +1081,7 @@ <string name="date_time_set" msgid="5777075614321087758">"ตั้งค่า"</string> <string name="date_time_done" msgid="2507683751759308828">"เสร็จสิ้น"</string> <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"ใหม่: "</font></string> - <!-- no translation found for perms_description_app (5139836143293299417) --> - <skip /> + <string name="perms_description_app" msgid="5139836143293299417">"โดย <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="no_permissions" msgid="7283357728219338112">"ไม่ต้องการการอนุญาต"</string> <string name="usb_storage_activity_title" msgid="4465055157209648641">"ที่จัดเก็บข้อมูลจำนวนมากแบบ USB"</string> <string name="usb_storage_title" msgid="5901459041398751495">"เชื่อมต่อ USB แล้ว"</string> @@ -1321,8 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"กำลังส่ง…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"เปิดเบราว์เซอร์หรือไม่"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"รับสายหรือไม่"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> - <!-- no translation found for activity_resolver_use_once (405646673463328329) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"ทุกครั้ง"</string> + <string name="activity_resolver_use_once" msgid="405646673463328329">"เพียงแค่ครั้งเดียว"</string> </resources> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 9aa2df3..9222823 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -175,28 +175,20 @@ <string name="permgroupdesc_location" msgid="5704679763124170100">"Fiziksel konumunuzu izleme."</string> <string name="permgrouplab_network" msgid="5808983377727109831">"Ağ iletişimi"</string> <string name="permgroupdesc_network" msgid="4478299413241861987">"Çeşitli ağ özelliklerine erişme."</string> - <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) --> - <skip /> - <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) --> - <skip /> - <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) --> - <skip /> - <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) --> - <skip /> + <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string> + <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Cihazlara ve ağlara Bluetooth ile eriş."</string> + <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Kısa Mesafeli Ağlar"</string> + <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Cihazlara NFC gibi kısa mesafeli ağları kullanarak eriş."</string> <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Ses Ayarları"</string> <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Ses ayarlarını değiştirme."</string> <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Pili Etkileyenler"</string> <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Pili çok çabuk tüketebilen özellikleri kullanma."</string> <string name="permgrouplab_calendar" msgid="5863508437783683902">"Takvim"</string> <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Takvime ve etkinliklere doğrudan erişim."</string> - <!-- no translation found for permgrouplab_dictionary (4148597128843641379) --> - <skip /> - <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) --> - <skip /> - <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) --> - <skip /> - <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) --> - <skip /> + <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Kullanıcı Sözlüğünü Oku"</string> + <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Kelimeleri kullanıcı sözlüğünde oku."</string> + <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Kullanıcı Sözlüğüne Yaz"</string> + <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Kelimeleri kullanıcı sözlüğüne ekle."</string> <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Yer İşaretleri ve Geçmiş"</string> <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Yer işaretlerine ve tarayıcı geçmişine doğrudan erişim."</string> <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarm"</string> @@ -569,8 +561,7 @@ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Uygulamaya USB depolamanın içeriğini okuma izni verir. Bu izin fotoğrafları ve medyayı da içerebilir."</string> <string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Uygulamaya SD kartın içeriğini okuma izni verir. Bu izin fotoğrafları ve medyayı da içerebilir."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USB depolamamın içeriğini değiştir veya sil"</string> - <!-- no translation found for permlab_sdcardWrite (8805693630050458763) --> - <skip /> + <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD kartın içeriğini değiştir veya sil"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Uygulamaya USB depolama birimine yazma izni verir."</string> <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Uygulamaya, SD karta yazma izni verir."</string> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"dahili medya depolama birimi içeriğini değiştir/sil"</string> @@ -1090,8 +1081,7 @@ <string name="date_time_set" msgid="5777075614321087758">"Ayarla"</string> <string name="date_time_done" msgid="2507683751759308828">"Tamamlandı"</string> <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"YENİ: "</font></string> - <!-- no translation found for perms_description_app (5139836143293299417) --> - <skip /> + <string name="perms_description_app" msgid="5139836143293299417">"Sağlayan: <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="no_permissions" msgid="7283357728219338112">"İzin gerektirmez"</string> <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB yığın depolama"</string> <string name="usb_storage_title" msgid="5901459041398751495">"USB bağlandı"</string> @@ -1321,8 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Gönderiliyor…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Tarayıcı Başlatılsın mı?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Çağrı kabul edilsin mi?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> - <!-- no translation found for activity_resolver_use_once (405646673463328329) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Her zaman"</string> + <string name="activity_resolver_use_once" msgid="405646673463328329">"Sadece Bir Defa"</string> </resources> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 1487132..542f048 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Đang gửi…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Khởi chạy trình duyệt?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Chấp nhận cuộc gọi?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Luôn bật"</string> <string name="activity_resolver_use_once" msgid="405646673463328329">"Chỉ một lần"</string> </resources> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index dce0525..0c9717f 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -185,7 +185,7 @@ <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Sebenzisa izici ezingakhipha ngokushesha ibhethri."</string> <string name="permgrouplab_calendar" msgid="5863508437783683902">"Ikhalenda"</string> <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Ukufinyelela okuqondile kukhalenda nezehlakalo."</string> - <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Funda isichzamazwi somsebenzisi"</string> + <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Funda isichazamazwi somsebenzisi"</string> <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Funda amagama kusichazamazwi somsebenzisi."</string> <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Bhala isichazamazwi somsebenzisi"</string> <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Engeza amagama kusichazamazwi somsebenzisi."</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 5fa7b7e..98e7769 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -512,7 +512,6 @@ 0 - Nothing 1 - Recent apps dialog 2 - Recent apps view in SystemUI - 3 - Voice search This needs to match the constants in policy/src/com/android/internal/policy/impl/PhoneWindowManager.java --> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 687a00b..4511201 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -846,6 +846,12 @@ interface of an input method. Should never be needed for normal apps.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permlab_bindAccessibilityService">bind to an accessibility service</string> + <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permdesc_bindAccessibilityService">Allows the holder to bind to the top-level + interface of an accessibility service. Should never be needed for normal apps.</string> + + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permlab_bindTextService">bind to a text service</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permdesc_bindTextService">Allows the holder to bind to the top-level diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index 2b34dab..a90dab8 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -239,22 +239,25 @@ please see styles_device_defaults.xml. </style> <!-- Notification content styles --> <style name="TextAppearance.StatusBar.EventContent"> - <item name="android:textColor">?android:attr/textColorSecondary</item> - <item name="android:textSize">12sp</item> + <item name="android:textColor">#808080</item> + <item name="android:textSize">14dp</item> </style> <style name="TextAppearance.StatusBar.EventContent.Title"> - <item name="android:textColor">?android:attr/textColorPrimary</item> - <item name="android:textSize">16sp</item> + <item name="android:textColor">#ffffff</item> + <item name="android:fontFamily">sans-serif-light</item> + <item name="android:textSize">18dp</item> <item name="android:textStyle">bold</item> </style> <style name="TextAppearance.StatusBar.EventContent.Line2"> - <item name="android:textSize">13sp</item> + <!-- inherit all --> </style> <style name="TextAppearance.StatusBar.EventContent.Info"> - <!-- inherit all --> + <item name="android:textSize">12sp</item> + <item name="android:textColor">#666666</item> </style> <style name="TextAppearance.StatusBar.EventContent.Time"> - <!-- inherit all --> + <item name="android:textSize">12sp</item> + <item name="android:textColor">#666666</item> </style> <style name="TextAppearance.Small.CalendarViewWeekDayView"> @@ -631,6 +634,7 @@ please see styles_device_defaults.xml. <style name="Widget.WebView"> <item name="android:focusable">true</item> + <item name="android:focusableInTouchMode">true</item> <item name="android:scrollbars">horizontal|vertical</item> </style> diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java index f7b0cd0..f01562c 100644 --- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java +++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java @@ -244,8 +244,13 @@ public class ConnectivityManagerTestActivity extends Activity { mContext = this; mChannel = mWifiManager.initialize(mContext, mContext.getMainLooper(), null); - initializeNetworkStates(); + if (mWifiManager.isWifiApEnabled()) { + // if soft AP is enabled, disable it + mWifiManager.setWifiApEnabled(null, false); + log("Disable soft ap"); + } + initializeNetworkStates(); log("Clear Wifi before we start the test."); removeConfiguredNetworksAndDisableWifi(); mWifiRegexs = mCM.getTetherableWifiRegexs(); diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiApStress.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiApStress.java index 7e136be..60595fb 100644 --- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiApStress.java +++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiApStress.java @@ -103,7 +103,7 @@ public class WifiApStress assertTrue(mAct.mWifiManager.setWifiApEnabled(config, true)); // Wait for wifi ap state to be ENABLED assertTrue(mAct.waitForWifiAPState(WifiManager.WIFI_AP_STATE_ENABLED, - ConnectivityManagerTestActivity.LONG_TIMEOUT)); + 2 * ConnectivityManagerTestActivity.LONG_TIMEOUT)); // Wait for wifi tethering result assertEquals(ConnectivityManagerTestActivity.SUCCESS, mAct.waitForTetherStateChange(2*ConnectivityManagerTestActivity.SHORT_TIMEOUT)); diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java index 649ec3e..39e2cf2 100644 --- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java +++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java @@ -83,6 +83,7 @@ public class WifiStressTest @Override public void setUp() throws Exception { super.setUp(); + mAct = getActivity(); mRunner = (ConnectivityManagerStressTestRunner) getInstrumentation(); mReconnectIterations = mRunner.mReconnectIterations; @@ -97,11 +98,6 @@ public class WifiStressTest mOutputWriter = new BufferedWriter(new FileWriter(new File( Environment.getExternalStorageDirectory(), OUTPUT_FILE), true)); mAct.turnScreenOn(); - if (mAct.mWifiManager.isWifiApEnabled()) { - // if soft AP is enabled, disable it - assertTrue(mAct.mWifiManager.setWifiApEnabled(null, false)); - Log.v(TAG, "disable soft ap"); - } if (!mAct.mWifiManager.isWifiEnabled()) { log("Enable wi-fi before stress tests."); if (!mAct.enableWifi()) { diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml index cadc895..dcd1bab 100644 --- a/core/tests/coretests/AndroidManifest.xml +++ b/core/tests/coretests/AndroidManifest.xml @@ -1039,7 +1039,8 @@ </intent-filter> </activity> - <service android:name="android.webkit.AccessibilityInjectorTest$MockAccessibilityService"> + <service android:name="android.webkit.AccessibilityInjectorTest$MockAccessibilityService" + android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> diff --git a/docs/html/guide/practices/design/performance.jd b/docs/html/guide/practices/design/performance.jd index c41f971..dd9b554 100644 --- a/docs/html/guide/practices/design/performance.jd +++ b/docs/html/guide/practices/design/performance.jd @@ -180,6 +180,9 @@ accessing a local), direct field access is about 7x faster than invoking a trivial getter. This is true in Froyo, but will improve in the future when the JIT inlines getter methods.</p> +<p>Note that if you're using ProGuard, you can have the best +of both worlds because ProGuard can inline accessors for you.</p> + <a name="use_final" id="use_final"></a> <h2>Use Static Final For Constants</h2> diff --git a/docs/html/guide/topics/resources/providing-resources.jd b/docs/html/guide/topics/resources/providing-resources.jd index b33a097..847681b 100644 --- a/docs/html/guide/topics/resources/providing-resources.jd +++ b/docs/html/guide/topics/resources/providing-resources.jd @@ -528,20 +528,22 @@ how this affects your application during runtime.</p> which indicates the current device orientation.</p> </td> </tr> - <tr id="DockQualifier"> - <td>Dock mode</td> + <tr id="UiModeQualifier"> + <td>UI mode</td> <td> <code>car</code><br/> - <code>desk</code> + <code>desk</code><br/> + <code>television</code> </td> <td> <ul class="nolist"> - <li>{@code car}: Device is in a car dock</li> - <li>{@code desk}: Device is in a desk dock</li> + <li>{@code car}: Device is displaying in a car dock</li> + <li>{@code desk}: Device is displaying in a desk dock</li> + <li>{@code television}: Device is displaying on a television</li> </ul> - <p><em>Added in API level 8.</em></p> + <p><em>Added in API level 8, television added in API 13.</em></p> <p>This can change during the life of your application if the user places the device in a -dock. You can enable or disable this mode using {@link +dock. You can enable or disable some of these modes using {@link android.app.UiModeManager}. See <a href="runtime-changes.html">Handling Runtime Changes</a> for information about how this affects your application during runtime.</p> </td> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java index 50aaa9a..0165977 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java @@ -34,6 +34,7 @@ import android.util.Log; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; +import java.io.CharArrayReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException; @@ -45,7 +46,11 @@ import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.Reader; +import java.io.Writer; +import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.zip.CRC32; @@ -55,7 +60,7 @@ import java.util.zip.CRC32; */ public class SettingsBackupAgent extends BackupAgentHelper { private static final boolean DEBUG = false; - private static final boolean DEBUG_BACKUP = DEBUG || true; + private static final boolean DEBUG_BACKUP = DEBUG || false; private static final String KEY_SYSTEM = "system"; private static final String KEY_SECURE = "secure"; @@ -111,6 +116,130 @@ public class SettingsBackupAgent extends BackupAgentHelper { private WifiManager mWfm; private static String mWifiConfigFile; + // Class for capturing a network definition from the wifi supplicant config file + static class Network { + String ssid = ""; // equals() and hashCode() need these to be non-null + String key_mgmt = ""; + final ArrayList<String> rawLines = new ArrayList<String>(); + + public static Network readFromStream(BufferedReader in) { + final Network n = new Network(); + String line; + try { + while (in.ready()) { + line = in.readLine(); + if (line == null || line.startsWith("}")) { + break; + } + n.rememberLine(line); + } + } catch (IOException e) { + return null; + } + return n; + } + + void rememberLine(String line) { + // can't rely on particular whitespace patterns so strip leading/trailing + line = line.trim(); + if (line.isEmpty()) return; // only whitespace; drop the line + rawLines.add(line); + + // remember the ssid and key_mgmt lines for duplicate culling + if (line.startsWith("ssid")) { + ssid = line; + } else if (line.startsWith("key_mgmt")) { + key_mgmt = line; + } + } + + public void write(Writer w) throws IOException { + w.write("\nnetwork={\n"); + for (String line : rawLines) { + w.write("\t" + line + "\n"); + } + w.write("}\n"); + } + + public void dump() { + Log.v(TAG, "network={"); + for (String line : rawLines) { + Log.v(TAG, " " + line); + } + Log.v(TAG, "}"); + } + + // Same approach as Pair.equals() and Pair.hashCode() + @Override + public boolean equals(Object o) { + if (o == this) return true; + if (!(o instanceof Network)) return false; + final Network other; + try { + other = (Network) o; + } catch (ClassCastException e) { + return false; + } + return ssid.equals(other.ssid) && key_mgmt.equals(other.key_mgmt); + } + + @Override + public int hashCode() { + int result = 17; + result = 31 * result + ssid.hashCode(); + result = 31 * result + key_mgmt.hashCode(); + return result; + } + } + + // Ingest multiple wifi config file fragments, looking for network={} blocks + // and eliminating duplicates + class WifiNetworkSettings { + // One for fast lookup, one for maintaining ordering + final HashSet<Network> mKnownNetworks = new HashSet<Network>(); + final ArrayList<Network> mNetworks = new ArrayList<Network>(8); + + public void readNetworks(BufferedReader in) { + try { + String line; + while (in.ready()) { + line = in.readLine(); + if (line != null) { + // Parse out 'network=' decls so we can ignore duplicates + if (line.startsWith("network")) { + Network net = Network.readFromStream(in); + if (! mKnownNetworks.contains(net)) { + if (DEBUG_BACKUP) { + Log.v(TAG, "Adding " + net.ssid + " / " + net.key_mgmt); + } + mKnownNetworks.add(net); + mNetworks.add(net); + } else { + if (DEBUG_BACKUP) { + Log.v(TAG, "Dupe; skipped " + net.ssid + " / " + net.key_mgmt); + } + } + } + } + } + } catch (IOException e) { + // whatever happened, we're done now + } + } + + public void write(Writer w) throws IOException { + for (Network net : mNetworks) { + net.write(w); + } + } + + public void dump() { + for (Network net : mNetworks) { + net.dump(); + } + } + } + @Override public void onCreate() { if (DEBUG_BACKUP) Log.d(TAG, "onCreate() invoked"); @@ -622,29 +751,51 @@ public class SettingsBackupAgent extends BackupAgentHelper { private void restoreWifiSupplicant(String filename, byte[] bytes, int size) { try { + WifiNetworkSettings supplicantImage = new WifiNetworkSettings(); + File supplicantFile = new File(FILE_WIFI_SUPPLICANT); - if (supplicantFile.exists()) supplicantFile.delete(); - copyWifiSupplicantTemplate(); + 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); + in.close(); - OutputStream os = new BufferedOutputStream(new FileOutputStream(filename, true)); - os.write("\n".getBytes()); - os.write(bytes, 0, size); - os.close(); + supplicantFile.delete(); + } + + // Incorporate the restore AP information + if (size > 0) { + 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); + + if (DEBUG_BACKUP) { + Log.v(TAG, "Final AP list:"); + supplicantImage.dump(); + } + } + + // Install the correct default template + BufferedWriter bw = new BufferedWriter(new FileWriter(FILE_WIFI_SUPPLICANT)); + copyWifiSupplicantTemplate(bw); + + // Write the restored supplicant config and we're done + supplicantImage.write(bw); + bw.close(); } catch (IOException ioe) { Log.w(TAG, "Couldn't restore " + filename); } } - private void copyWifiSupplicantTemplate() { + private void copyWifiSupplicantTemplate(BufferedWriter bw) { try { BufferedReader br = new BufferedReader(new FileReader(FILE_WIFI_SUPPLICANT_TEMPLATE)); - BufferedWriter bw = new BufferedWriter(new FileWriter(FILE_WIFI_SUPPLICANT)); char[] temp = new char[1024]; int size; while ((size = br.read(temp)) > 0) { bw.write(temp, 0, size); } - bw.close(); br.close(); } catch (IOException ioe) { Log.w(TAG, "Couldn't copy wpa_supplicant file"); diff --git a/packages/SystemUI/res/drawable/navbar_search_outerring.xml b/packages/SystemUI/res/drawable/navbar_search_outerring.xml index 37b6c1c..0dd081d 100644 --- a/packages/SystemUI/res/drawable/navbar_search_outerring.xml +++ b/packages/SystemUI/res/drawable/navbar_search_outerring.xml @@ -19,5 +19,5 @@ <size android:height="@dimen/navbar_search_outerring_diameter" android:width="@dimen/navbar_search_outerring_diameter" /> <solid android:color="#00000000" /> - <stroke android:color="#1affffff" android:width="2dp" /> + <stroke android:color="#40ffffff" android:width="2dp" /> </shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/navigation_bar.xml b/packages/SystemUI/res/layout/navigation_bar.xml index b905db3..d41040d 100644 --- a/packages/SystemUI/res/layout/navigation_bar.xml +++ b/packages/SystemUI/res/layout/navigation_bar.xml @@ -69,7 +69,7 @@ android:layout_height="match_parent" android:src="@drawable/ic_sysbar_home" systemui:keyCode="3" - systemui:keyRepeat="true" + systemui:keyRepeat="false" android:layout_weight="0" systemui:glowBackground="@drawable/ic_sysbar_highlight" android:contentDescription="@string/accessibility_home" diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml index 4cff67b..406ed25 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded.xml @@ -23,34 +23,39 @@ xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui" android:id="@+id/notification_panel" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" + android:layout_height="match_parent" android:background="@drawable/notification_panel_bg" android:paddingTop="@dimen/notification_panel_padding_top" android:layout_marginLeft="@dimen/notification_panel_margin_left" > - <include layout="@layout/status_bar_expanded_header" - android:layout_width="match_parent" - android:layout_height="wrap_content" - /> - - <ScrollView - android:id="@+id/scroll" + <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" - android:fadingEdge="none" - android:overScrollMode="ifContentScrolls" - android:layout_marginTop="@dimen/notification_panel_header_height" android:layout_marginBottom="@dimen/close_handle_underlap" > - <com.android.systemui.statusbar.policy.NotificationRowLayout - android:id="@+id/latestItems" + + <include layout="@layout/status_bar_expanded_header" android:layout_width="match_parent" - android:layout_height="wrap_content" - systemui:rowHeight="@dimen/notification_row_min_height" + android:layout_height="48dp" /> - </ScrollView> + + <ScrollView + android:id="@+id/scroll" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:fadingEdge="none" + android:overScrollMode="ifContentScrolls" + android:layout_marginTop="@dimen/notification_panel_header_height" + > + <com.android.systemui.statusbar.policy.NotificationRowLayout + android:id="@+id/latestItems" + android:layout_width="match_parent" + android:layout_height="wrap_content" + systemui:rowHeight="@dimen/notification_row_min_height" + /> + </ScrollView> + </FrameLayout> <com.android.systemui.statusbar.phone.CloseDragHandle android:id="@+id/close" android:layout_width="match_parent" @@ -67,5 +72,4 @@ /> </com.android.systemui.statusbar.phone.CloseDragHandle> - </FrameLayout><!-- end of sliding panel --> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index b4e0d8a..06a9395 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -144,10 +144,7 @@ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Información de la aplicación"</string> <string name="notifications_off_title" msgid="8936620513608443224">"Notificaciones desactivadas"</string> <string name="notifications_off_text" msgid="2529001315769385273">"Toca aquí para volver a activar las notificaciones."</string> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"La pantalla rotará automáticamente."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"La pantalla está bloqueada en modo horizontal."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"La pantalla está bloqueada en modo vertical."</string> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 46adfd7..aae070a 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -26,7 +26,7 @@ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"सूची से निकालें"</string> <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"एप्लिकेशन जानकारी"</string> <string name="status_bar_no_recent_apps" msgid="6576392951053994640">"कोई हाल ही के एप्लिकेशन नहीं"</string> - <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"हाल ही के एप्लिकेशन ख़ारिज करें"</string> + <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"हाल ही के एप्लिकेशन खारिज करें"</string> <plurals name="status_bar_accessibility_recent_apps"> <item quantity="one" msgid="5854176083865845541">"1 हाल ही का एप्लिकेशन"</item> <item quantity="other" msgid="1040784359794890744">"%d हाल ही के एप्लिकेशन"</item> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index a117252..a69fc23 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -141,8 +141,7 @@ <string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktifkan tirai layar"</string> <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Info aplikasi"</string> <string name="notifications_off_title" msgid="8936620513608443224">"Pemberitahuan mati"</string> - <!-- no translation found for notifications_off_text (2529001315769385273) --> - <skip /> + <string name="notifications_off_text" msgid="2529001315769385273">"Ketuk di sini untuk menyalakan pemberitahuan lagi."</string> <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Layar akan diputar secara otomatis."</string> <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Layar dikunci dalam orientasi lanskap."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Layar dikunci dalam orientasi potret."</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index a242640..018b5e5 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -142,10 +142,7 @@ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Programos informacija"</string> <string name="notifications_off_title" msgid="8936620513608443224">"Pranešimai išjungti"</string> <string name="notifications_off_text" msgid="2529001315769385273">"Jei norite vėl įjungti pranešimus, palieskite čia."</string> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekranas bus sukamas automatiškai."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Užrakintas ekranas yra horizontalios orientacijos."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Užrakintas ekranas yra vertikalios orientacijos."</string> </resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 3c2e193..e708804 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -142,10 +142,7 @@ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informācija par lietotni"</string> <string name="notifications_off_title" msgid="8936620513608443224">"Paziņojumi ir izslēgti"</string> <string name="notifications_off_text" msgid="2529001315769385273">"Pieskarieties šeit, lai atkal ieslēgtu paziņojumus."</string> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekrāns tiks pagriezts automātiski."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ekrāns tagad ir bloķēts ainavas orientācijā."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekrāns tagad ir bloķēts portreta orientācijā."</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 77ed068..d08c529 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -142,10 +142,7 @@ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informações da aplicação"</string> <string name="notifications_off_title" msgid="8936620513608443224">"Notificações desativadas"</string> <string name="notifications_off_text" msgid="2529001315769385273">"Toque aqui para voltar a ativar as notificações."</string> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"O ecrã será rodado automaticamente."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"O ecrã está bloqueado na orientação horizontal."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"O ecrã está bloqueado na orientação vertical."</string> </resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 3277fb6..7a7d08f 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -38,7 +38,7 @@ <string name="battery_low_subtitle" msgid="1752040062087829196">"Батарея разряжена."</string> <string name="battery_low_percent_format" msgid="1077244949318261761">"Осталось <xliff:g id="NUMBER">%d%%</xliff:g>"</string> <string name="invalid_charger" msgid="4549105996740522523">"Зарядка через порт USB не поддерживается."\n"Используйте только зарядное устройство из комплекта поставки."</string> - <string name="battery_low_why" msgid="7279169609518386372">"Расход заряда батареи"</string> + <string name="battery_low_why" msgid="7279169609518386372">"Подробнее"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Настройки"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Режим полета"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 5026d6d..1fa3b21 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -141,7 +141,7 @@ <string name="dreams_dock_launcher" msgid="3541196417659166245">"Vklop ohranjevalnika zaslona"</string> <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Podatki o aplikaciji"</string> <string name="notifications_off_title" msgid="8936620513608443224">"Obvestila so izklopljena"</string> - <string name="notifications_off_text" msgid="2529001315769385273">"Dotaknite se tukaj, da spet vklopite obvestila."</string> + <string name="notifications_off_text" msgid="2529001315769385273">"Dotaknite se tukaj, da ponovno vklopite obvestila."</string> <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Zaslon se bo samodejno zasukal."</string> <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Zaslon je zaklenjen v ležeči usmerjenosti."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Zaslon je zaklenjen v pokončni usmerjenosti."</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 5f523a2..fd41e02 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -140,10 +140,8 @@ <string name="accessibility_clear_all" msgid="5235938559247164925">"Обриши сва обавештења."</string> <string name="dreams_dock_launcher" msgid="3541196417659166245">"Активирање чувара екрана"</string> <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Информације о апликацији"</string> - <!-- no translation found for notifications_off_title (8936620513608443224) --> - <skip /> - <!-- no translation found for notifications_off_text (2529001315769385273) --> - <skip /> + <string name="notifications_off_title" msgid="8936620513608443224">"Обавештења су искључена"</string> + <string name="notifications_off_text" msgid="2529001315769385273">"Додирните овде да бисте поново укључили обавештења."</string> <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Екран ће се аутоматски ротирати."</string> <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Екран је закључан у хоризонталном положају."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Екран је закључан у вертикалном положају."</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index dbb8d91..70f0b9b 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -140,14 +140,9 @@ <string name="accessibility_clear_all" msgid="5235938559247164925">"ล้างการแจ้งเตือนทั้งหมด"</string> <string name="dreams_dock_launcher" msgid="3541196417659166245">"เปิดโปรแกรมรักษาหน้าจอ"</string> <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"ข้อมูลแอป"</string> - <!-- no translation found for notifications_off_title (8936620513608443224) --> - <skip /> - <!-- no translation found for notifications_off_text (2529001315769385273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="notifications_off_title" msgid="8936620513608443224">"การแจ้งเตือนปิดอยู่"</string> + <string name="notifications_off_text" msgid="2529001315769385273">"แตะที่นี่เพื่อเปิดการแจ้งเตือนอีกครั้ง"</string> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"หน้าจอจะหมุนโดยอัตโนมัติ"</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ขณะนี้หน้าจอถูกล็อกให้วางในแนวนอน"</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ขณะนี้หน้าจอถูกล็อกให้วางในแนวตั้ง"</string> </resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index d0f08fc..9bf8f76 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -140,14 +140,9 @@ <string name="accessibility_clear_all" msgid="5235938559247164925">"Tüm bildirimleri temizle"</string> <string name="dreams_dock_launcher" msgid="3541196417659166245">"Ekran koruyucuyu etkinleştir"</string> <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Uygulama bilgileri"</string> - <!-- no translation found for notifications_off_title (8936620513608443224) --> - <skip /> - <!-- no translation found for notifications_off_text (2529001315769385273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="notifications_off_title" msgid="8936620513608443224">"Bildirimler kapalı"</string> + <string name="notifications_off_text" msgid="2529001315769385273">"Bildirimleri tekrar açmak için buraya hafifçe vurun."</string> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekran otomatik olarak dönecektir."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ekran yatay yönde kilitlendi."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekran dikey yönde kilitlendi."</string> </resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 0019c7c..02d0138 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -142,10 +142,7 @@ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Thông tin về ứng dụng"</string> <string name="notifications_off_title" msgid="8936620513608443224">"Tắt thông báo"</string> <string name="notifications_off_text" msgid="2529001315769385273">"Chạm vào đây để bật lại thông báo."</string> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Màn hinh sẽ xoay tự động."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Màn hình hiện bị khóa theo hướng ngang."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Màn hình hiện bị khóa theo hướng dọc."</string> </resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 8293d99..4f3e787 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -142,7 +142,7 @@ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Ulwazi lohlelo lokusebenza"</string> <string name="notifications_off_title" msgid="8936620513608443224">"Izaziso zivaliwe"</string> <string name="notifications_off_text" msgid="2529001315769385273">"Thepha lapha ukuvula futhi izaziso."</string> - <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Isikrini sizophenduka ngokuzanzakalela."</string> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Isikrini sizophenduka ngokuzenzakalela."</string> <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Isikrini sikhiyelwe ngomumo we-landscape."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Isikrini sikhiyelwe ngomumo we-portrait."</string> </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 9042045..0d79a9b 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -115,10 +115,10 @@ <dimen name="navbar_search_hit_radius">60dip</dimen> <!-- Diameter of outer shape drawable shown in navbar search--> - <dimen name="navbar_search_outerring_diameter">270dp</dimen> + <dimen name="navbar_search_outerring_diameter">340dp</dimen> <!-- Threshold for swipe-up gesture to activate search dialog --> - <dimen name="navbar_search_up_threshhold">20dip</dimen> + <dimen name="navbar_search_up_threshhold">40dip</dimen> <!-- Height of search panel including navigation bar height --> <dimen name="navbar_search_panel_height">230dip</dimen> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 144760e..af77a30 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -16,12 +16,6 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android"> - <style name="TextAppearance.StatusBar.Title" parent="@*android:style/TextAppearance.StatusBar"> - <item name="android:textAppearance">?android:attr/textAppearanceSmall</item> - <item name="android:textStyle">bold</item> - <item name="android:textColor">?android:attr/textColorPrimary</item> - </style> - <style name="TextAppearance.StatusBar.IntruderAlert" parent="@*android:style/TextAppearance.StatusBar"> </style> @@ -48,7 +42,7 @@ </style> <style name="TextAppearance.StatusBar.Date" parent="@*android:style/TextAppearance.StatusBar.Icon"> - <item name="android:textSize">16sp</item> + <item name="android:textSize">16dp</item> <item name="android:textStyle">normal</item> <item name="android:textColor">@android:color/holo_blue_light</item> </style> @@ -57,6 +51,7 @@ <style name="TextAppearance.StatusBar.Expanded.Clock"> <item name="android:textSize">32dp</item> + <item name="android:fontFamily">sans-serif-light</item> <item name="android:textStyle">normal</item> <item name="android:textColor">#ffffff</item> </style> diff --git a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java index 7a7afa7..ba3336b 100644 --- a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java +++ b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java @@ -31,7 +31,7 @@ import com.android.internal.widget.SizeAdaptiveLayout; public class ExpandHelper implements Gefingerpoken, OnClickListener { public interface Callback { - View getChildAtPosition(MotionEvent ev); + View getChildAtRawPosition(float x, float y); View getChildAtPosition(float x, float y); boolean canChildBeExpanded(View v); boolean setUserExpandedChild(View v, boolean userxpanded); @@ -62,6 +62,7 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener { private Context mContext; private boolean mStretching; + private View mEventSource; private View mCurrView; private View mCurrViewTopGlow; private View mCurrViewBottomGlow; @@ -141,7 +142,19 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener { @Override public boolean onScaleBegin(ScaleGestureDetector detector) { if (DEBUG) Log.v(TAG, "onscalebegin()"); - View v = mCallback.getChildAtPosition(detector.getFocusX(), detector.getFocusY()); + float x = detector.getFocusX(); + float y = detector.getFocusY(); + + View v = null; + if (mEventSource != null) { + int[] location = new int[2]; + mEventSource.getLocationOnScreen(location); + x += (float) location[0]; + y += (float) location[1]; + v = mCallback.getChildAtRawPosition(x, y); + } else { + v = mCallback.getChildAtPosition(x, y); + } // your fingers have to be somewhat close to the bounds of the view in question mInitialTouchFocusY = detector.getFocusY(); @@ -189,6 +202,11 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener { } }); } + + public void setEventSource(View eventSource) { + mEventSource = eventSource; + } + public void setGlow(float glow) { if (!mGlowAnimationSet.isRunning() || glow == 0f) { if (mGlowAnimationSet.isRunning()) { @@ -211,7 +229,6 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener { } } } - public boolean onInterceptTouchEvent(MotionEvent ev) { if (DEBUG) Log.d(TAG, "interceptTouch: act=" + (ev.getAction()) + " stretching=" + mStretching); @@ -223,11 +240,13 @@ public class ExpandHelper implements Gefingerpoken, OnClickListener { final int action = ev.getAction(); if (DEBUG) Log.d(TAG, "touch: act=" + (action) + " stretching=" + mStretching); if (mStretching) { + if (DEBUG) Log.d(TAG, "detector ontouch"); mDetector.onTouchEvent(ev); } switch (action) { case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: + if (DEBUG) Log.d(TAG, "cancel"); mStretching = false; clearView(); break; diff --git a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java index 57f15a8..6b0bb87 100644 --- a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java @@ -23,13 +23,15 @@ import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.speech.RecognizerIntent; +import android.content.pm.PackageManager; import android.util.AttributeSet; import android.util.Log; import android.util.Slog; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.view.ViewTreeObserver.OnPreDrawListener; import android.widget.FrameLayout; import com.android.internal.widget.multiwaveview.MultiWaveView; @@ -68,8 +70,36 @@ public class SearchPanelView extends FrameLayout implements private SearchManager mSearchManager; + // This code should be the same as that used in LockScreen.java public boolean isAssistantAvailable() { - return mSearchManager != null && mSearchManager.getGlobalSearchActivity() != null; + Intent intent = getAssistIntent(); + return intent == null ? false + : mContext.getPackageManager().queryIntentActivities(intent, + PackageManager.MATCH_DEFAULT_ONLY).size() > 0; + } + + private Intent getAssistIntent() { + Intent intent = null; + SearchManager searchManager = getSearchManager(); + if (searchManager != null) { + ComponentName globalSearchActivity = searchManager.getGlobalSearchActivity(); + if (globalSearchActivity != null) { + intent = new Intent(Intent.ACTION_ASSIST); + intent.setPackage(globalSearchActivity.getPackageName()); + } else { + Slog.w(TAG, "No global search activity"); + } + } else { + Slog.w(TAG, "No SearchManager"); + } + return intent; + } + + private SearchManager getSearchManager() { + if (mSearchManager == null) { + mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); + } + return mSearchManager; } private void startAssistActivity() { @@ -146,6 +176,14 @@ public class SearchPanelView extends FrameLayout implements } } + private OnPreDrawListener mPreDrawListener = new ViewTreeObserver.OnPreDrawListener() { + public boolean onPreDraw() { + getViewTreeObserver().removeOnPreDrawListener(this); + mMultiWaveView.resumeAnimations(); + return false; + } + }; + public void show(final boolean show, boolean animate) { if (animate) { if (mShowing != show) { @@ -156,16 +194,20 @@ public class SearchPanelView extends FrameLayout implements mShowing = show; onAnimationEnd(null); } - postDelayed(new Runnable() { - public void run() { - setVisibility(show ? View.VISIBLE : View.INVISIBLE); - if (show) { - setFocusable(true); - setFocusableInTouchMode(true); - requestFocus(); - } + if (show) { + if (getVisibility() != View.VISIBLE) { + setVisibility(View.VISIBLE); + // Don't start the animation until we've created the layer, which is done + // right before we are drawn + mMultiWaveView.suspendAnimations(); + getViewTreeObserver().addOnPreDrawListener(mPreDrawListener); } - }, show ? 0 : 100); + setFocusable(true); + setFocusableInTouchMode(true); + requestFocus(); + } else { + setVisibility(View.INVISIBLE); + } } public void hide(boolean animate) { diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java index 6584c7d..2d65dd6 100644 --- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java @@ -186,6 +186,7 @@ public class SwipeHelper implements Gefingerpoken { public void removeLongPressCallback() { if (mWatchLongPress != null) { mHandler.removeCallbacks(mWatchLongPress); + mWatchLongPress = null; } } @@ -245,6 +246,7 @@ public class SwipeHelper implements Gefingerpoken { mCurrView = null; mCurrAnimView = null; mLongPressSent = false; + removeLongPressCallback(); break; } return mDragging; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 4b223dd..a352748 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -531,30 +531,27 @@ public abstract class BaseStatusBar extends SystemUI implements } } catch (RuntimeException e) { - exception = e; - } - if (expandedOneU == null && expandedLarge == null) { final String ident = sbn.pkg + "/0x" + Integer.toHexString(sbn.id); - Slog.e(TAG, "couldn't inflate view for notification " + ident, exception); + Slog.e(TAG, "couldn't inflate view for notification " + ident, e); return false; - } else { - if (expandedOneU != null) { - SizeAdaptiveLayout.LayoutParams params = - new SizeAdaptiveLayout.LayoutParams(expandedOneU.getLayoutParams()); - params.minHeight = minHeight; - params.maxHeight = minHeight; - adaptive.addView(expandedOneU, params); - } - if (expandedLarge != null) { - SizeAdaptiveLayout.LayoutParams params = - new SizeAdaptiveLayout.LayoutParams(expandedLarge.getLayoutParams()); - params.minHeight = minHeight+1; - params.maxHeight = maxHeight; - adaptive.addView(expandedLarge, params); - } - row.setDrawingCacheEnabled(true); } + if (expandedOneU != null) { + SizeAdaptiveLayout.LayoutParams params = + new SizeAdaptiveLayout.LayoutParams(expandedOneU.getLayoutParams()); + params.minHeight = rowHeight; + params.maxHeight = rowHeight; + adaptive.addView(expandedOneU, params); + } + if (expandedLarge != null) { + SizeAdaptiveLayout.LayoutParams params = + new SizeAdaptiveLayout.LayoutParams(expandedLarge.getLayoutParams()); + params.minHeight = rowHeight+1; + params.maxHeight = maxHeight; + adaptive.addView(expandedLarge, params); + } + row.setDrawingCacheEnabled(true); + applyLegacyRowBackground(sbn, content); row.setTag(R.id.expandable_tag, Boolean.valueOf(large != null)); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java index 0e6dfd5..7edeaef 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java @@ -63,7 +63,8 @@ public class DelegateViewHelper { break; } if (mDelegateView != null) { - if (mDelegateView.getVisibility() != View.VISIBLE && event.getAction() != MotionEvent.ACTION_CANCEL) { + if (mDelegateView.getVisibility() != View.VISIBLE + && event.getAction() != MotionEvent.ACTION_CANCEL) { final boolean isVertical = (mOrientation == Surface.ROTATION_90 || mOrientation == Surface.ROTATION_270); final int historySize = event.getHistorySize(); 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 287c2922..4e6857e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -289,7 +289,7 @@ public class PhoneStatusBar extends BaseStatusBar { animateCollapse(); } } - return true; + return mStatusBarWindow.onTouchEvent(event); }}); mStatusBarView = (PhoneStatusBarView) mStatusBarWindow.findViewById(R.id.status_bar); @@ -991,13 +991,12 @@ public class PhoneStatusBar extends BaseStatusBar { // Expand the window to encompass the full screen in anticipation of the drag. // This is only possible to do atomically because the status bar is at the top of the screen! WindowManager.LayoutParams lp = (WindowManager.LayoutParams) mStatusBarWindow.getLayoutParams(); - lp.flags &= (~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); + lp.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + lp.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; lp.height = ViewGroup.LayoutParams.MATCH_PARENT; final WindowManager wm = WindowManagerImpl.getDefault(); wm.updateViewLayout(mStatusBarWindow, lp); - mStatusBarWindow.requestFocus(View.FOCUS_FORWARD); - visibilityChanged(true); } @@ -1084,7 +1083,8 @@ public class PhoneStatusBar extends BaseStatusBar { // Shrink the window to the size of the status bar only WindowManager.LayoutParams lp = (WindowManager.LayoutParams) mStatusBarWindow.getLayoutParams(); lp.height = getStatusBarHeight(); - lp.flags |= (WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); + lp.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + lp.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; final WindowManager wm = WindowManagerImpl.getDefault(); wm.updateViewLayout(mStatusBarWindow, lp); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index 0fc5b4d..ed1b2f5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -18,17 +18,39 @@ package com.android.systemui.statusbar.phone; import android.content.Context; import android.util.AttributeSet; +import android.util.Log; import android.view.KeyEvent; +import android.view.MotionEvent; import android.widget.FrameLayout; import android.widget.TextSwitcher; +import com.android.systemui.ExpandHelper; +import com.android.systemui.R; +import com.android.systemui.statusbar.policy.NotificationRowLayout; + public class StatusBarWindowView extends FrameLayout { + private static final String TAG = "StatusBarWindowView"; + + private ExpandHelper mExpandHelper; + private NotificationRowLayout latestItems; + PhoneStatusBar mService; public StatusBarWindowView(Context context, AttributeSet attrs) { super(context, attrs); + setMotionEventSplittingEnabled(false); + } + + @Override + protected void onAttachedToWindow () { + super.onAttachedToWindow(); + latestItems = (NotificationRowLayout) findViewById(R.id.latestItems); + int minHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_min_height); + int maxHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_max_height); + mExpandHelper = new ExpandHelper(mContext, latestItems, minHeight, maxHeight); + mExpandHelper.setEventSource(this); } @Override @@ -43,5 +65,25 @@ public class StatusBarWindowView extends FrameLayout } return super.dispatchKeyEvent(event); } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + MotionEvent cancellation = MotionEvent.obtain(ev); + cancellation.setAction(MotionEvent.ACTION_CANCEL); + + boolean intercept = mExpandHelper.onInterceptTouchEvent(ev) || + super.onInterceptTouchEvent(ev); + if (intercept) { + latestItems.onInterceptTouchEvent(cancellation); + } + return intercept; + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + boolean handled = mExpandHelper.onTouchEvent(ev) || + super.onTouchEvent(ev); + return handled; + } } 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 a00fab3..bb0ce16 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java @@ -52,6 +52,7 @@ public class KeyButtonView extends ImageView { int mCode; int mTouchSlop; Drawable mGlowBG; + int mGlowWidth, mGlowHeight; float mGlowAlpha = 0f, mGlowScale = 1f, mDrawingAlpha = 1f; boolean mSupportsLongpress = true; RectF mRect = new RectF(0f,0f,0f,0f); @@ -89,6 +90,8 @@ public class KeyButtonView extends ImageView { mGlowBG = a.getDrawable(R.styleable.KeyButtonView_glowBackground); if (mGlowBG != null) { setDrawingAlpha(BUTTON_QUIESCENT_ALPHA); + mGlowWidth = mGlowBG.getIntrinsicWidth(); + mGlowHeight = mGlowBG.getIntrinsicHeight(); } a.recycle(); @@ -103,8 +106,12 @@ public class KeyButtonView extends ImageView { canvas.save(); final int w = getWidth(); final int h = getHeight(); + final float aspect = (float)mGlowWidth / mGlowHeight; + final int drawW = (int)(h*aspect); + final int drawH = h; + final int margin = (drawW-w)/2; canvas.scale(mGlowScale, mGlowScale, w*0.5f, h*0.5f); - mGlowBG.setBounds(0, 0, w, h); + mGlowBG.setBounds(-margin, 0, drawW-margin, drawH); mGlowBG.setAlpha((int)(mDrawingAlpha * mGlowAlpha * 255)); mGlowBG.draw(canvas); canvas.restore(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java index f41d99c..0284644 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java @@ -36,7 +36,6 @@ import android.view.inputmethod.InputMethodManager; import android.widget.LinearLayout; import com.android.systemui.ExpandHelper; -import com.android.systemui.Gefingerpoken; import com.android.systemui.R; import com.android.systemui.SwipeHelper; import com.android.systemui.statusbar.NotificationData; @@ -62,9 +61,6 @@ public class NotificationRowLayout HashMap<View, ValueAnimator> mDisappearingViews = new HashMap<View, ValueAnimator>(); private SwipeHelper mSwipeHelper; - private ExpandHelper mExpandHelper; - - private Gefingerpoken mCurrentHelper; // Flag set during notification removal animation to avoid causing too much work until // animation is done @@ -81,8 +77,6 @@ public class NotificationRowLayout setOrientation(LinearLayout.VERTICAL); - setMotionEventSplittingEnabled(false); - if (DEBUG) { setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() { @Override @@ -101,9 +95,6 @@ public class NotificationRowLayout float densityScale = getResources().getDisplayMetrics().density; float pagingTouchSlop = ViewConfiguration.get(mContext).getScaledPagingTouchSlop(); mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, pagingTouchSlop); - int minHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_min_height); - int maxHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_max_height); - mExpandHelper = new ExpandHelper(mContext, this, minHeight, maxHeight); } public void setLongPressListener(View.OnLongClickListener listener) { @@ -135,39 +126,17 @@ public class NotificationRowLayout if (DEBUG) Log.v(TAG, "onInterceptTouchEvent()"); if (DEBUG) logLayoutTransition(); - MotionEvent cancellation = MotionEvent.obtain(ev); - cancellation.setAction(MotionEvent.ACTION_CANCEL); - - if (mSwipeHelper.onInterceptTouchEvent(ev)) { - if (DEBUG) Log.v(TAG, "will swipe"); - mCurrentHelper = mSwipeHelper; - mExpandHelper.onInterceptTouchEvent(cancellation); - return true; - } else if (mExpandHelper.onInterceptTouchEvent(ev)) { - if (DEBUG) Log.v(TAG, "will stretch"); - mCurrentHelper = mExpandHelper; - mSwipeHelper.onInterceptTouchEvent(cancellation); - return true; - } else { - mCurrentHelper = null; - if (super.onInterceptTouchEvent(ev)) { - if (DEBUG) Log.v(TAG, "intercepting ourselves"); - mSwipeHelper.onInterceptTouchEvent(cancellation); - mExpandHelper.onInterceptTouchEvent(cancellation); - return true; - } - } - return false; + return mSwipeHelper.onInterceptTouchEvent(ev) || + super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent ev) { if (DEBUG) Log.v(TAG, "onTouchEvent()"); if (DEBUG) logLayoutTransition(); - if (mCurrentHelper != null) { - return mCurrentHelper.onTouchEvent(ev); - } - return super.onTouchEvent(ev); + + return mSwipeHelper.onTouchEvent(ev) || + super.onTouchEvent(ev); } public boolean canChildBeDismissed(View v) { @@ -202,6 +171,13 @@ public class NotificationRowLayout public View getChildAtPosition(MotionEvent ev) { return getChildAtPosition(ev.getX(), ev.getY()); } + + public View getChildAtRawPosition(float touchX, float touchY) { + int[] location = new int[2]; + getLocationOnScreen(location); + return getChildAtPosition((float) (touchX - location[0]), (float) (touchY - location[1])); + } + public View getChildAtPosition(float touchX, float touchY) { // find the view under the pointer, accounting for GONE views final int count = getChildCount(); diff --git a/policy/src/com/android/internal/policy/impl/LockScreen.java b/policy/src/com/android/internal/policy/impl/LockScreen.java index 8ea334e..22f70a5 100644 --- a/policy/src/com/android/internal/policy/impl/LockScreen.java +++ b/policy/src/com/android/internal/policy/impl/LockScreen.java @@ -32,6 +32,7 @@ import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; import android.os.Vibrator; @@ -45,7 +46,6 @@ import android.util.Slog; import android.media.AudioManager; import android.os.RemoteException; import android.provider.MediaStore; -import android.provider.Settings; import java.io.File; @@ -252,13 +252,19 @@ class LockScreen extends LinearLayout implements KeyguardScreen { } } + // This code should be the same as that in SearchPanelView + public boolean isAssistantAvailable() { + Intent intent = getAssistIntent(); + return intent == null ? false + : mContext.getPackageManager().queryIntentActivities(intent, + PackageManager.MATCH_DEFAULT_ONLY).size() > 0; + } + private Intent getAssistIntent() { Intent intent = null; - if (mSearchManager == null) { - mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); - } - if (mSearchManager != null) { - ComponentName globalSearchActivity = mSearchManager.getGlobalSearchActivity(); + SearchManager searchManager = getSearchManager(); + if (searchManager != null) { + ComponentName globalSearchActivity = searchManager.getGlobalSearchActivity(); if (globalSearchActivity != null) { intent = new Intent(Intent.ACTION_ASSIST); intent.setPackage(globalSearchActivity.getPackageName()); @@ -271,6 +277,13 @@ class LockScreen extends LinearLayout implements KeyguardScreen { return intent; } + private SearchManager getSearchManager() { + if (mSearchManager == null) { + mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); + } + return mSearchManager; + } + class MultiWaveViewMethods implements MultiWaveView.OnTriggerListener, UnlockWidgetCommonMethods { private final MultiWaveView mMultiWaveView; @@ -517,14 +530,12 @@ class LockScreen extends LinearLayout implements KeyguardScreen { .isTargetPresent(com.android.internal.R.drawable.ic_lockscreen_search) : false; - // TODO: test to see if search is available - boolean searchActionAvailable = true; - if (disabledByAdmin) { Log.v(TAG, "Camera disabled by Device Policy"); } else if (disabledBySimState) { Log.v(TAG, "Camera disabled by Sim State"); } + boolean searchActionAvailable = isAssistantAvailable(); mCameraDisabled = disabledByAdmin || disabledBySimState || !cameraTargetPresent; mSearchDisabled = disabledBySimState || !searchActionAvailable || !searchTargetPresent; mUnlockWidgetMethods.updateResources(); diff --git a/policy/src/com/android/internal/policy/impl/PatternUnlockScreen.java b/policy/src/com/android/internal/policy/impl/PatternUnlockScreen.java index 17e671d..9a6d2cc 100644 --- a/policy/src/com/android/internal/policy/impl/PatternUnlockScreen.java +++ b/policy/src/com/android/internal/policy/impl/PatternUnlockScreen.java @@ -41,7 +41,7 @@ import java.util.List; class PatternUnlockScreen extends LinearLayoutWithDefaultTouchRecepient implements KeyguardScreen { - private static final boolean DEBUG = true; /* TODO: revert before JB release */ + private static final boolean DEBUG = false; private static final String TAG = "UnlockScreen"; // how long before we clear the wrong pattern @@ -321,7 +321,6 @@ class PatternUnlockScreen extends LinearLayoutWithDefaultTouchRecepient implements LockPatternView.OnPatternListener { public void onPatternStart() { - if (DEBUG) Log.d(TAG, "Got pattern start"); mLockPatternView.removeCallbacks(mCancelPatternRunnable); } @@ -337,7 +336,6 @@ class PatternUnlockScreen extends LinearLayoutWithDefaultTouchRecepient // Give just a little extra time if they hit one of the first few dots mCallback.pokeWakelock(UNLOCK_PATTERN_WAKE_INTERVAL_FIRST_DOTS_MS); } - if (DEBUG) Log.d(TAG, "Got pattern cell"); } public void onPatternDetected(List<LockPatternView.Cell> pattern) { diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index cc7050a..9629f0a 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -79,6 +79,7 @@ import android.view.SurfaceHolder; import android.view.View; import android.view.ViewGroup; import android.view.ViewManager; +import android.view.ViewParent; import android.view.ViewStub; import android.view.Window; import android.view.WindowManager; @@ -582,7 +583,10 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { st.decorView.setWindowBackground(getContext().getResources().getDrawable( backgroundResId)); - + ViewParent shownPanelParent = st.shownPanelView.getParent(); + if (shownPanelParent != null && shownPanelParent instanceof ViewGroup) { + ((ViewGroup) shownPanelParent).removeView(st.shownPanelView); + } st.decorView.addView(st.shownPanelView, lp); /* diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 3147ba7..8ab148e 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -179,7 +179,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { static final int LONG_PRESS_HOME_NOTHING = 0; static final int LONG_PRESS_HOME_RECENT_DIALOG = 1; static final int LONG_PRESS_HOME_RECENT_SYSTEM_UI = 2; - static final int LONG_PRESS_HOME_VOICE_SEARCH = 3; // wallpaper is at the bottom, though the window manager may move it. static final int WALLPAPER_LAYER = 2; @@ -322,7 +321,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { static final int RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS = 0; static final int RECENT_APPS_BEHAVIOR_EXIT_TOUCH_MODE_AND_SHOW = 1; - static final int RECENT_APPS_BEHAVIOR_DISMISS_AND_SWITCH = 2; + static final int RECENT_APPS_BEHAVIOR_DISMISS = 2; + static final int RECENT_APPS_BEHAVIOR_DISMISS_AND_SWITCH = 3; RecentApplicationsDialog mRecentAppsDialog; int mRecentAppsDialogHeldModifiers; @@ -758,9 +758,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { mLongPressOnHomeBehavior > LONG_PRESS_HOME_RECENT_SYSTEM_UI) { mLongPressOnHomeBehavior = LONG_PRESS_HOME_NOTHING; } - if (hasNavigationBar()) { - mLongPressOnHomeBehavior = LONG_PRESS_HOME_VOICE_SEARCH; - } } if (mLongPressOnHomeBehavior != LONG_PRESS_HOME_NOTHING) { @@ -780,18 +777,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { } catch (RemoteException e) { Slog.e(TAG, "RemoteException when showing recent apps", e); } - } else if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_VOICE_SEARCH) { - Intent intent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH); - try { - intent.setFlags( - Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); - mContext.startActivity(intent); - } catch (ActivityNotFoundException e) { - Log.e(TAG, "Unable to launch. tag=" + TAG + " intent=" + intent, e); - } catch (SecurityException e) { - Log.e(TAG, "PhoneWindowManager does not have the permission to launch " + - "tag=" + TAG + " intent=" + intent, e); - } } } @@ -809,6 +794,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mRecentAppsDialog.isShowing()) { switch (behavior) { case RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS: + case RECENT_APPS_BEHAVIOR_DISMISS: mRecentAppsDialog.dismiss(); break; case RECENT_APPS_BEHAVIOR_DISMISS_AND_SWITCH: @@ -830,6 +816,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } mRecentAppsDialog.show(); break; + case RECENT_APPS_BEHAVIOR_DISMISS: case RECENT_APPS_BEHAVIOR_DISMISS_AND_SWITCH: default: break; @@ -1849,7 +1836,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } return 0; } else if (keyCode == KeyEvent.KEYCODE_APP_SWITCH) { - if (down && repeatCount == 0) { + if (down && repeatCount == 0 && !keyguardOn) { showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS); } return -1; @@ -1886,27 +1873,29 @@ public class PhoneWindowManager implements WindowManagerPolicy { } // Invoke shortcuts using Meta. - if (down && repeatCount == 0 + if (down && repeatCount == 0 && !keyguardOn && (metaState & KeyEvent.META_META_ON) != 0) { final KeyCharacterMap kcm = event.getKeyCharacterMap(); - Intent shortcutIntent = mShortcutManager.getIntent(kcm, keyCode, - metaState & ~(KeyEvent.META_META_ON - | KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_RIGHT_ON)); - if (shortcutIntent != null) { - shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - try { - mContext.startActivity(shortcutIntent); - } catch (ActivityNotFoundException ex) { - Slog.w(TAG, "Dropping shortcut key combination because " - + "the activity to which it is registered was not found: " - + "META+" + KeyEvent.keyCodeToString(keyCode), ex); + if (kcm.isPrintingKey(keyCode)) { + Intent shortcutIntent = mShortcutManager.getIntent(kcm, keyCode, + metaState & ~(KeyEvent.META_META_ON + | KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_RIGHT_ON)); + if (shortcutIntent != null) { + shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + try { + mContext.startActivity(shortcutIntent); + } catch (ActivityNotFoundException ex) { + Slog.w(TAG, "Dropping shortcut key combination because " + + "the activity to which it is registered was not found: " + + "META+" + KeyEvent.keyCodeToString(keyCode), ex); + } + return -1; } - return -1; } } // Handle application launch keys. - if (down && repeatCount == 0) { + if (down && repeatCount == 0 && !keyguardOn) { String category = sApplicationLaunchKeyCategories.get(keyCode); if (category != null) { Intent intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, category); @@ -1924,7 +1913,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Display task switcher for ALT-TAB or Meta-TAB. if (down && repeatCount == 0 && keyCode == KeyEvent.KEYCODE_TAB) { - if (mRecentAppsDialogHeldModifiers == 0) { + if (mRecentAppsDialogHeldModifiers == 0 && !keyguardOn) { final int shiftlessModifiers = event.getModifiers() & ~KeyEvent.META_SHIFT_MASK; if (KeyEvent.metaStateHasModifiers(shiftlessModifiers, KeyEvent.META_ALT_ON) || KeyEvent.metaStateHasModifiers( @@ -1937,7 +1926,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { } else if (!down && mRecentAppsDialogHeldModifiers != 0 && (metaState & mRecentAppsDialogHeldModifiers) == 0) { mRecentAppsDialogHeldModifiers = 0; - showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_DISMISS_AND_SWITCH); + showOrHideRecentAppsDialog(keyguardOn ? RECENT_APPS_BEHAVIOR_DISMISS : + RECENT_APPS_BEHAVIOR_DISMISS_AND_SWITCH); } // Let the application handle the key. diff --git a/services/input/EventHub.cpp b/services/input/EventHub.cpp index 50bfee6..f80ac18 100644 --- a/services/input/EventHub.cpp +++ b/services/input/EventHub.cpp @@ -16,7 +16,7 @@ #define LOG_TAG "EventHub" -#define LOG_NDEBUG 0 +// #define LOG_NDEBUG 0 #include "EventHub.h" @@ -767,7 +767,11 @@ size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSiz size_t count = size_t(readSize) / sizeof(struct input_event); for (size_t i = 0; i < count; i++) { const struct input_event& iev = readBuffer[i]; - nsecs_t delta = 0; + ALOGV("%s got: t0=%d, t1=%d, type=%d, code=%d, value=%d", + device->path.string(), + (int) iev.time.tv_sec, (int) iev.time.tv_usec, + iev.type, iev.code, iev.value); + #ifdef HAVE_POSIX_CLOCKS // Use the time specified in the event instead of the current time // so that downstream code can get more accurate estimates of @@ -782,23 +786,10 @@ size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSiz // system call that also queries ktime_get_ts(). event->when = nsecs_t(iev.time.tv_sec) * 1000000000LL + nsecs_t(iev.time.tv_usec) * 1000LL; - delta = now - event->when; - - // Only log verbose if events are older that 1ms - if (delta > 1 * 1000000LL) { - ALOGV("event time %lld, now %lld, delta %lldus", event->when, now, delta / 1000LL); - } + ALOGV("event time %lld, now %lld", event->when, now); #else event->when = now; #endif - if (delta > 1 * 1000000LL) { - ALOGV("%s got: t0=%d, t1=%d, type=%d, code=%d, value=%d", - device->path.string(), - (int) iev.time.tv_sec, (int) iev.time.tv_usec, - iev.type, iev.code, iev.value); - } - - event->deviceId = deviceId; event->type = iev.type; event->code = iev.code; diff --git a/services/java/com/android/server/AppWidgetServiceImpl.java b/services/java/com/android/server/AppWidgetServiceImpl.java index 23f2fdd..df2e1aa 100644 --- a/services/java/com/android/server/AppWidgetServiceImpl.java +++ b/services/java/com/android/server/AppWidgetServiceImpl.java @@ -49,6 +49,7 @@ import android.util.Pair; import android.util.Slog; import android.util.TypedValue; import android.util.Xml; +import android.view.WindowManager; import android.widget.RemoteViews; import com.android.internal.appwidget.IAppWidgetHost; @@ -171,6 +172,7 @@ class AppWidgetServiceImpl { boolean mSafeMode; int mUserId; boolean mStateLoaded; + int mMaxWidgetBitmapMemory; // These are for debugging only -- widgets are going missing in some rare instances ArrayList<Provider> mDeletedProviders = new ArrayList<Provider>(); @@ -181,6 +183,14 @@ class AppWidgetServiceImpl { mPm = AppGlobals.getPackageManager(); mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); mUserId = userId; + computeMaximumWidgetBitmapMemory(); + } + + void computeMaximumWidgetBitmapMemory() { + WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); + int height = wm.getDefaultDisplay().getRawHeight(); + int width = wm.getDefaultDisplay().getRawWidth(); + mMaxWidgetBitmapMemory = 4 * width * height; } public void systemReady(boolean safeMode) { @@ -806,6 +816,15 @@ class AppWidgetServiceImpl { if (appWidgetIds == null) { return; } + + int bitmapMemoryUsage = views.estimateMemoryUsage(); + if (bitmapMemoryUsage > mMaxWidgetBitmapMemory) { + throw new IllegalArgumentException("RemoteViews for widget update exceeds maximum" + + " bitmap memory usage (used: " + bitmapMemoryUsage + ", max: " + + mMaxWidgetBitmapMemory + ") The total memory cannot exceed that required to" + + " fill the device's screen once."); + } + if (appWidgetIds.length == 0) { return; } diff --git a/services/java/com/android/server/NativeDaemonConnector.java b/services/java/com/android/server/NativeDaemonConnector.java index 6a6c585..a15d3bb 100644 --- a/services/java/com/android/server/NativeDaemonConnector.java +++ b/services/java/com/android/server/NativeDaemonConnector.java @@ -148,6 +148,7 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo mCallbackHandler.sendMessage(mCallbackHandler.obtainMessage( event.getCode(), event.getRawEvent())); } else { + log("POST<- {" + rawEvent + "}"); mResponseQueue.add(event.getCmdNumber(), event); } } catch (IllegalArgumentException e) { @@ -327,6 +328,7 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo loge("timed-out waiting for response to " + logCmd); throw new NativeDaemonFailureException(logCmd, event); } + log("RMV <- {" + event + "}"); events.add(event); } while (event.isClassContinue()); @@ -337,6 +339,7 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo throw new NativeDaemonFailureException(logCmd, event); } + log("RTN <- {" + logCmd + "}"); return events.toArray(new NativeDaemonEvent[events.size()]); } diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java index 4536a6d..e2852b5 100644 --- a/services/java/com/android/server/NetworkManagementService.java +++ b/services/java/com/android/server/NetworkManagementService.java @@ -166,7 +166,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub } mConnector = new NativeDaemonConnector( - new NetdCallbackReceiver(), "netd", 10, NETD_TAG, 50); + new NetdCallbackReceiver(), "netd", 10, NETD_TAG, 80); mThread = new Thread(mConnector, NETD_TAG); // Add ourself to the Watchdog monitors. diff --git a/services/java/com/android/server/StatusBarManagerService.java b/services/java/com/android/server/StatusBarManagerService.java index 8429086..78c0c12 100644 --- a/services/java/com/android/server/StatusBarManagerService.java +++ b/services/java/com/android/server/StatusBarManagerService.java @@ -489,7 +489,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub synchronized (mNotifications) { final StatusBarNotification n = mNotifications.remove(key); if (n == null) { - throw new IllegalArgumentException("removeNotification key not found: " + key); + Slog.e(TAG, "removeNotification key not found: " + key); + return; } if (mBar != null) { try { diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java index bb38cd9..b1558c7 100644 --- a/services/java/com/android/server/WifiService.java +++ b/services/java/com/android/server/WifiService.java @@ -562,6 +562,8 @@ public class WifiService extends IWifiManager.Stub { */ public synchronized boolean setWifiEnabled(boolean enable) { enforceChangePermission(); + Slog.d(TAG, "setWifiEnabled: " + enable + " pid=" + Binder.getCallingPid() + + ", uid=" + Binder.getCallingUid()); if (DBG) { Slog.e(TAG, "Invoking mWifiStateMachine.setWifiEnabled\n"); } diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java index 1937bad..f23b25e 100644 --- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -35,6 +35,7 @@ import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.content.pm.ServiceInfo; import android.database.ContentObserver; import android.graphics.Rect; import android.hardware.input.InputManager; @@ -532,6 +533,18 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub for (int i = 0, count = installedServices.size(); i < count; i++) { ResolveInfo resolveInfo = installedServices.get(i); + ServiceInfo serviceInfo = resolveInfo.serviceInfo; + // For now we are enforcing this if the target version is JellyBean or + // higher and in a later release we will enforce this for everyone. + if (serviceInfo.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN + && !android.Manifest.permission.BIND_ACCESSIBILITY_SERVICE.equals( + serviceInfo.permission)) { + Slog.w(LOG_TAG, "Skipping accessibilty service " + new ComponentName( + serviceInfo.packageName, serviceInfo.name).flattenToShortString() + + ": it does not require the permission " + + android.Manifest.permission.BIND_ACCESSIBILITY_SERVICE); + continue; + } AccessibilityServiceInfo accessibilityServiceInfo; try { accessibilityServiceInfo = new AccessibilityServiceInfo(resolveInfo, mContext); diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 54ef724..76016f4 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -3510,31 +3510,36 @@ public final class ActivityManagerService extends ActivityManagerNative public void closeSystemDialogs(String reason) { enforceNotIsolatedCaller("closeSystemDialogs"); + + final int uid = Binder.getCallingUid(); + final long origId = Binder.clearCallingIdentity(); + synchronized (this) { + closeSystemDialogsLocked(uid, reason); + } + Binder.restoreCallingIdentity(origId); + } + + void closeSystemDialogsLocked(int callingUid, String reason) { Intent intent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); if (reason != null) { intent.putExtra("reason", reason); } + mWindowManager.closeSystemDialogs(reason); - final int uid = Binder.getCallingUid(); - final long origId = Binder.clearCallingIdentity(); - synchronized (this) { - mWindowManager.closeSystemDialogs(reason); - - for (int i=mMainStack.mHistory.size()-1; i>=0; i--) { - ActivityRecord r = (ActivityRecord)mMainStack.mHistory.get(i); - if ((r.info.flags&ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS) != 0) { - r.stack.finishActivityLocked(r, i, - Activity.RESULT_CANCELED, null, "close-sys"); - } + for (int i=mMainStack.mHistory.size()-1; i>=0; i--) { + ActivityRecord r = (ActivityRecord)mMainStack.mHistory.get(i); + if ((r.info.flags&ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS) != 0) { + r.stack.finishActivityLocked(r, i, + Activity.RESULT_CANCELED, null, "close-sys"); } - - broadcastIntentLocked(null, null, intent, null, - null, 0, null, null, null, false, false, -1, uid, 0 /* TODO: Verify */); } - Binder.restoreCallingIdentity(origId); + + broadcastIntentLocked(null, null, intent, null, + null, 0, null, null, null, false, false, -1, + callingUid, 0 /* TODO: Verify */); } - + public Debug.MemoryInfo[] getProcessMemoryInfo(int[] pids) throws RemoteException { enforceNotIsolatedCaller("getProcessMemoryInfo"); diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index e6f4d918..5b15e50 100755 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -52,6 +52,7 @@ import android.os.IBinder; import android.os.Message; import android.os.ParcelFileDescriptor; import android.os.PowerManager; +import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; import android.os.UserId; @@ -2532,6 +2533,10 @@ final class ActivityStack { mDismissKeyguardOnNextActivity = false; mService.mWindowManager.dismissKeyguard(); } + if (err >= ActivityManager.START_SUCCESS && + (launchFlags&Intent.FLAG_ACTIVITY_CLOSE_SYSTEM_DIALOGS) != 0) { + mService.closeSystemDialogsLocked(Process.myUid(), "launch"); + } return err; } diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java index cba92f3..5516dea 100644 --- a/services/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/java/com/android/server/wm/WindowStateAnimator.java @@ -935,6 +935,59 @@ class WindowStateAnimator { mDtDy = mWin.mGlobalScale; } + void updateSurfaceWindowCrop(final boolean recoveringMemory) { + final WindowState w = mWin; + + // Need to recompute a new system decor rect each time. + if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) { + // Currently can't do this cropping for scaled windows. We'll + // just keep the crop rect the same as the source surface. + w.mSystemDecorRect.set(0, 0, w.mRequestedWidth, w.mRequestedHeight); + } else if (w.mLayer >= mService.mSystemDecorLayer) { + // Above the decor layer is easy, just use the entire window. + w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), + w.mCompatFrame.height()); + } else { + final Rect decorRect = mService.mSystemDecorRect; + // Compute the offset of the window in relation to the decor rect. + final int offX = w.mXOffset + w.mFrame.left; + final int offY = w.mYOffset + w.mFrame.top; + // Initialize the decor rect to the entire frame. + w.mSystemDecorRect.set(0, 0, w.mFrame.width(), w.mFrame.height()); + // Intersect with the decor rect, offsetted by window position. + w.mSystemDecorRect.intersect(decorRect.left-offX, decorRect.top-offY, + decorRect.right-offX, decorRect.bottom-offY); + // If size compatibility is being applied to the window, the + // surface is scaled relative to the screen. Also apply this + // scaling to the crop rect. We aren't using the standard rect + // scale function because we want to round things to make the crop + // always round to a larger rect to ensure we don't crop too + // much and hide part of the window that should be seen. + if (w.mEnforceSizeCompat && w.mInvGlobalScale != 1.0f) { + final float scale = w.mInvGlobalScale; + w.mSystemDecorRect.left = (int) (w.mSystemDecorRect.left * scale - 0.5f); + w.mSystemDecorRect.top = (int) (w.mSystemDecorRect.top * scale - 0.5f); + w.mSystemDecorRect.right = (int) ((w.mSystemDecorRect.right+1) * scale - 0.5f); + w.mSystemDecorRect.bottom = (int) ((w.mSystemDecorRect.bottom+1) * scale - 0.5f); + } + } + + if (!w.mSystemDecorRect.equals(w.mLastSystemDecorRect)) { + w.mLastSystemDecorRect.set(w.mSystemDecorRect); + try { + if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, + "CROP " + w.mSystemDecorRect.toShortString(), null); + mSurface.setWindowCrop(w.mSystemDecorRect); + } catch (RuntimeException e) { + Slog.w(TAG, "Error setting crop surface of " + w + + " crop=" + w.mSystemDecorRect.toShortString(), e); + if (!recoveringMemory) { + mService.reclaimSomeSurfaceMemoryLocked(this, "crop", true); + } + } + } + } + void setSurfaceBoundaries(final boolean recoveringMemory) { final WindowState w = mWin; int width, height; @@ -1003,54 +1056,7 @@ class WindowStateAnimator { } } - // Need to recompute a new system decor rect each time. - if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) { - // Currently can't do this cropping for scaled windows. We'll - // just keep the crop rect the same as the source surface. - w.mSystemDecorRect.set(0, 0, w.mRequestedWidth, w.mRequestedHeight); - } else if (w.mLayer >= mService.mSystemDecorLayer) { - // Above the decor layer is easy, just use the entire window. - w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), - w.mCompatFrame.height()); - } else { - final Rect decorRect = mService.mSystemDecorRect; - // Compute the offset of the window in relation to the decor rect. - final int offX = w.mXOffset + w.mFrame.left; - final int offY = w.mYOffset + w.mFrame.top; - // Initialize the decor rect to the entire frame. - w.mSystemDecorRect.set(0, 0, w.mFrame.width(), w.mFrame.height()); - // Intersect with the decor rect, offsetted by window position. - w.mSystemDecorRect.intersect(decorRect.left-offX, decorRect.top-offY, - decorRect.right-offX, decorRect.bottom-offY); - // If size compatibility is being applied to the window, the - // surface is scaled relative to the screen. Also apply this - // scaling to the crop rect. We aren't using the standard rect - // scale function because we want to round things to make the crop - // always round to a larger rect to ensure we don't crop too - // much and hide part of the window that should be seen. - if (w.mEnforceSizeCompat && w.mInvGlobalScale != 1.0f) { - final float scale = w.mInvGlobalScale; - w.mSystemDecorRect.left = (int) (w.mSystemDecorRect.left * scale - 0.5f); - w.mSystemDecorRect.top = (int) (w.mSystemDecorRect.top * scale - 0.5f); - w.mSystemDecorRect.right = (int) ((w.mSystemDecorRect.right+1) * scale - 0.5f); - w.mSystemDecorRect.bottom = (int) ((w.mSystemDecorRect.bottom+1) * scale - 0.5f); - } - } - - if (!w.mSystemDecorRect.equals(w.mLastSystemDecorRect)) { - w.mLastSystemDecorRect.set(w.mSystemDecorRect); - try { - if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, - "CROP " + w.mSystemDecorRect.toShortString(), null); - mSurface.setWindowCrop(w.mSystemDecorRect); - } catch (RuntimeException e) { - Slog.w(TAG, "Error setting crop surface of " + w - + " crop=" + w.mSystemDecorRect.toShortString(), e); - if (!recoveringMemory) { - mService.reclaimSomeSurfaceMemoryLocked(this, "crop", true); - } - } - } + updateSurfaceWindowCrop(recoveringMemory); } public void prepareSurfaceLocked(final boolean recoveringMemory) { @@ -1181,17 +1187,31 @@ class WindowStateAnimator { } void setWallpaperOffset(int left, int top) { + mSurfaceX = left; + mSurfaceY = top; + if (mAnimating) { + // If this window (or its app token) is animating, then the position + // of the surface will be re-computed on the next animation frame. + // We can't poke it directly here because it depends on whatever + // transformation is being applied by the animation. + return; + } + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, + ">>> OPEN TRANSACTION setWallpaperOffset"); Surface.openTransaction(); try { - mSurfaceX = left; - mSurfaceY = top; - mSurface.setPosition(left, top); - mSurface.setWindowCrop(null); + if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, + "POS " + left + ", " + top, null); + mSurface.setPosition(mWin.mFrame.left + left, mWin.mFrame.top + top); + updateSurfaceWindowCrop(false); } catch (RuntimeException e) { Slog.w(TAG, "Error positioning surface of " + mWin + " pos=(" + left + "," + top + ")", e); + } finally { + Surface.closeTransaction(); + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, + "<<< CLOSE TRANSACTION setWallpaperOffset"); } - Surface.closeTransaction(); } // This must be called while inside a transaction. diff --git a/services/jni/com_android_server_PowerManagerService.cpp b/services/jni/com_android_server_PowerManagerService.cpp index a47f8fd..0904bdd 100644 --- a/services/jni/com_android_server_PowerManagerService.cpp +++ b/services/jni/com_android_server_PowerManagerService.cpp @@ -83,11 +83,9 @@ bool android_server_PowerManagerService_isScreenBright() { } void android_server_PowerManagerService_userActivity(nsecs_t eventTime, int32_t eventType) { - if (gPowerModule) { - // Tell the power HAL when user activity occurs. - if (gPowerModule->powerHint) { - gPowerModule->powerHint(gPowerModule, POWER_HINT_INTERACTION, NULL); - } + // Tell the power HAL when user activity occurs. + if (gPowerModule && gPowerModule->powerHint) { + gPowerModule->powerHint(gPowerModule, POWER_HINT_INTERACTION, NULL); } if (gPowerManagerServiceObj) { @@ -131,16 +129,11 @@ static void nativeInit(JNIEnv* env, jobject obj) { status_t err = hw_get_module(POWER_HARDWARE_MODULE_ID, (hw_module_t const**)&gPowerModule); - if (err) { - String8 msg; - msg.appendFormat("Couldn't load %s module (%s)", - POWER_HARDWARE_MODULE_ID, strerror(-err)); - ALOGE("%s", msg.string()); - jniThrowRuntimeException(env, msg.string()); - return; + if (!err) { + gPowerModule->init(gPowerModule); + } else { + ALOGE("Couldn't load %s module (%s)", POWER_HARDWARE_MODULE_ID, strerror(-err)); } - - gPowerModule->init(gPowerModule); } static void nativeSetPowerState(JNIEnv* env, diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml index cc3c328..3f66de6 100644 --- a/services/tests/servicestests/AndroidManifest.xml +++ b/services/tests/servicestests/AndroidManifest.xml @@ -37,13 +37,15 @@ <application> <uses-library android:name="android.test.runner" /> - <service android:name="com.android.server.AccessibilityManagerServiceTest$MyFirstMockAccessibilityService"> + <service android:name="com.android.server.AccessibilityManagerServiceTest$MyFirstMockAccessibilityService" + android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService"/> </intent-filter> </service> - <service android:name="com.android.server.AccessibilityManagerServiceTest$MySecondMockAccessibilityService"> + <service android:name="com.android.server.AccessibilityManagerServiceTest$MySecondMockAccessibilityService" + android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService"/> </intent-filter> diff --git a/telephony/java/com/android/internal/telephony/DataConnection.java b/telephony/java/com/android/internal/telephony/DataConnection.java index 7c70a7e..0033ceb 100644 --- a/telephony/java/com/android/internal/telephony/DataConnection.java +++ b/telephony/java/com/android/internal/telephony/DataConnection.java @@ -1256,6 +1256,7 @@ public abstract class DataConnection extends StateMachine { pw.println(" mRetryOverride=" + mRetryOverride); pw.println(" mRefCount=" + mRefCount); pw.println(" userData=" + userData); + if (mRetryMgr != null) pw.println(" " + mRetryMgr); pw.flush(); } } diff --git a/telephony/java/com/android/internal/telephony/RetryManager.java b/telephony/java/com/android/internal/telephony/RetryManager.java index 29bd104..ae451b9 100644 --- a/telephony/java/com/android/internal/telephony/RetryManager.java +++ b/telephony/java/com/android/internal/telephony/RetryManager.java @@ -74,7 +74,8 @@ import java.util.ArrayList; */ public class RetryManager { static public final String LOG_TAG = "RetryManager"; - static public final boolean DBG = false; + static public final boolean DBG = true; + static public final boolean VDBG = false; /** * Retry record with times in milli-seconds @@ -107,9 +108,20 @@ public class RetryManager { /** Random number generator */ private Random rng = new Random(); + private String mConfig; + /** Constructor */ public RetryManager() { - if (DBG) log("constructor"); + if (VDBG) log("constructor"); + } + + public String toString() { + String ret = "RetryManager: forever=" + mRetryForever + ", maxRetry=" + mMaxRetryCount + + ", retry=" + mRetryCount + ",\n " + mConfig; + for (RetryRec r : mRetryArray) { + ret += "\n " + r.mDelayTime + ":" + r.mRandomizationTime; + } + return ret; } /** @@ -127,7 +139,7 @@ public class RetryManager { public boolean configure(int maxRetryCount, int retryTime, int randomizationTime) { Pair<Boolean, Integer> value; - if (DBG) log("configure: " + maxRetryCount + ", " + retryTime + "," + randomizationTime); + if (VDBG) log("configure: " + maxRetryCount + ", " + retryTime + "," + randomizationTime); if (!validateNonNegativeInt("maxRetryCount", maxRetryCount)) { return false; @@ -161,12 +173,13 @@ public class RetryManager { if ((configStr.startsWith("\"") && configStr.endsWith("\""))) { configStr = configStr.substring(1, configStr.length()-1); } - if (DBG) log("configure: '" + configStr + "'"); + if (VDBG) log("configure: '" + configStr + "'"); + mConfig = configStr; if (!TextUtils.isEmpty(configStr)) { int defaultRandomization = 0; - if (DBG) log("configure: not empty"); + if (VDBG) log("configure: not empty"); mMaxRetryCount = 0; resetRetryCount(); @@ -174,14 +187,14 @@ public class RetryManager { String strArray[] = configStr.split(","); for (int i = 0; i < strArray.length; i++) { - if (DBG) log("configure: strArray[" + i + "]='" + strArray[i] + "'"); + if (VDBG) log("configure: strArray[" + i + "]='" + strArray[i] + "'"); Pair<Boolean, Integer> value; String splitStr[] = strArray[i].split("=", 2); splitStr[0] = splitStr[0].trim(); - if (DBG) log("configure: splitStr[0]='" + splitStr[0] + "'"); + if (VDBG) log("configure: splitStr[0]='" + splitStr[0] + "'"); if (splitStr.length > 1) { splitStr[1] = splitStr[1].trim(); - if (DBG) log("configure: splitStr[1]='" + splitStr[1] + "'"); + if (VDBG) log("configure: splitStr[1]='" + splitStr[1] + "'"); if (TextUtils.equals(splitStr[0], "default_randomization")) { value = parseNonNegativeInt(splitStr[0], splitStr[1]); if (!value.first) return false; @@ -214,7 +227,7 @@ public class RetryManager { // Check if optional randomization value present if (splitStr.length > 1) { splitStr[1] = splitStr[1].trim(); - if (DBG) log("configure: splitStr[1]='" + splitStr[1] + "'"); + if (VDBG) log("configure: splitStr[1]='" + splitStr[1] + "'"); value = parseNonNegativeInt("randomizationTime", splitStr[1]); if (!value.first) return false; rr.mRandomizationTime = value.second; @@ -226,12 +239,12 @@ public class RetryManager { } if (mRetryArray.size() > mMaxRetryCount) { mMaxRetryCount = mRetryArray.size(); - if (DBG) log("configure: setting mMaxRetryCount=" + mMaxRetryCount); + if (VDBG) log("configure: setting mMaxRetryCount=" + mMaxRetryCount); } - if (DBG) log("configure: true"); + if (VDBG) log("configure: true"); return true; } else { - if (DBG) log("configure: false it's empty"); + if (VDBG) log("configure: false it's empty"); return false; } } @@ -349,7 +362,7 @@ public class RetryManager { Log.e(LOG_TAG, name + " bad value: " + stringValue, e); retVal = new Pair<Boolean, Integer>(false, 0); } - if (DBG) log("parseNonNetativeInt: " + name + ", " + stringValue + ", " + if (VDBG) log("parseNonNetativeInt: " + name + ", " + stringValue + ", " + retVal.first + ", " + retVal.second); return retVal; } @@ -369,7 +382,7 @@ public class RetryManager { } else { retVal = true; } - if (DBG) log("validateNonNegative: " + name + ", " + value + ", " + retVal); + if (VDBG) log("validateNonNegative: " + name + ", " + value + ", " + retVal); return retVal; } diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java index e2579e3..f8d09de 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java @@ -1695,6 +1695,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { @Override protected void restartDataStallAlarm() { + if (isConnected() == false) return; // To be called on screen status change. // Do not cancel the alarm if it is set with aggressive timeout. int nextAction = getRecoveryAction(); @@ -2141,10 +2142,9 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker { // clean slate after call end. resetPollStats(); } - } else { - // reset reconnect timer - setupDataOnReadyApns(Phone.REASON_VOICE_CALL_ENDED); } + // reset reconnect timer + setupDataOnReadyApns(Phone.REASON_VOICE_CALL_ENDED); } @Override diff --git a/tests/RenderScriptTests/Balls/Android.mk b/tests/RenderScriptTests/Balls/Android.mk new file mode 100644 index 0000000..b109584 --- /dev/null +++ b/tests/RenderScriptTests/Balls/Android.mk @@ -0,0 +1,26 @@ +# +# 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. +# + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src) + +LOCAL_PACKAGE_NAME := RsBalls + +include $(BUILD_PACKAGE) diff --git a/tests/RenderScriptTests/Balls/AndroidManifest.xml b/tests/RenderScriptTests/Balls/AndroidManifest.xml new file mode 100644 index 0000000..80e6b39 --- /dev/null +++ b/tests/RenderScriptTests/Balls/AndroidManifest.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.example.android.rs.balls"> + <uses-sdk android:minSdkVersion="14" /> + <application + android:label="RsBalls" + android:icon="@drawable/test_pattern"> + <activity android:name="Balls" + android:screenOrientation="landscape"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> +</manifest> diff --git a/tests/RenderScriptTests/Balls/_index.html b/tests/RenderScriptTests/Balls/_index.html new file mode 100644 index 0000000..8760485 --- /dev/null +++ b/tests/RenderScriptTests/Balls/_index.html @@ -0,0 +1 @@ +<p>A brute force physics simulation that renders many balls onto the screen and moves them according to user touch and gravity.</p>
\ No newline at end of file diff --git a/tests/RenderScriptTests/Balls/res/drawable/flares.png b/tests/RenderScriptTests/Balls/res/drawable/flares.png Binary files differnew file mode 100644 index 0000000..3a5c970 --- /dev/null +++ b/tests/RenderScriptTests/Balls/res/drawable/flares.png diff --git a/tests/RenderScriptTests/Balls/res/drawable/test_pattern.png b/tests/RenderScriptTests/Balls/res/drawable/test_pattern.png Binary files differnew file mode 100644 index 0000000..e7d1455 --- /dev/null +++ b/tests/RenderScriptTests/Balls/res/drawable/test_pattern.png diff --git a/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/Balls.java b/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/Balls.java new file mode 100644 index 0000000..2c6558e --- /dev/null +++ b/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/Balls.java @@ -0,0 +1,118 @@ +/* + * 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. + */ + +package com.example.android.rs.balls; + +import android.renderscript.RSSurfaceView; +import android.renderscript.RenderScript; + +import android.app.Activity; +import android.content.res.Configuration; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.provider.Settings.System; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.Window; +import android.widget.Button; +import android.widget.ListView; + +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.view.View; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; + +public class Balls extends Activity implements SensorEventListener { + //EventListener mListener = new EventListener(); + + private static final String LOG_TAG = "libRS_jni"; + private static final boolean DEBUG = false; + private static final boolean LOG_ENABLED = false; + + private BallsView mView; + private SensorManager mSensorManager; + + // get the current looper (from your Activity UI thread for instance + + + public void onSensorChanged(SensorEvent event) { + //android.util.Log.d("rs", "sensor: " + event.sensor + ", x: " + event.values[0] + ", y: " + event.values[1] + ", z: " + event.values[2]); + synchronized (this) { + if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { + if(mView != null) { + mView.setAccel(event.values[0], event.values[1], event.values[2]); + } + } + } + } + + public void onAccuracyChanged(Sensor sensor, int accuracy) { + } + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); + + // Create our Preview view and set it as the content of our + // Activity + mView = new BallsView(this); + setContentView(mView); + } + + @Override + protected void onResume() { + mSensorManager.registerListener(this, + mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), + SensorManager.SENSOR_DELAY_FASTEST); + + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onResume(); + mView.resume(); + } + + @Override + protected void onPause() { + super.onPause(); + mView.pause(); + onStop(); + } + + @Override + protected void onStop() { + mSensorManager.unregisterListener(this); + super.onStop(); + } + + static void log(String message) { + if (LOG_ENABLED) { + Log.v(LOG_TAG, message); + } + } + + +} + diff --git a/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/BallsRS.java b/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/BallsRS.java new file mode 100644 index 0000000..8cab9b8 --- /dev/null +++ b/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/BallsRS.java @@ -0,0 +1,143 @@ +/* + * 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. + */ + +package com.example.android.rs.balls; + +import android.content.res.Resources; +import android.renderscript.*; +import android.util.Log; + +public class BallsRS { + public static final int PART_COUNT = 900; + + public BallsRS() { + } + + private Resources mRes; + private RenderScriptGL mRS; + private ScriptC_balls mScript; + private ScriptC_ball_physics mPhysicsScript; + private ProgramFragment mPFLines; + private ProgramFragment mPFPoints; + private ProgramVertex mPV; + private ScriptField_Point mPoints; + private ScriptField_VpConsts mVpConsts; + + void updateProjectionMatrices() { + mVpConsts = new ScriptField_VpConsts(mRS, 1, + Allocation.USAGE_SCRIPT | + Allocation.USAGE_GRAPHICS_CONSTANTS); + ScriptField_VpConsts.Item i = new ScriptField_VpConsts.Item(); + Matrix4f mvp = new Matrix4f(); + mvp.loadOrtho(0, mRS.getWidth(), mRS.getHeight(), 0, -1, 1); + i.MVP = mvp; + mVpConsts.set(i, 0, true); + } + + private void createProgramVertex() { + updateProjectionMatrices(); + + ProgramVertex.Builder sb = new ProgramVertex.Builder(mRS); + String t = "varying vec4 varColor;\n" + + "void main() {\n" + + " vec4 pos = vec4(0.0, 0.0, 0.0, 1.0);\n" + + " pos.xy = ATTRIB_position;\n" + + " gl_Position = UNI_MVP * pos;\n" + + " varColor = vec4(1.0, 1.0, 1.0, 1.0);\n" + + " gl_PointSize = ATTRIB_size;\n" + + "}\n"; + sb.setShader(t); + sb.addConstant(mVpConsts.getType()); + sb.addInput(mPoints.getElement()); + ProgramVertex pvs = sb.create(); + pvs.bindConstants(mVpConsts.getAllocation(), 0); + mRS.bindProgramVertex(pvs); + } + + private Allocation loadTexture(int id) { + final Allocation allocation = + Allocation.createFromBitmapResource(mRS, mRes, + id, Allocation.MipmapControl.MIPMAP_NONE, + Allocation.USAGE_GRAPHICS_TEXTURE); + return allocation; + } + + ProgramStore BLEND_ADD_DEPTH_NONE(RenderScript rs) { + ProgramStore.Builder builder = new ProgramStore.Builder(rs); + builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS); + builder.setBlendFunc(ProgramStore.BlendSrcFunc.ONE, ProgramStore.BlendDstFunc.ONE); + builder.setDitherEnabled(false); + builder.setDepthMaskEnabled(false); + return builder.create(); + } + + public void init(RenderScriptGL rs, Resources res, int width, int height) { + mRS = rs; + mRes = res; + + ProgramFragmentFixedFunction.Builder pfb = new ProgramFragmentFixedFunction.Builder(rs); + pfb.setPointSpriteTexCoordinateReplacement(true); + pfb.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.MODULATE, + ProgramFragmentFixedFunction.Builder.Format.RGBA, 0); + pfb.setVaryingColor(true); + mPFPoints = pfb.create(); + + pfb = new ProgramFragmentFixedFunction.Builder(rs); + pfb.setVaryingColor(true); + mPFLines = pfb.create(); + + android.util.Log.e("rs", "Load texture"); + mPFPoints.bindTexture(loadTexture(R.drawable.flares), 0); + + mPoints = new ScriptField_Point(mRS, PART_COUNT, Allocation.USAGE_SCRIPT); + + Mesh.AllocationBuilder smb = new Mesh.AllocationBuilder(mRS); + smb.addVertexAllocation(mPoints.getAllocation()); + smb.addIndexSetType(Mesh.Primitive.POINT); + Mesh smP = smb.create(); + + mPhysicsScript = new ScriptC_ball_physics(mRS, mRes, R.raw.ball_physics); + + mScript = new ScriptC_balls(mRS, mRes, R.raw.balls); + mScript.set_partMesh(smP); + mScript.set_physics_script(mPhysicsScript); + mScript.bind_point(mPoints); + mScript.bind_balls1(new ScriptField_Ball(mRS, PART_COUNT, Allocation.USAGE_SCRIPT)); + mScript.bind_balls2(new ScriptField_Ball(mRS, PART_COUNT, Allocation.USAGE_SCRIPT)); + + mScript.set_gPFLines(mPFLines); + mScript.set_gPFPoints(mPFPoints); + createProgramVertex(); + + mRS.bindProgramStore(BLEND_ADD_DEPTH_NONE(mRS)); + + mPhysicsScript.set_gMinPos(new Float2(5, 5)); + mPhysicsScript.set_gMaxPos(new Float2(width - 5, height - 5)); + + mScript.invoke_initParts(width, height); + + mRS.bindRootScript(mScript); + } + + public void newTouchPosition(float x, float y, float pressure, int id) { + mPhysicsScript.invoke_touch(x, y, pressure, id); + } + + public void setAccel(float x, float y) { + mPhysicsScript.set_gGravityVector(new Float2(x, y)); + } + +} diff --git a/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/BallsView.java b/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/BallsView.java new file mode 100644 index 0000000..b3b3756 --- /dev/null +++ b/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/BallsView.java @@ -0,0 +1,116 @@ +/* + * 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. + */ + +package com.example.android.rs.balls; + +import java.io.Writer; +import java.util.ArrayList; +import java.util.concurrent.Semaphore; + +import android.renderscript.RSSurfaceView; +import android.renderscript.RenderScript; +import android.renderscript.RenderScriptGL; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.os.Message; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Surface; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.KeyEvent; +import android.view.MotionEvent; + +public class BallsView extends RSSurfaceView { + + public BallsView(Context context) { + super(context); + //setFocusable(true); + } + + private RenderScriptGL mRS; + private BallsRS mRender; + + public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { + super.surfaceChanged(holder, format, w, h); + if (mRS == null) { + RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); + mRS = createRenderScriptGL(sc); + mRS.setSurface(holder, w, h); + mRender = new BallsRS(); + mRender.init(mRS, getResources(), w, h); + } + mRender.updateProjectionMatrices(); + } + + @Override + protected void onDetachedFromWindow() { + if(mRS != null) { + mRS = null; + destroyRenderScriptGL(); + } + } + + + @Override + public boolean onTouchEvent(MotionEvent ev) + { + int act = ev.getActionMasked(); + if (act == ev.ACTION_UP) { + mRender.newTouchPosition(0, 0, 0, ev.getPointerId(0)); + return false; + } else if (act == MotionEvent.ACTION_POINTER_UP) { + // only one pointer going up, we can get the index like this + int pointerIndex = ev.getActionIndex(); + int pointerId = ev.getPointerId(pointerIndex); + mRender.newTouchPosition(0, 0, 0, pointerId); + return false; + } + int count = ev.getHistorySize(); + int pcount = ev.getPointerCount(); + + for (int p=0; p < pcount; p++) { + int id = ev.getPointerId(p); + mRender.newTouchPosition(ev.getX(p), + ev.getY(p), + ev.getPressure(p), + id); + + for (int i=0; i < count; i++) { + mRender.newTouchPosition(ev.getHistoricalX(p, i), + ev.getHistoricalY(p, i), + ev.getHistoricalPressure(p, i), + id); + } + } + return true; + } + + void setAccel(float x, float y, float z) { + if (mRender == null) { + return; + } + mRender.setAccel(x, -y); + } + +} + + diff --git a/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/ball_physics.rs b/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/ball_physics.rs new file mode 100644 index 0000000..8a3db6d --- /dev/null +++ b/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/ball_physics.rs @@ -0,0 +1,146 @@ +#pragma version(1) +#pragma rs java_package_name(com.example.android.rs.balls) + +#include "balls.rsh" + +float2 gGravityVector = {0.f, 9.8f}; + +float2 gMinPos = {0.f, 0.f}; +float2 gMaxPos = {1280.f, 700.f}; + +static float2 touchPos[10]; +static float touchPressure[10]; + +void touch(float x, float y, float pressure, int id) { + if (id >= 10) { + return; + } + + touchPos[id].x = x; + touchPos[id].y = y; + touchPressure[id] = pressure; +} + +void root(const Ball_t *ballIn, Ball_t *ballOut, const BallControl_t *ctl, uint32_t x) { + float2 fv = {0, 0}; + float2 pos = ballIn->position; + + int arcID = -1; + float arcInvStr = 100000; + + const Ball_t * bPtr = rsGetElementAt(ctl->ain, 0); + for (uint32_t xin = 0; xin < ctl->dimX; xin++) { + float2 vec = bPtr[xin].position - pos; + float2 vec2 = vec * vec; + float len2 = vec2.x + vec2.y; + + if (len2 < 10000) { + //float minDist = ballIn->size + bPtr[xin].size; + float forceScale = ballIn->size * bPtr[xin].size; + forceScale *= forceScale; + + if (len2 > 16 /* (minDist*minDist)*/) { + // Repulsion + float len = sqrt(len2); + fv -= (vec / (len * len * len)) * 20000.f * forceScale; + } else { + if (len2 < 1) { + if (xin == x) { + continue; + } + ballOut->delta = 0.f; + ballOut->position = ballIn->position; + if (xin > x) { + ballOut->position.x += 1.f; + } else { + ballOut->position.x -= 1.f; + } + //ballOut->color.rgb = 1.f; + //ballOut->arcID = -1; + //ballOut->arcStr = 0; + continue; + } + // Collision + float2 axis = normalize(vec); + float e1 = dot(axis, ballIn->delta); + float e2 = dot(axis, bPtr[xin].delta); + float e = (e1 - e2) * 0.45f; + if (e1 > 0) { + fv -= axis * e; + } else { + fv += axis * e; + } + } + } + } + + fv /= ballIn->size * ballIn->size * ballIn->size; + fv -= gGravityVector * 4.f; + fv *= ctl->dt; + + for (int i=0; i < 10; i++) { + if (touchPressure[i] > 0.1f) { + float2 vec = touchPos[i] - ballIn->position; + float2 vec2 = vec * vec; + float len2 = max(2.f, vec2.x + vec2.y); + fv -= (vec / len2) * touchPressure[i] * 300.f; + } + } + + ballOut->delta = (ballIn->delta * (1.f - 0.004f)) + fv; + ballOut->position = ballIn->position + (ballOut->delta * ctl->dt); + + const float wallForce = 400.f; + if (ballOut->position.x > (gMaxPos.x - 20.f)) { + float d = gMaxPos.x - ballOut->position.x; + if (d < 0.f) { + if (ballOut->delta.x > 0) { + ballOut->delta.x *= -0.7f; + } + ballOut->position.x = gMaxPos.x; + } else { + ballOut->delta.x -= min(wallForce / (d * d), 10.f); + } + } + + if (ballOut->position.x < (gMinPos.x + 20.f)) { + float d = ballOut->position.x - gMinPos.x; + if (d < 0.f) { + if (ballOut->delta.x < 0) { + ballOut->delta.x *= -0.7f; + } + ballOut->position.x = gMinPos.x + 1.f; + } else { + ballOut->delta.x += min(wallForce / (d * d), 10.f); + } + } + + if (ballOut->position.y > (gMaxPos.y - 20.f)) { + float d = gMaxPos.y - ballOut->position.y; + if (d < 0.f) { + if (ballOut->delta.y > 0) { + ballOut->delta.y *= -0.7f; + } + ballOut->position.y = gMaxPos.y; + } else { + ballOut->delta.y -= min(wallForce / (d * d), 10.f); + } + } + + if (ballOut->position.y < (gMinPos.y + 20.f)) { + float d = ballOut->position.y - gMinPos.y; + if (d < 0.f) { + if (ballOut->delta.y < 0) { + ballOut->delta.y *= -0.7f; + } + ballOut->position.y = gMinPos.y + 1.f; + } else { + ballOut->delta.y += min(wallForce / (d * d * d), 10.f); + } + } + + ballOut->size = ballIn->size; + + //rsDebug("physics pos out", ballOut->position); +} + diff --git a/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/balls.rs b/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/balls.rs new file mode 100644 index 0000000..dcdd586 --- /dev/null +++ b/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/balls.rs @@ -0,0 +1,83 @@ +#pragma version(1) +#pragma rs java_package_name(com.example.android.rs.balls) +#include "rs_graphics.rsh" + +#include "balls.rsh" + +#pragma stateVertex(parent) +#pragma stateStore(parent) + +rs_program_fragment gPFPoints; +rs_program_fragment gPFLines; +rs_mesh partMesh; + +typedef struct __attribute__((packed, aligned(4))) Point { + float2 position; + float size; +} Point_t; +Point_t *point; + +typedef struct VpConsts { + rs_matrix4x4 MVP; +} VpConsts_t; +VpConsts_t *vpConstants; + +rs_script physics_script; + +Ball_t *balls1; +Ball_t *balls2; + +static int frame = 0; + +void initParts(int w, int h) +{ + uint32_t dimX = rsAllocationGetDimX(rsGetAllocation(balls1)); + + for (uint32_t ct=0; ct < dimX; ct++) { + balls1[ct].position.x = rsRand(0.f, (float)w); + balls1[ct].position.y = rsRand(0.f, (float)h); + balls1[ct].delta.x = 0.f; + balls1[ct].delta.y = 0.f; + balls1[ct].size = 1.f; + + float r = rsRand(100.f); + if (r > 90.f) { + balls1[ct].size += pow(10.f, rsRand(0.f, 2.f)) * 0.07f; + } + } +} + + + +int root() { + rsgClearColor(0.f, 0.f, 0.f, 1.f); + + BallControl_t bc; + Ball_t *bout; + + if (frame & 1) { + bc.ain = rsGetAllocation(balls2); + bc.aout = rsGetAllocation(balls1); + bout = balls1; + } else { + bc.ain = rsGetAllocation(balls1); + bc.aout = rsGetAllocation(balls2); + bout = balls2; + } + + bc.dimX = rsAllocationGetDimX(bc.ain); + bc.dt = 1.f / 30.f; + + rsForEach(physics_script, bc.ain, bc.aout, &bc, sizeof(bc)); + + for (uint32_t ct=0; ct < bc.dimX; ct++) { + point[ct].position = bout[ct].position; + point[ct].size = 6.f /*+ bout[ct].color.g * 6.f*/ * bout[ct].size; + } + + frame++; + rsgBindProgramFragment(gPFPoints); + rsgDrawMesh(partMesh); + return 1; +} + diff --git a/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/balls.rsh b/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/balls.rsh new file mode 100644 index 0000000..fc886f9 --- /dev/null +++ b/tests/RenderScriptTests/Balls/src/com/example/android/rs/balls/balls.rsh @@ -0,0 +1,18 @@ + +typedef struct __attribute__((packed, aligned(4))) Ball { + float2 delta; + float2 position; + //float3 color; + float size; + //int arcID; + //float arcStr; +} Ball_t; +Ball_t *balls; + + +typedef struct BallControl { + uint32_t dimX; + rs_allocation ain; + rs_allocation aout; + float dt; +} BallControl_t; diff --git a/tests/RenderScriptTests/Fountain/Android.mk b/tests/RenderScriptTests/Fountain/Android.mk new file mode 100644 index 0000000..2049ecf --- /dev/null +++ b/tests/RenderScriptTests/Fountain/Android.mk @@ -0,0 +1,29 @@ +# +# 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. +# + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src) + +# TODO: build fails with this set +# LOCAL_SDK_VERSION := current + +LOCAL_PACKAGE_NAME := RsFountain + +include $(BUILD_PACKAGE) diff --git a/tests/RenderScriptTests/Fountain/AndroidManifest.xml b/tests/RenderScriptTests/Fountain/AndroidManifest.xml new file mode 100644 index 0000000..d19b8c3 --- /dev/null +++ b/tests/RenderScriptTests/Fountain/AndroidManifest.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.example.android.rs.fountain"> + <uses-sdk android:minSdkVersion="14" /> + <application + android:label="RsFountain" + android:hardwareAccelerated="true" + android:icon="@drawable/test_pattern"> + <activity android:name="Fountain"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> +</manifest> diff --git a/tests/RenderScriptTests/Fountain/_index.html b/tests/RenderScriptTests/Fountain/_index.html new file mode 100644 index 0000000..223242f --- /dev/null +++ b/tests/RenderScriptTests/Fountain/_index.html @@ -0,0 +1,5 @@ +<p>An example that renders many dots on the screen that follow a user's touch. The dots fall +to the bottom of the screen when the user releases the finger.</p> + + + diff --git a/tests/RenderScriptTests/Fountain/res/drawable/test_pattern.png b/tests/RenderScriptTests/Fountain/res/drawable/test_pattern.png Binary files differnew file mode 100644 index 0000000..e7d1455 --- /dev/null +++ b/tests/RenderScriptTests/Fountain/res/drawable/test_pattern.png diff --git a/tests/RenderScriptTests/Fountain/src/com/example/android/rs/fountain/Fountain.java b/tests/RenderScriptTests/Fountain/src/com/example/android/rs/fountain/Fountain.java new file mode 100644 index 0000000..311455a --- /dev/null +++ b/tests/RenderScriptTests/Fountain/src/com/example/android/rs/fountain/Fountain.java @@ -0,0 +1,95 @@ +/* + * 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. + */ + +package com.example.android.rs.fountain; + +import android.renderscript.RSSurfaceView; +import android.renderscript.RenderScript; + +import android.app.Activity; +import android.content.res.Configuration; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.provider.Settings.System; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.Window; +import android.widget.Button; +import android.widget.ListView; + +import java.lang.Runtime; + +public class Fountain extends Activity { + //EventListener mListener = new EventListener(); + + private static final String LOG_TAG = "libRS_jni"; + private static final boolean DEBUG = false; + private static final boolean LOG_ENABLED = false; + + private FountainView mView; + + // get the current looper (from your Activity UI thread for instance + + + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + // Create our Preview view and set it as the content of our + // Activity + mView = new FountainView(this); + setContentView(mView); + } + + @Override + protected void onResume() { + Log.e("rs", "onResume"); + + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onResume(); + mView.resume(); + } + + @Override + protected void onPause() { + Log.e("rs", "onPause"); + + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onPause(); + mView.pause(); + + + + //Runtime.getRuntime().exit(0); + } + + + static void log(String message) { + if (LOG_ENABLED) { + Log.v(LOG_TAG, message); + } + } + + +} + diff --git a/tests/RenderScriptTests/Fountain/src/com/example/android/rs/fountain/FountainRS.java b/tests/RenderScriptTests/Fountain/src/com/example/android/rs/fountain/FountainRS.java new file mode 100644 index 0000000..646c807 --- /dev/null +++ b/tests/RenderScriptTests/Fountain/src/com/example/android/rs/fountain/FountainRS.java @@ -0,0 +1,72 @@ +/* + * 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. + */ + +package com.example.android.rs.fountain; + +import android.content.res.Resources; +import android.renderscript.*; +import android.util.Log; + + +public class FountainRS { + public static final int PART_COUNT = 50000; + + public FountainRS() { + } + + private Resources mRes; + private RenderScriptGL mRS; + private ScriptC_fountain mScript; + public void init(RenderScriptGL rs, Resources res) { + mRS = rs; + mRes = res; + + ProgramFragmentFixedFunction.Builder pfb = new ProgramFragmentFixedFunction.Builder(rs); + pfb.setVaryingColor(true); + rs.bindProgramFragment(pfb.create()); + + ScriptField_Point points = new ScriptField_Point(mRS, PART_COUNT);// + // Allocation.USAGE_GRAPHICS_VERTEX); + + Mesh.AllocationBuilder smb = new Mesh.AllocationBuilder(mRS); + smb.addVertexAllocation(points.getAllocation()); + smb.addIndexSetType(Mesh.Primitive.POINT); + Mesh sm = smb.create(); + + mScript = new ScriptC_fountain(mRS, mRes, R.raw.fountain); + mScript.set_partMesh(sm); + mScript.bind_point(points); + mRS.bindRootScript(mScript); + } + + boolean holdingColor[] = new boolean[10]; + public void newTouchPosition(float x, float y, float pressure, int id) { + if (id >= holdingColor.length) { + return; + } + int rate = (int)(pressure * pressure * 500.f); + if (rate > 500) { + rate = 500; + } + if (rate > 0) { + mScript.invoke_addParticles(rate, x, y, id, !holdingColor[id]); + holdingColor[id] = true; + } else { + holdingColor[id] = false; + } + + } +} diff --git a/tests/RenderScriptTests/Fountain/src/com/example/android/rs/fountain/FountainView.java b/tests/RenderScriptTests/Fountain/src/com/example/android/rs/fountain/FountainView.java new file mode 100644 index 0000000..ba09421 --- /dev/null +++ b/tests/RenderScriptTests/Fountain/src/com/example/android/rs/fountain/FountainView.java @@ -0,0 +1,109 @@ +/* + * 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. + */ + +package com.example.android.rs.fountain; + +import java.io.Writer; +import java.util.ArrayList; +import java.util.concurrent.Semaphore; + +import android.renderscript.RSTextureView; +import android.renderscript.RenderScript; +import android.renderscript.RenderScriptGL; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.os.Message; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Surface; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.KeyEvent; +import android.view.MotionEvent; + +public class FountainView extends RSTextureView { + + public FountainView(Context context) { + super(context); + //setFocusable(true); + } + + private RenderScriptGL mRS; + private FountainRS mRender; + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + android.util.Log.e("rs", "onAttachedToWindow"); + if (mRS == null) { + RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); + mRS = createRenderScriptGL(sc); + mRender = new FountainRS(); + mRender.init(mRS, getResources()); + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + android.util.Log.e("rs", "onDetachedFromWindow"); + if (mRS != null) { + mRS = null; + destroyRenderScriptGL(); + } + } + + + @Override + public boolean onTouchEvent(MotionEvent ev) + { + int act = ev.getActionMasked(); + if (act == ev.ACTION_UP) { + mRender.newTouchPosition(0, 0, 0, ev.getPointerId(0)); + return false; + } else if (act == MotionEvent.ACTION_POINTER_UP) { + // only one pointer going up, we can get the index like this + int pointerIndex = ev.getActionIndex(); + int pointerId = ev.getPointerId(pointerIndex); + mRender.newTouchPosition(0, 0, 0, pointerId); + } + int count = ev.getHistorySize(); + int pcount = ev.getPointerCount(); + + for (int p=0; p < pcount; p++) { + int id = ev.getPointerId(p); + mRender.newTouchPosition(ev.getX(p), + ev.getY(p), + ev.getPressure(p), + id); + + for (int i=0; i < count; i++) { + mRender.newTouchPosition(ev.getHistoricalX(p, i), + ev.getHistoricalY(p, i), + ev.getHistoricalPressure(p, i), + id); + } + } + return true; + } +} + + diff --git a/tests/RenderScriptTests/Fountain/src/com/example/android/rs/fountain/fountain.rs b/tests/RenderScriptTests/Fountain/src/com/example/android/rs/fountain/fountain.rs new file mode 100644 index 0000000..151b689 --- /dev/null +++ b/tests/RenderScriptTests/Fountain/src/com/example/android/rs/fountain/fountain.rs @@ -0,0 +1,70 @@ +// Fountain test script +#pragma version(1) +#pragma rs_fp_relaxed + +#pragma rs java_package_name(com.example.android.rs.fountain) + +#pragma stateFragment(parent) + +#include "rs_graphics.rsh" + +static int newPart = 0; +rs_mesh partMesh; + +typedef struct __attribute__((packed, aligned(4))) Point { + float2 delta; + float2 position; + uchar4 color; +} Point_t; +Point_t *point; + +int root() { + float dt = min(rsGetDt(), 0.1f); + rsgClearColor(0.f, 0.f, 0.f, 1.f); + const float height = rsgGetHeight(); + const int size = rsAllocationGetDimX(rsGetAllocation(point)); + float dy2 = dt * (10.f); + Point_t * p = point; + for (int ct=0; ct < size; ct++) { + p->delta.y += dy2; + p->position += p->delta; + if ((p->position.y > height) && (p->delta.y > 0)) { + p->delta.y *= -0.3f; + } + p++; + } + + rsgDrawMesh(partMesh); + return 1; +} + +static float4 partColor[10]; +void addParticles(int rate, float x, float y, int index, bool newColor) +{ + if (newColor) { + partColor[index].x = rsRand(0.5f, 1.0f); + partColor[index].y = rsRand(1.0f); + partColor[index].z = rsRand(1.0f); + } + float rMax = ((float)rate) * 0.02f; + int size = rsAllocationGetDimX(rsGetAllocation(point)); + uchar4 c = rsPackColorTo8888(partColor[index]); + + Point_t * np = &point[newPart]; + float2 p = {x, y}; + while (rate--) { + float angle = rsRand(3.14f * 2.f); + float len = rsRand(rMax); + np->delta.x = len * sin(angle); + np->delta.y = len * cos(angle); + np->position = p; + np->color = c; + newPart++; + np++; + if (newPart >= size) { + newPart = 0; + np = &point[newPart]; + } + } +} + diff --git a/tests/RenderScriptTests/FountainFbo/Android.mk b/tests/RenderScriptTests/FountainFbo/Android.mk new file mode 100644 index 0000000..55a4fd8 --- /dev/null +++ b/tests/RenderScriptTests/FountainFbo/Android.mk @@ -0,0 +1,29 @@ +# +# 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. +# + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src) + +# TODO: build fails with this set +# LOCAL_SDK_VERSION := current + +LOCAL_PACKAGE_NAME := RsFountainFbo + +include $(BUILD_PACKAGE) diff --git a/tests/RenderScriptTests/FountainFbo/AndroidManifest.xml b/tests/RenderScriptTests/FountainFbo/AndroidManifest.xml new file mode 100644 index 0000000..082744b --- /dev/null +++ b/tests/RenderScriptTests/FountainFbo/AndroidManifest.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.example.android.rs.fountainfbo"> + <uses-sdk android:minSdkVersion="14" /> + <application + android:label="RsFountainFbo" + android:hardwareAccelerated="true" + android:icon="@drawable/test_pattern"> + <activity android:name="FountainFbo"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> +</manifest> diff --git a/tests/RenderScriptTests/FountainFbo/_index.html b/tests/RenderScriptTests/FountainFbo/_index.html new file mode 100644 index 0000000..5508657 --- /dev/null +++ b/tests/RenderScriptTests/FountainFbo/_index.html @@ -0,0 +1,7 @@ +<p>An example that renders many dots on the screen that follow a user's touch. The dots fall +to the bottom of the screen when no touch is detected. This example modifies +the <a href="../Fountain/index.html">Fountain</a> sample to include rendering to a +a framebuffer object as well as the default framebuffer.</p> + + + diff --git a/tests/RenderScriptTests/FountainFbo/res/drawable/test_pattern.png b/tests/RenderScriptTests/FountainFbo/res/drawable/test_pattern.png Binary files differnew file mode 100644 index 0000000..e7d1455 --- /dev/null +++ b/tests/RenderScriptTests/FountainFbo/res/drawable/test_pattern.png diff --git a/tests/RenderScriptTests/FountainFbo/src/com/example/android/rs/fountainfbo/FountainFbo.java b/tests/RenderScriptTests/FountainFbo/src/com/example/android/rs/fountainfbo/FountainFbo.java new file mode 100644 index 0000000..d8ba30f --- /dev/null +++ b/tests/RenderScriptTests/FountainFbo/src/com/example/android/rs/fountainfbo/FountainFbo.java @@ -0,0 +1,65 @@ +/* + * 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. + */ + +package com.example.android.rs.fountainfbo; + +import android.app.Activity; +import android.os.Bundle; +import android.util.Log; + +public class FountainFbo extends Activity { + private static final String LOG_TAG = "libRS_jni"; + private static final boolean DEBUG = false; + private static final boolean LOG_ENABLED = false; + + private FountainFboView mView; + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + /* Create our Preview view and set it as the content of our Activity */ + mView = new FountainFboView(this); + setContentView(mView); + } + + @Override + protected void onResume() { + Log.e("rs", "onResume"); + + /* Ideally a game should implement onResume() and onPause() + to take appropriate action when the activity loses focus */ + super.onResume(); + mView.resume(); + } + + @Override + protected void onPause() { + Log.e("rs", "onPause"); + + /* Ideally a game should implement onResume() and onPause() + to take appropriate action when the activity loses focus */ + super.onPause(); + mView.pause(); + } + + static void log(String message) { + if (LOG_ENABLED) { + Log.v(LOG_TAG, message); + } + } +} + diff --git a/tests/RenderScriptTests/FountainFbo/src/com/example/android/rs/fountainfbo/FountainFboRS.java b/tests/RenderScriptTests/FountainFbo/src/com/example/android/rs/fountainfbo/FountainFboRS.java new file mode 100644 index 0000000..3bf3ff1 --- /dev/null +++ b/tests/RenderScriptTests/FountainFbo/src/com/example/android/rs/fountainfbo/FountainFboRS.java @@ -0,0 +1,99 @@ +/* + * 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. + */ + +package com.example.android.rs.fountainfbo; + +import android.content.res.Resources; +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.Mesh; +import android.renderscript.ProgramFragment; +import android.renderscript.ProgramFragmentFixedFunction; +import android.renderscript.RenderScriptGL; +import android.renderscript.Type; + +public class FountainFboRS { + public static final int PART_COUNT = 50000; + + public FountainFboRS() { + } + + private Resources mRes; + private RenderScriptGL mRS; + private ScriptC_fountainfbo mScript; + private Allocation mColorBuffer; + private ProgramFragment mProgramFragment; + private ProgramFragment mTextureProgramFragment; + public void init(RenderScriptGL rs, Resources res) { + mRS = rs; + mRes = res; + + ScriptField_Point points = new ScriptField_Point(mRS, PART_COUNT); + + Mesh.AllocationBuilder smb = new Mesh.AllocationBuilder(mRS); + smb.addVertexAllocation(points.getAllocation()); + smb.addIndexSetType(Mesh.Primitive.POINT); + Mesh sm = smb.create(); + + mScript = new ScriptC_fountainfbo(mRS, mRes, R.raw.fountainfbo); + mScript.set_partMesh(sm); + mScript.bind_point(points); + + ProgramFragmentFixedFunction.Builder pfb = new ProgramFragmentFixedFunction.Builder(rs); + pfb.setVaryingColor(true); + mProgramFragment = pfb.create(); + mScript.set_gProgramFragment(mProgramFragment); + + /* Second fragment shader to use a texture (framebuffer object) to draw with */ + pfb.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE, + ProgramFragmentFixedFunction.Builder.Format.RGBA, 0); + + /* Set the fragment shader in the Renderscript runtime */ + mTextureProgramFragment = pfb.create(); + mScript.set_gTextureProgramFragment(mTextureProgramFragment); + + /* Create the allocation for the color buffer */ + Type.Builder colorBuilder = new Type.Builder(mRS, Element.RGBA_8888(mRS)); + colorBuilder.setX(256).setY(256); + mColorBuffer = Allocation.createTyped(mRS, colorBuilder.create(), + Allocation.USAGE_GRAPHICS_TEXTURE | + Allocation.USAGE_GRAPHICS_RENDER_TARGET); + + /* Set the allocation in the Renderscript runtime */ + mScript.set_gColorBuffer(mColorBuffer); + + mRS.bindRootScript(mScript); + } + + boolean holdingColor[] = new boolean[10]; + public void newTouchPosition(float x, float y, float pressure, int id) { + if (id >= holdingColor.length) { + return; + } + int rate = (int)(pressure * pressure * 500.f); + if (rate > 500) { + rate = 500; + } + if (rate > 0) { + mScript.invoke_addParticles(rate, x, y, id, !holdingColor[id]); + holdingColor[id] = true; + } else { + holdingColor[id] = false; + } + + } +} + diff --git a/tests/RenderScriptTests/FountainFbo/src/com/example/android/rs/fountainfbo/FountainFboView.java b/tests/RenderScriptTests/FountainFbo/src/com/example/android/rs/fountainfbo/FountainFboView.java new file mode 100644 index 0000000..6e40da3 --- /dev/null +++ b/tests/RenderScriptTests/FountainFbo/src/com/example/android/rs/fountainfbo/FountainFboView.java @@ -0,0 +1,91 @@ +/* + * 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. + */ + +package com.example.android.rs.fountainfbo; + + +import android.renderscript.RSTextureView; +import android.renderscript.RenderScriptGL; +import android.content.Context; +import android.view.MotionEvent; + +public class FountainFboView extends RSTextureView { + + public FountainFboView(Context context) { + super(context); + } + + private RenderScriptGL mRS; + private FountainFboRS mRender; + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + android.util.Log.e("rs", "onAttachedToWindow"); + if (mRS == null) { + RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); + mRS = createRenderScriptGL(sc); + mRender = new FountainFboRS(); + mRender.init(mRS, getResources()); + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + android.util.Log.e("rs", "onDetachedFromWindow"); + if (mRS != null) { + mRS = null; + destroyRenderScriptGL(); + } + } + + + @Override + public boolean onTouchEvent(MotionEvent ev) + { + int act = ev.getActionMasked(); + if (act == ev.ACTION_UP) { + mRender.newTouchPosition(0, 0, 0, ev.getPointerId(0)); + return false; + } else if (act == MotionEvent.ACTION_POINTER_UP) { + // only one pointer going up, we can get the index like this + int pointerIndex = ev.getActionIndex(); + int pointerId = ev.getPointerId(pointerIndex); + mRender.newTouchPosition(0, 0, 0, pointerId); + } + int count = ev.getHistorySize(); + int pcount = ev.getPointerCount(); + + for (int p=0; p < pcount; p++) { + int id = ev.getPointerId(p); + mRender.newTouchPosition(ev.getX(p), + ev.getY(p), + ev.getPressure(p), + id); + + for (int i=0; i < count; i++) { + mRender.newTouchPosition(ev.getHistoricalX(p, i), + ev.getHistoricalY(p, i), + ev.getHistoricalPressure(p, i), + id); + } + } + return true; + } +} + + diff --git a/tests/RenderScriptTests/FountainFbo/src/com/example/android/rs/fountainfbo/fountainfbo.rs b/tests/RenderScriptTests/FountainFbo/src/com/example/android/rs/fountainfbo/fountainfbo.rs new file mode 100644 index 0000000..763f6ba --- /dev/null +++ b/tests/RenderScriptTests/FountainFbo/src/com/example/android/rs/fountainfbo/fountainfbo.rs @@ -0,0 +1,106 @@ +// Fountain test script +#pragma version(1) + +#pragma rs java_package_name(com.example.android.rs.fountainfbo) + +#pragma stateFragment(parent) + +#include "rs_graphics.rsh" + +static int newPart = 0; +rs_mesh partMesh; +rs_program_vertex gProgramVertex; + +//allocation for color buffer +rs_allocation gColorBuffer; +//fragment shader for rendering without a texture (used for rendering to framebuffer object) +rs_program_fragment gProgramFragment; +//fragment shader for rendering with a texture (used for rendering to default framebuffer) +rs_program_fragment gTextureProgramFragment; + +typedef struct __attribute__((packed, aligned(4))) Point { + float2 delta; + float2 position; + uchar4 color; +} Point_t; +Point_t *point; + +int root() { + float dt = min(rsGetDt(), 0.1f); + rsgClearColor(0.f, 0.f, 0.f, 1.f); + const float height = rsgGetHeight(); + const int size = rsAllocationGetDimX(rsGetAllocation(point)); + float dy2 = dt * (10.f); + Point_t * p = point; + for (int ct=0; ct < size; ct++) { + p->delta.y += dy2; + p->position += p->delta; + if ((p->position.y > height) && (p->delta.y > 0)) { + p->delta.y *= -0.3f; + } + p++; + } + //Tell Renderscript runtime to render to the frame buffer object + rsgBindColorTarget(gColorBuffer, 0); + + //Begin rendering on a white background + rsgClearColor(1.f, 1.f, 1.f, 1.f); + rsgDrawMesh(partMesh); + + //When done, tell Renderscript runtime to stop rendering to framebuffer object + rsgClearAllRenderTargets(); + + //Bind a new fragment shader that declares the framebuffer object to be used as a texture + rsgBindProgramFragment(gTextureProgramFragment); + + //Bind the framebuffer object to the fragment shader at slot 0 as a texture + rsgBindTexture(gTextureProgramFragment, 0, gColorBuffer); + + //Draw a quad using the framebuffer object as the texture + float startX = 10, startY = 10; + float s = 256; + rsgDrawQuadTexCoords(startX, startY, 0, 0, 1, + startX, startY + s, 0, 0, 0, + startX + s, startY + s, 0, 1, 0, + startX + s, startY, 0, 1, 1); + + //Rebind the original fragment shader to render as normal + rsgBindProgramFragment(gProgramFragment); + + //Render the main scene + rsgDrawMesh(partMesh); + + return 1; +} + +static float4 partColor[10]; +void addParticles(int rate, float x, float y, int index, bool newColor) +{ + if (newColor) { + partColor[index].x = rsRand(0.5f, 1.0f); + partColor[index].y = rsRand(1.0f); + partColor[index].z = rsRand(1.0f); + } + float rMax = ((float)rate) * 0.02f; + int size = rsAllocationGetDimX(rsGetAllocation(point)); + uchar4 c = rsPackColorTo8888(partColor[index]); + + Point_t * np = &point[newPart]; + float2 p = {x, y}; + while (rate--) { + float angle = rsRand(3.14f * 2.f); + float len = rsRand(rMax); + np->delta.x = len * sin(angle); + np->delta.y = len * cos(angle); + np->position = p; + np->color = c; + newPart++; + np++; + if (newPart >= size) { + newPart = 0; + np = &point[newPart]; + } + } +} + + diff --git a/tests/RenderScriptTests/HelloWorld/Android.mk b/tests/RenderScriptTests/HelloWorld/Android.mk new file mode 100644 index 0000000..2af1cdb --- /dev/null +++ b/tests/RenderScriptTests/HelloWorld/Android.mk @@ -0,0 +1,28 @@ +# +# 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. +# + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src) + +LOCAL_PACKAGE_NAME := RsHelloWorld + +LOCAL_SDK_VERSION := current + +include $(BUILD_PACKAGE) diff --git a/tests/RenderScriptTests/HelloWorld/AndroidManifest.xml b/tests/RenderScriptTests/HelloWorld/AndroidManifest.xml new file mode 100644 index 0000000..1d37dc9 --- /dev/null +++ b/tests/RenderScriptTests/HelloWorld/AndroidManifest.xml @@ -0,0 +1,31 @@ +<?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. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.example.android.rs.helloworld"> + <uses-sdk android:minSdkVersion="11" /> + <application android:label="RsHelloWorld" + android:icon="@drawable/test_pattern"> + <activity android:name="HelloWorld" + android:label="RsHelloWorld" + android:theme="@android:style/Theme.Black.NoTitleBar"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> +</manifest> diff --git a/tests/RenderScriptTests/HelloWorld/_index.html b/tests/RenderScriptTests/HelloWorld/_index.html new file mode 100644 index 0000000..4cab738 --- /dev/null +++ b/tests/RenderScriptTests/HelloWorld/_index.html @@ -0,0 +1 @@ +<p>A Renderscript graphics application that draws the text "Hello, World!" where the user touches.</p>
\ No newline at end of file diff --git a/tests/RenderScriptTests/HelloWorld/res/drawable/test_pattern.png b/tests/RenderScriptTests/HelloWorld/res/drawable/test_pattern.png Binary files differnew file mode 100644 index 0000000..e7d1455 --- /dev/null +++ b/tests/RenderScriptTests/HelloWorld/res/drawable/test_pattern.png diff --git a/tests/RenderScriptTests/HelloWorld/src/com/example/android/rs/helloworld/HelloWorld.java b/tests/RenderScriptTests/HelloWorld/src/com/example/android/rs/helloworld/HelloWorld.java new file mode 100644 index 0000000..9b1697b --- /dev/null +++ b/tests/RenderScriptTests/HelloWorld/src/com/example/android/rs/helloworld/HelloWorld.java @@ -0,0 +1,54 @@ +/* + * 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.example.android.rs.helloworld; + +import android.app.Activity; +import android.os.Bundle; + +// Renderscript activity +public class HelloWorld extends Activity { + + // Custom view to use with RenderScript + private HelloWorldView mView; + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + // Create our view and set it as the content of our Activity + mView = new HelloWorldView(this); + setContentView(mView); + } + + @Override + protected void onResume() { + // Ideally an app should implement onResume() and onPause() + // to take appropriate action when the activity loses focus + super.onResume(); + mView.resume(); + } + + @Override + protected void onPause() { + // Ideally an app should implement onResume() and onPause() + // to take appropriate action when the activity loses focus + super.onPause(); + mView.pause(); + } + +} + diff --git a/tests/RenderScriptTests/HelloWorld/src/com/example/android/rs/helloworld/HelloWorldRS.java b/tests/RenderScriptTests/HelloWorld/src/com/example/android/rs/helloworld/HelloWorldRS.java new file mode 100644 index 0000000..4316411 --- /dev/null +++ b/tests/RenderScriptTests/HelloWorld/src/com/example/android/rs/helloworld/HelloWorldRS.java @@ -0,0 +1,52 @@ +/* + * 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.example.android.rs.helloworld; + +import android.content.res.Resources; +import android.renderscript.*; + +// This is the renderer for the HelloWorldView +public class HelloWorldRS { + private Resources mRes; + private RenderScriptGL mRS; + + private ScriptC_helloworld mScript; + + public HelloWorldRS() { + } + + // This provides us with the renderscript context and resources that + // allow us to create the script that does rendering + public void init(RenderScriptGL rs, Resources res) { + mRS = rs; + mRes = res; + initRS(); + } + + public void onActionDown(int x, int y) { + mScript.set_gTouchX(x); + mScript.set_gTouchY(y); + } + + private void initRS() { + mScript = new ScriptC_helloworld(mRS, mRes, R.raw.helloworld); + mRS.bindRootScript(mScript); + } +} + + + diff --git a/tests/RenderScriptTests/HelloWorld/src/com/example/android/rs/helloworld/HelloWorldView.java b/tests/RenderScriptTests/HelloWorld/src/com/example/android/rs/helloworld/HelloWorldView.java new file mode 100644 index 0000000..557ebc5 --- /dev/null +++ b/tests/RenderScriptTests/HelloWorld/src/com/example/android/rs/helloworld/HelloWorldView.java @@ -0,0 +1,76 @@ +/* + * 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.example.android.rs.helloworld; + +import android.renderscript.RSSurfaceView; +import android.renderscript.RenderScriptGL; + +import android.content.Context; +import android.view.MotionEvent; + +public class HelloWorldView extends RSSurfaceView { + // Renderscipt context + private RenderScriptGL mRS; + // Script that does the rendering + private HelloWorldRS mRender; + + public HelloWorldView(Context context) { + super(context); + ensureRenderScript(); + } + + private void ensureRenderScript() { + if (mRS == null) { + // Initialize renderscript with desired surface characteristics. + // In this case, just use the defaults + RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); + mRS = createRenderScriptGL(sc); + // Create an instance of the script that does the rendering + mRender = new HelloWorldRS(); + mRender.init(mRS, getResources()); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + ensureRenderScript(); + } + + @Override + protected void onDetachedFromWindow() { + // Handle the system event and clean up + mRender = null; + if (mRS != null) { + mRS = null; + destroyRenderScriptGL(); + } + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + // Pass touch events from the system to the rendering script + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + mRender.onActionDown((int)ev.getX(), (int)ev.getY()); + return true; + } + + return false; + } +} + + diff --git a/tests/RenderScriptTests/HelloWorld/src/com/example/android/rs/helloworld/helloworld.rs b/tests/RenderScriptTests/HelloWorld/src/com/example/android/rs/helloworld/helloworld.rs new file mode 100644 index 0000000..bcf624e --- /dev/null +++ b/tests/RenderScriptTests/HelloWorld/src/com/example/android/rs/helloworld/helloworld.rs @@ -0,0 +1,47 @@ +// 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. + +#pragma version(1) + +// Tell which java package name the reflected files should belong to +#pragma rs java_package_name(com.example.android.rs.helloworld) + +// Built-in header with graphics API's +#include "rs_graphics.rsh" + +// gTouchX and gTouchY are variables that will be reflected for use +// by the java API. We can use them to notify the script of touch events. +int gTouchX; +int gTouchY; + +// This is invoked automatically when the script is created +void init() { + gTouchX = 50.0f; + gTouchY = 50.0f; +} + +int root(void) { + + // Clear the background color + rsgClearColor(0.0f, 0.0f, 0.0f, 0.0f); + // Tell the runtime what the font color should be + rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f); + // Introuduce ourselves to the world by drawing a greeting + // at the position user touched on the screen + rsgDrawText("Hello World!", gTouchX, gTouchY); + + // Return value tells RS roughly how often to redraw + // in this case 20 ms + return 20; +} diff --git a/tests/RenderScriptTests/MiscSamples/Android.mk b/tests/RenderScriptTests/MiscSamples/Android.mk new file mode 100644 index 0000000..6b8b691 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/Android.mk @@ -0,0 +1,28 @@ +# +# 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. +# + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src) + +LOCAL_PACKAGE_NAME := RsMiscSamples + +LOCAL_SDK_VERSION := current + +include $(BUILD_PACKAGE) diff --git a/tests/RenderScriptTests/MiscSamples/AndroidManifest.xml b/tests/RenderScriptTests/MiscSamples/AndroidManifest.xml new file mode 100644 index 0000000..08a3976 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/AndroidManifest.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.example.android.rs.miscsamples"> + <uses-sdk android:minSdkVersion="11" /> + <application android:label="RsMiscSamples" + android:icon="@drawable/test_pattern"> + <activity android:name="RsList" + android:label="RsList" + android:theme="@android:style/Theme.Black.NoTitleBar"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + + <activity android:name="RsRenderStates" + android:label="RsStates" + android:theme="@android:style/Theme.Black.NoTitleBar"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> +</manifest> diff --git a/tests/RenderScriptTests/MiscSamples/_index.html b/tests/RenderScriptTests/MiscSamples/_index.html new file mode 100644 index 0000000..5872431 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/_index.html @@ -0,0 +1 @@ +<p>A set of samples that demonstrate how to use various features of the Renderscript APIs.</p>
\ No newline at end of file diff --git a/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/checker.png b/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/checker.png Binary files differnew file mode 100644 index 0000000..b631e1e --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/checker.png diff --git a/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/cubemap_test.png b/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/cubemap_test.png Binary files differnew file mode 100644 index 0000000..baf35d0 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/cubemap_test.png diff --git a/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/data.png b/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/data.png Binary files differnew file mode 100644 index 0000000..8e34714 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/data.png diff --git a/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/leaf.png b/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/leaf.png Binary files differnew file mode 100644 index 0000000..3cd3775 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/leaf.png diff --git a/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/test_pattern.png b/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/test_pattern.png Binary files differnew file mode 100644 index 0000000..e7d1455 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/test_pattern.png diff --git a/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/torusmap.png b/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/torusmap.png Binary files differnew file mode 100644 index 0000000..1e08f3b --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/drawable-nodpi/torusmap.png diff --git a/tests/RenderScriptTests/MiscSamples/res/raw/multitexf.glsl b/tests/RenderScriptTests/MiscSamples/res/raw/multitexf.glsl new file mode 100644 index 0000000..e492a47 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/raw/multitexf.glsl @@ -0,0 +1,13 @@ +varying vec2 varTex0; + +void main() { + vec2 t0 = varTex0.xy; + lowp vec4 col0 = texture2D(UNI_Tex0, t0).rgba; + lowp vec4 col1 = texture2D(UNI_Tex1, t0*4.0).rgba; + lowp vec4 col2 = texture2D(UNI_Tex2, t0).rgba; + col0.xyz = col0.xyz*col1.xyz*1.5; + col0.xyz = mix(col0.xyz, col2.xyz, col2.w); + col0.w = 0.5; + gl_FragColor = col0; +} + diff --git a/tests/RenderScriptTests/MiscSamples/res/raw/shader2f.glsl b/tests/RenderScriptTests/MiscSamples/res/raw/shader2f.glsl new file mode 100644 index 0000000..5fc05f1 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/raw/shader2f.glsl @@ -0,0 +1,29 @@ +varying vec3 varWorldPos; +varying vec3 varWorldNormal; +varying vec2 varTex0; + +void main() { + + vec3 V = normalize(-varWorldPos.xyz); + vec3 worldNorm = normalize(varWorldNormal); + + vec3 light0Vec = normalize(UNI_light0_Posision.xyz - varWorldPos); + vec3 light0R = -reflect(light0Vec, worldNorm); + float light0_Diffuse = clamp(dot(worldNorm, light0Vec), 0.0, 1.0) * UNI_light0_Diffuse; + float light0Spec = clamp(dot(light0R, V), 0.001, 1.0); + float light0_Specular = pow(light0Spec, UNI_light0_CosinePower) * UNI_light0_Specular; + + vec3 light1Vec = normalize(UNI_light1_Posision.xyz - varWorldPos); + vec3 light1R = reflect(light1Vec, worldNorm); + float light1_Diffuse = clamp(dot(worldNorm, light1Vec), 0.0, 1.0) * UNI_light1_Diffuse; + float light1Spec = clamp(dot(light1R, V), 0.001, 1.0); + float light1_Specular = pow(light1Spec, UNI_light1_CosinePower) * UNI_light1_Specular; + + vec2 t0 = varTex0.xy; + lowp vec4 col = texture2D(UNI_Tex0, t0).rgba; + col.xyz = col.xyz * (light0_Diffuse * UNI_light0_DiffuseColor.xyz + light1_Diffuse * UNI_light1_DiffuseColor.xyz); + col.xyz += light0_Specular * UNI_light0_SpecularColor.xyz; + col.xyz += light1_Specular * UNI_light1_SpecularColor.xyz; + gl_FragColor = col; +} + diff --git a/tests/RenderScriptTests/MiscSamples/res/raw/shader2movev.glsl b/tests/RenderScriptTests/MiscSamples/res/raw/shader2movev.glsl new file mode 100644 index 0000000..a2c807e --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/raw/shader2movev.glsl @@ -0,0 +1,21 @@ +varying vec3 varWorldPos; +varying vec3 varWorldNormal; +varying vec2 varTex0; + +// This is where actual shader code begins +void main() { + vec4 objPos = ATTRIB_position; + vec3 oldPos = objPos.xyz; + objPos.xyz += 0.1*sin(objPos.xyz*2.0 + UNI_time); + objPos.xyz += 0.05*sin(objPos.xyz*4.0 + UNI_time*0.5); + objPos.xyz += 0.02*sin(objPos.xyz*7.0 + UNI_time*0.75); + vec4 worldPos = UNI_model * objPos; + gl_Position = UNI_proj * worldPos; + + mat3 model3 = mat3(UNI_model[0].xyz, UNI_model[1].xyz, UNI_model[2].xyz); + vec3 worldNorm = model3 * (ATTRIB_normal + oldPos - objPos.xyz); + + varWorldPos = worldPos.xyz; + varWorldNormal = worldNorm; + varTex0 = ATTRIB_texture0; +} diff --git a/tests/RenderScriptTests/MiscSamples/res/raw/shader2v.glsl b/tests/RenderScriptTests/MiscSamples/res/raw/shader2v.glsl new file mode 100644 index 0000000..e6885a3 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/raw/shader2v.glsl @@ -0,0 +1,17 @@ +varying vec3 varWorldPos; +varying vec3 varWorldNormal; +varying vec2 varTex0; + +// This is where actual shader code begins +void main() { + vec4 objPos = ATTRIB_position; + vec4 worldPos = UNI_model * objPos; + gl_Position = UNI_proj * worldPos; + + mat3 model3 = mat3(UNI_model[0].xyz, UNI_model[1].xyz, UNI_model[2].xyz); + vec3 worldNorm = model3 * ATTRIB_normal; + + varWorldPos = worldPos.xyz; + varWorldNormal = worldNorm; + varTex0 = ATTRIB_texture0; +} diff --git a/tests/RenderScriptTests/MiscSamples/res/raw/shaderarrayf.glsl b/tests/RenderScriptTests/MiscSamples/res/raw/shaderarrayf.glsl new file mode 100644 index 0000000..238ecad --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/raw/shaderarrayf.glsl @@ -0,0 +1,16 @@ + +varying lowp float light0_Diffuse; +varying lowp float light0_Specular; +varying lowp float light1_Diffuse; +varying lowp float light1_Specular; +varying vec2 varTex0; + +void main() { + vec2 t0 = varTex0.xy; + lowp vec4 col = texture2D(UNI_Tex0, t0).rgba; + col.xyz = col.xyz * (light0_Diffuse * UNI_light_DiffuseColor[0].xyz + light1_Diffuse * UNI_light_DiffuseColor[1].xyz); + col.xyz += light0_Specular * UNI_light_SpecularColor[0].xyz; + col.xyz += light1_Specular * UNI_light_SpecularColor[1].xyz; + gl_FragColor = col; +} + diff --git a/tests/RenderScriptTests/MiscSamples/res/raw/shaderarrayv.glsl b/tests/RenderScriptTests/MiscSamples/res/raw/shaderarrayv.glsl new file mode 100644 index 0000000..7a1310a --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/raw/shaderarrayv.glsl @@ -0,0 +1,32 @@ +varying float light0_Diffuse; +varying float light0_Specular; +varying float light1_Diffuse; +varying float light1_Specular; +varying vec2 varTex0; + +// This is where actual shader code begins +void main() { + vec4 worldPos = UNI_model[0] * ATTRIB_position; + worldPos = UNI_model[1] * worldPos; + gl_Position = UNI_proj * worldPos; + + mat4 model0 = UNI_model[0]; + mat3 model3 = mat3(model0[0].xyz, model0[1].xyz, model0[2].xyz); + vec3 worldNorm = model3 * ATTRIB_normal; + vec3 V = normalize(-worldPos.xyz); + + vec3 light0Vec = normalize(UNI_light_Posision[0].xyz - worldPos.xyz); + vec3 light0R = -reflect(light0Vec, worldNorm); + light0_Diffuse = clamp(dot(worldNorm, light0Vec), 0.0, 1.0) * UNI_light_Diffuse[0]; + float light0Spec = clamp(dot(light0R, V), 0.001, 1.0); + light0_Specular = pow(light0Spec, UNI_light_CosinePower[0]) * UNI_light_Specular[0]; + + vec3 light1Vec = normalize(UNI_light_Posision[1].xyz - worldPos.xyz); + vec3 light1R = reflect(light1Vec, worldNorm); + light1_Diffuse = clamp(dot(worldNorm, light1Vec), 0.0, 1.0) * UNI_light_Diffuse[1]; + float light1Spec = clamp(dot(light1R, V), 0.001, 1.0); + light1_Specular = pow(light1Spec, UNI_light_CosinePower[1]) * UNI_light_Specular[1]; + + gl_PointSize = 1.0; + varTex0 = ATTRIB_texture0; +} diff --git a/tests/RenderScriptTests/MiscSamples/res/raw/shadercubef.glsl b/tests/RenderScriptTests/MiscSamples/res/raw/shadercubef.glsl new file mode 100644 index 0000000..15696a4 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/raw/shadercubef.glsl @@ -0,0 +1,8 @@ + +varying vec3 worldNormal; + +void main() { + lowp vec4 col = textureCube(UNI_Tex0, worldNormal); + gl_FragColor = col; +} + diff --git a/tests/RenderScriptTests/MiscSamples/res/raw/shadercubev.glsl b/tests/RenderScriptTests/MiscSamples/res/raw/shadercubev.glsl new file mode 100644 index 0000000..70f5cd6 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/raw/shadercubev.glsl @@ -0,0 +1,10 @@ +varying vec3 worldNormal; + +// This is where actual shader code begins +void main() { + vec4 worldPos = UNI_model * ATTRIB_position; + gl_Position = UNI_proj * worldPos; + + mat3 model3 = mat3(UNI_model[0].xyz, UNI_model[1].xyz, UNI_model[2].xyz); + worldNormal = model3 * ATTRIB_normal; +} diff --git a/tests/RenderScriptTests/MiscSamples/res/raw/shaderf.glsl b/tests/RenderScriptTests/MiscSamples/res/raw/shaderf.glsl new file mode 100644 index 0000000..d56e203 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/raw/shaderf.glsl @@ -0,0 +1,16 @@ + +varying lowp float light0_Diffuse; +varying lowp float light0_Specular; +varying lowp float light1_Diffuse; +varying lowp float light1_Specular; +varying vec2 varTex0; + +void main() { + vec2 t0 = varTex0.xy; + lowp vec4 col = texture2D(UNI_Tex0, t0).rgba; + col.xyz = col.xyz * (light0_Diffuse * UNI_light0_DiffuseColor.xyz + light1_Diffuse * UNI_light1_DiffuseColor.xyz); + col.xyz += light0_Specular * UNI_light0_SpecularColor.xyz; + col.xyz += light1_Specular * UNI_light1_SpecularColor.xyz; + gl_FragColor = col; +} + diff --git a/tests/RenderScriptTests/MiscSamples/res/raw/shaderv.glsl b/tests/RenderScriptTests/MiscSamples/res/raw/shaderv.glsl new file mode 100644 index 0000000..f7d01de --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/raw/shaderv.glsl @@ -0,0 +1,30 @@ +varying float light0_Diffuse; +varying float light0_Specular; +varying float light1_Diffuse; +varying float light1_Specular; +varying vec2 varTex0; + +// This is where actual shader code begins +void main() { + vec4 worldPos = UNI_model * ATTRIB_position; + gl_Position = UNI_proj * worldPos; + + mat3 model3 = mat3(UNI_model[0].xyz, UNI_model[1].xyz, UNI_model[2].xyz); + vec3 worldNorm = model3 * ATTRIB_normal; + vec3 V = normalize(-worldPos.xyz); + + vec3 light0Vec = normalize(UNI_light0_Posision.xyz - worldPos.xyz); + vec3 light0R = -reflect(light0Vec, worldNorm); + light0_Diffuse = clamp(dot(worldNorm, light0Vec), 0.0, 1.0) * UNI_light0_Diffuse; + float light0Spec = clamp(dot(light0R, V), 0.001, 1.0); + light0_Specular = pow(light0Spec, UNI_light0_CosinePower) * UNI_light0_Specular; + + vec3 light1Vec = normalize(UNI_light1_Posision.xyz - worldPos.xyz); + vec3 light1R = reflect(light1Vec, worldNorm); + light1_Diffuse = clamp(dot(worldNorm, light1Vec), 0.0, 1.0) * UNI_light1_Diffuse; + float light1Spec = clamp(dot(light1R, V), 0.001, 1.0); + light1_Specular = pow(light1Spec, UNI_light1_CosinePower) * UNI_light1_Specular; + + gl_PointSize = 1.0; + varTex0 = ATTRIB_texture0; +} diff --git a/tests/RenderScriptTests/MiscSamples/res/raw/torus.a3d b/tests/RenderScriptTests/MiscSamples/res/raw/torus.a3d Binary files differnew file mode 100644 index 0000000..0322b01 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/res/raw/torus.a3d diff --git a/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsList.java b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsList.java new file mode 100644 index 0000000..dade3b3 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsList.java @@ -0,0 +1,53 @@ +/* + * 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. + */ + +package com.example.android.rs.miscsamples; + +import android.app.Activity; +import android.os.Bundle; + +public class RsList extends Activity { + + private RsListView mView; + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + // Create our Preview view and set it as the content of our + // Activity + mView = new RsListView(this); + setContentView(mView); + } + + @Override + protected void onResume() { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity loses focus + super.onResume(); + mView.resume(); + } + + @Override + protected void onPause() { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity loses focus + super.onPause(); + mView.pause(); + } + +} + diff --git a/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsListRS.java b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsListRS.java new file mode 100644 index 0000000..eeb2480 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsListRS.java @@ -0,0 +1,140 @@ +/* + * 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. + */ + +package com.example.android.rs.miscsamples; + +import java.io.Writer; +import java.util.Vector; + +import android.content.res.Resources; +import android.renderscript.*; +import android.renderscript.ProgramStore.DepthFunc; +import android.util.Log; + + +public class RsListRS { + + private final int STATE_LAST_FOCUS = 1; + + private static final String[] DATA_LIST = { + "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", + "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina", + "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan", + "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", + "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia", + "Bosnia and Herzegovina", "Botswana", "Bouvet Island", "Brazil", + "British Indian Ocean Territory", "British Virgin Islands", "Brunei", "Bulgaria", + "Burkina Faso", "Burundi", "Cote d'Ivoire", "Cambodia", "Cameroon", "Canada", "Cape Verde", + "Cayman Islands", "Central African Republic", "Chad", "Chile", "China", + "Christmas Island", "Cocos (Keeling) Islands", "Colombia", "Comoros", "Congo", + "Cook Islands", "Costa Rica", "Croatia", "Cuba", "Cyprus", "Czech Republic", + "Democratic Republic of the Congo", "Denmark", "Djibouti", "Dominica", "Dominican Republic", + "East Timor", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea", + "Estonia", "Ethiopia", "Faeroe Islands", "Falkland Islands", "Fiji", "Finland", + "Former Yugoslav Republic of Macedonia", "France", "French Guiana", "French Polynesia", + "French Southern Territories", "Gabon", "Georgia", "Germany", "Ghana", "Gibraltar", + "Greece", "Greenland", "Grenada", "Guadeloupe", "Guam", "Guatemala", "Guinea", "Guinea-Bissau", + "Guyana", "Haiti", "Heard Island and McDonald Islands", "Honduras", "Hong Kong", "Hungary", + "Iceland", "India", "Indonesia", "Iran", "Iraq", "Ireland", "Israel", "Italy", "Jamaica", + "Japan", "Jordan", "Kazakhstan", "Kenya", "Kiribati", "Kuwait", "Kyrgyzstan", "Laos", + "Latvia", "Lebanon", "Lesotho", "Liberia", "Libya", "Liechtenstein", "Lithuania", "Luxembourg", + "Macau", "Madagascar", "Malawi", "Malaysia", "Maldives", "Mali", "Malta", "Marshall Islands", + "Martinique", "Mauritania", "Mauritius", "Mayotte", "Mexico", "Micronesia", "Moldova", + "Monaco", "Mongolia", "Montserrat", "Morocco", "Mozambique", "Myanmar", "Namibia", + "Nauru", "Nepal", "Netherlands", "Netherlands Antilles", "New Caledonia", "New Zealand", + "Nicaragua", "Niger", "Nigeria", "Niue", "Norfolk Island", "North Korea", "Northern Marianas", + "Norway", "Oman", "Pakistan", "Palau", "Panama", "Papua New Guinea", "Paraguay", "Peru", + "Philippines", "Pitcairn Islands", "Poland", "Portugal", "Puerto Rico", "Qatar", + "Reunion", "Romania", "Russia", "Rwanda", "Sqo Tome and Principe", "Saint Helena", + "Saint Kitts and Nevis", "Saint Lucia", "Saint Pierre and Miquelon", + "Saint Vincent and the Grenadines", "Samoa", "San Marino", "Saudi Arabia", "Senegal", + "Seychelles", "Sierra Leone", "Singapore", "Slovakia", "Slovenia", "Solomon Islands", + "Somalia", "South Africa", "South Georgia and the South Sandwich Islands", "South Korea", + "Spain", "Sri Lanka", "Sudan", "Suriname", "Svalbard and Jan Mayen", "Swaziland", "Sweden", + "Switzerland", "Syria", "Taiwan", "Tajikistan", "Tanzania", "Thailand", "The Bahamas", + "The Gambia", "Togo", "Tokelau", "Tonga", "Trinidad and Tobago", "Tunisia", "Turkey", + "Turkmenistan", "Turks and Caicos Islands", "Tuvalu", "Virgin Islands", "Uganda", + "Ukraine", "United Arab Emirates", "United Kingdom", + "United States", "United States Minor Outlying Islands", "Uruguay", "Uzbekistan", + "Vanuatu", "Vatican City", "Venezuela", "Vietnam", "Wallis and Futuna", "Western Sahara", + "Yemen", "Yugoslavia", "Zambia", "Zimbabwe" + }; + + public RsListRS() { + } + + public void init(RenderScriptGL rs, Resources res) { + mRS = rs; + mRes = res; + initRS(); + } + + private Resources mRes; + private RenderScriptGL mRS; + private Font mItalic; + + ScriptField_ListAllocs_s mListAllocs; + + private ScriptC_rslist mScript; + + int mLastX; + int mLastY; + + public void onActionDown(int x, int y) { + mScript.set_gDY(0.0f); + + mLastX = x; + mLastY = y; + } + + public void onActionMove(int x, int y) { + int dx = mLastX - x; + int dy = mLastY - y; + + if (Math.abs(dy) <= 2) { + dy = 0; + } + + mScript.set_gDY(dy); + + mLastX = x; + mLastY = y; + } + + private void initRS() { + + mScript = new ScriptC_rslist(mRS, mRes, R.raw.rslist); + + mListAllocs = new ScriptField_ListAllocs_s(mRS, DATA_LIST.length); + for (int i = 0; i < DATA_LIST.length; i ++) { + ScriptField_ListAllocs_s.Item listElem = new ScriptField_ListAllocs_s.Item(); + listElem.text = Allocation.createFromString(mRS, DATA_LIST[i], Allocation.USAGE_SCRIPT); + mListAllocs.set(listElem, i, false); + } + + mListAllocs.copyAll(); + + mScript.bind_gList(mListAllocs); + + mItalic = Font.create(mRS, mRes, "serif", Font.Style.BOLD_ITALIC, 8); + mScript.set_gItalic(mItalic); + + mRS.bindRootScript(mScript); + } +} + + + diff --git a/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsListView.java b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsListView.java new file mode 100644 index 0000000..db6e6c5 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsListView.java @@ -0,0 +1,75 @@ +/* + * 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. + */ + +package com.example.android.rs.miscsamples; +import android.renderscript.RSSurfaceView; +import android.renderscript.RenderScriptGL; + +import android.content.Context; +import android.view.MotionEvent; + +public class RsListView extends RSSurfaceView { + + public RsListView(Context context) { + super(context); + ensureRenderScript(); + } + + private RenderScriptGL mRS; + private RsListRS mRender; + + private void ensureRenderScript() { + if (mRS == null) { + RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); + mRS = createRenderScriptGL(sc); + mRender = new RsListRS(); + mRender.init(mRS, getResources()); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + ensureRenderScript(); + } + + @Override + protected void onDetachedFromWindow() { + mRender = null; + if (mRS != null) { + mRS = null; + destroyRenderScriptGL(); + } + } + + @Override + public boolean onTouchEvent(MotionEvent ev) + { + boolean ret = false; + int act = ev.getAction(); + if (act == MotionEvent.ACTION_DOWN) { + mRender.onActionDown((int)ev.getX(), (int)ev.getY()); + ret = true; + } else if (act == MotionEvent.ACTION_MOVE) { + mRender.onActionMove((int)ev.getX(), (int)ev.getY()); + ret = true; + } + + return ret; + } +} + + diff --git a/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsRenderStates.java b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsRenderStates.java new file mode 100644 index 0000000..f4ea76e --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsRenderStates.java @@ -0,0 +1,53 @@ +/* + * 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. + */ + +package com.example.android.rs.miscsamples; + +import android.app.Activity; +import android.os.Bundle; + +public class RsRenderStates extends Activity { + + private RsRenderStatesView mView; + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + // Create our Preview view and set it as the content of our + // Activity + mView = new RsRenderStatesView(this); + setContentView(mView); + } + + @Override + protected void onResume() { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onResume(); + mView.resume(); + } + + @Override + protected void onPause() { + // Ideally a game should implement onResume() and onPause() + // to take appropriate action when the activity looses focus + super.onPause(); + mView.pause(); + } + +} + diff --git a/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsRenderStatesRS.java b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsRenderStatesRS.java new file mode 100644 index 0000000..0e319fe --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsRenderStatesRS.java @@ -0,0 +1,422 @@ +/* + * 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. + */ + +package com.example.android.rs.miscsamples; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.renderscript.*; +import android.renderscript.Font.Style; +import android.renderscript.Program.TextureType; +import android.renderscript.ProgramStore.DepthFunc; +import android.renderscript.ProgramStore.BlendSrcFunc; +import android.renderscript.ProgramStore.BlendDstFunc; +import android.renderscript.Sampler.Value; +import android.util.Log; + + +public class RsRenderStatesRS { + + int mWidth; + int mHeight; + + public RsRenderStatesRS() { + } + + public void init(RenderScriptGL rs, Resources res) { + mRS = rs; + mWidth = mRS.getWidth(); + mHeight = mRS.getHeight(); + mRes = res; + mOptionsARGB.inScaled = false; + mOptionsARGB.inPreferredConfig = Bitmap.Config.ARGB_8888; + mMode = 0; + mMaxModes = 0; + initRS(); + } + + public void surfaceChanged() { + mWidth = mRS.getWidth(); + mHeight = mRS.getHeight(); + + Matrix4f proj = new Matrix4f(); + proj.loadOrthoWindow(mWidth, mHeight); + mPVA.setProjection(proj); + } + + private Resources mRes; + private RenderScriptGL mRS; + + private Sampler mLinearClamp; + private Sampler mLinearWrap; + private Sampler mMipLinearWrap; + private Sampler mNearestClamp; + private Sampler mMipLinearAniso8; + private Sampler mMipLinearAniso15; + + private ProgramStore mProgStoreBlendNoneDepth; + private ProgramStore mProgStoreBlendNone; + private ProgramStore mProgStoreBlendAlpha; + private ProgramStore mProgStoreBlendAdd; + + private ProgramFragment mProgFragmentTexture; + private ProgramFragment mProgFragmentColor; + + private ProgramVertex mProgVertex; + private ProgramVertexFixedFunction.Constants mPVA; + + // Custom shaders + private ProgramVertex mProgVertexCustom; + private ProgramFragment mProgFragmentCustom; + private ProgramFragment mProgFragmentMultitex; + private ScriptField_VertexShaderConstants_s mVSConst; + private ScriptField_VertexShaderConstants2_s mVSConst2; + private ScriptField_FragentShaderConstants_s mFSConst; + private ScriptField_FragentShaderConstants2_s mFSConst2; + + private ProgramVertex mProgVertexCustom2; + private ProgramFragment mProgFragmentCustom2; + + private ProgramVertex mProgVertexCube; + private ProgramFragment mProgFragmentCube; + + private ProgramRaster mCullBack; + private ProgramRaster mCullFront; + private ProgramRaster mCullNone; + + private Allocation mTexTorus; + private Allocation mTexOpaque; + private Allocation mTexTransparent; + private Allocation mTexChecker; + private Allocation mTexCube; + + private Mesh mMbyNMesh; + private Mesh mTorus; + + Font mFontSans; + Font mFontSerif; + Font mFontSerifBold; + Font mFontSerifItalic; + Font mFontSerifBoldItalic; + Font mFontMono; + private Allocation mTextAlloc; + + private ScriptC_rsrenderstates mScript; + + private final BitmapFactory.Options mOptionsARGB = new BitmapFactory.Options(); + + int mMode; + int mMaxModes; + + public void onActionDown(int x, int y) { + mMode ++; + mMode = mMode % mMaxModes; + mScript.set_gDisplayMode(mMode); + } + + ProgramStore BLEND_ADD_DEPTH_NONE(RenderScript rs) { + ProgramStore.Builder builder = new ProgramStore.Builder(rs); + builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS); + builder.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE); + builder.setDitherEnabled(false); + builder.setDepthMaskEnabled(false); + return builder.create(); + } + + private Mesh getMbyNMesh(float width, float height, int wResolution, int hResolution) { + + Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS, + 2, Mesh.TriangleMeshBuilder.TEXTURE_0); + + for (int y = 0; y <= hResolution; y++) { + final float normalizedY = (float)y / hResolution; + final float yOffset = (normalizedY - 0.5f) * height; + for (int x = 0; x <= wResolution; x++) { + float normalizedX = (float)x / wResolution; + float xOffset = (normalizedX - 0.5f) * width; + tmb.setTexture(normalizedX, normalizedY); + tmb.addVertex(xOffset, yOffset); + } + } + + for (int y = 0; y < hResolution; y++) { + final int curY = y * (wResolution + 1); + final int belowY = (y + 1) * (wResolution + 1); + for (int x = 0; x < wResolution; x++) { + int curV = curY + x; + int belowV = belowY + x; + tmb.addTriangle(curV, belowV, curV + 1); + tmb.addTriangle(belowV, belowV + 1, curV + 1); + } + } + + return tmb.create(true); + } + + private void initProgramStore() { + // Use stock the stock program store object + mProgStoreBlendNoneDepth = ProgramStore.BLEND_NONE_DEPTH_TEST(mRS); + mProgStoreBlendNone = ProgramStore.BLEND_NONE_DEPTH_NONE(mRS); + + // Create a custom program store + ProgramStore.Builder builder = new ProgramStore.Builder(mRS); + builder.setDepthFunc(ProgramStore.DepthFunc.ALWAYS); + builder.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA, + ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA); + builder.setDitherEnabled(false); + builder.setDepthMaskEnabled(false); + mProgStoreBlendAlpha = builder.create(); + + mProgStoreBlendAdd = BLEND_ADD_DEPTH_NONE(mRS); + + mScript.set_gProgStoreBlendNoneDepth(mProgStoreBlendNoneDepth); + mScript.set_gProgStoreBlendNone(mProgStoreBlendNone); + mScript.set_gProgStoreBlendAlpha(mProgStoreBlendAlpha); + mScript.set_gProgStoreBlendAdd(mProgStoreBlendAdd); + } + + private void initProgramFragment() { + + ProgramFragmentFixedFunction.Builder texBuilder = new ProgramFragmentFixedFunction.Builder(mRS); + texBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE, + ProgramFragmentFixedFunction.Builder.Format.RGBA, 0); + mProgFragmentTexture = texBuilder.create(); + mProgFragmentTexture.bindSampler(mLinearClamp, 0); + + ProgramFragmentFixedFunction.Builder colBuilder = new ProgramFragmentFixedFunction.Builder(mRS); + colBuilder.setVaryingColor(false); + mProgFragmentColor = colBuilder.create(); + + mScript.set_gProgFragmentColor(mProgFragmentColor); + mScript.set_gProgFragmentTexture(mProgFragmentTexture); + } + + private void initProgramVertex() { + ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS); + mProgVertex = pvb.create(); + + mPVA = new ProgramVertexFixedFunction.Constants(mRS); + ((ProgramVertexFixedFunction)mProgVertex).bindConstants(mPVA); + Matrix4f proj = new Matrix4f(); + proj.loadOrthoWindow(mWidth, mHeight); + mPVA.setProjection(proj); + + mScript.set_gProgVertex(mProgVertex); + } + + private void initCustomShaders() { + mVSConst = new ScriptField_VertexShaderConstants_s(mRS, 1); + mVSConst2 = new ScriptField_VertexShaderConstants2_s(mRS, 1); + mFSConst = new ScriptField_FragentShaderConstants_s(mRS, 1); + mFSConst2 = new ScriptField_FragentShaderConstants2_s(mRS, 1); + + mScript.bind_gVSConstants(mVSConst); + mScript.bind_gVSConstants2(mVSConst2); + mScript.bind_gFSConstants(mFSConst); + mScript.bind_gFSConstants2(mFSConst2); + + // Initialize the shader builder + ProgramVertex.Builder pvbCustom = new ProgramVertex.Builder(mRS); + // Specify the resource that contains the shader string + pvbCustom.setShader(mRes, R.raw.shaderv); + // Use a script field to spcify the input layout + pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS)); + // Define the constant input layout + pvbCustom.addConstant(mVSConst.getAllocation().getType()); + mProgVertexCustom = pvbCustom.create(); + // Bind the source of constant data + mProgVertexCustom.bindConstants(mVSConst.getAllocation(), 0); + + ProgramFragment.Builder pfbCustom = new ProgramFragment.Builder(mRS); + // Specify the resource that contains the shader string + pfbCustom.setShader(mRes, R.raw.shaderf); + //Tell the builder how many textures we have + pfbCustom.addTexture(Program.TextureType.TEXTURE_2D); + // Define the constant input layout + pfbCustom.addConstant(mFSConst.getAllocation().getType()); + mProgFragmentCustom = pfbCustom.create(); + // Bind the source of constant data + mProgFragmentCustom.bindConstants(mFSConst.getAllocation(), 0); + + pvbCustom = new ProgramVertex.Builder(mRS); + pvbCustom.setShader(mRes, R.raw.shaderarrayv); + pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS)); + pvbCustom.addConstant(mVSConst2.getAllocation().getType()); + mProgVertexCustom2 = pvbCustom.create(); + mProgVertexCustom2.bindConstants(mVSConst2.getAllocation(), 0); + + pfbCustom = new ProgramFragment.Builder(mRS); + pfbCustom.setShader(mRes, R.raw.shaderarrayf); + pfbCustom.addTexture(Program.TextureType.TEXTURE_2D); + pfbCustom.addConstant(mFSConst2.getAllocation().getType()); + mProgFragmentCustom2 = pfbCustom.create(); + mProgFragmentCustom2.bindConstants(mFSConst2.getAllocation(), 0); + + // Cubemap test shaders + pvbCustom = new ProgramVertex.Builder(mRS); + pvbCustom.setShader(mRes, R.raw.shadercubev); + pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS)); + pvbCustom.addConstant(mVSConst.getAllocation().getType()); + mProgVertexCube = pvbCustom.create(); + mProgVertexCube.bindConstants(mVSConst.getAllocation(), 0); + + pfbCustom = new ProgramFragment.Builder(mRS); + pfbCustom.setShader(mRes, R.raw.shadercubef); + pfbCustom.addTexture(Program.TextureType.TEXTURE_CUBE); + mProgFragmentCube = pfbCustom.create(); + + pfbCustom = new ProgramFragment.Builder(mRS); + pfbCustom.setShader(mRes, R.raw.multitexf); + for (int texCount = 0; texCount < 3; texCount ++) { + pfbCustom.addTexture(Program.TextureType.TEXTURE_2D); + } + mProgFragmentMultitex = pfbCustom.create(); + + mScript.set_gProgVertexCustom(mProgVertexCustom); + mScript.set_gProgFragmentCustom(mProgFragmentCustom); + mScript.set_gProgVertexCustom2(mProgVertexCustom2); + mScript.set_gProgFragmentCustom2(mProgFragmentCustom2); + mScript.set_gProgVertexCube(mProgVertexCube); + mScript.set_gProgFragmentCube(mProgFragmentCube); + mScript.set_gProgFragmentMultitex(mProgFragmentMultitex); + } + + private Allocation loadTextureRGB(int id) { + return Allocation.createFromBitmapResource(mRS, mRes, id, + Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE, + Allocation.USAGE_GRAPHICS_TEXTURE); + } + + private Allocation loadTextureARGB(int id) { + Bitmap b = BitmapFactory.decodeResource(mRes, id, mOptionsARGB); + return Allocation.createFromBitmap(mRS, b, + Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE, + Allocation.USAGE_GRAPHICS_TEXTURE); + } + + private void loadImages() { + mTexTorus = loadTextureRGB(R.drawable.torusmap); + mTexOpaque = loadTextureRGB(R.drawable.data); + mTexTransparent = loadTextureARGB(R.drawable.leaf); + mTexChecker = loadTextureRGB(R.drawable.checker); + Bitmap b = BitmapFactory.decodeResource(mRes, R.drawable.cubemap_test); + mTexCube = Allocation.createCubemapFromBitmap(mRS, b); + + mScript.set_gTexTorus(mTexTorus); + mScript.set_gTexOpaque(mTexOpaque); + mScript.set_gTexTransparent(mTexTransparent); + mScript.set_gTexChecker(mTexChecker); + mScript.set_gTexCube(mTexCube); + } + + private void initFonts() { + // Sans font by family name + mFontSans = Font.create(mRS, mRes, "sans-serif", Font.Style.NORMAL, 8); + mFontSerif = Font.create(mRS, mRes, "serif", Font.Style.NORMAL, 8); + // Create fonts by family and style + mFontSerifBold = Font.create(mRS, mRes, "serif", Font.Style.BOLD, 8); + mFontSerifItalic = Font.create(mRS, mRes, "serif", Font.Style.ITALIC, 8); + mFontSerifBoldItalic = Font.create(mRS, mRes, "serif", Font.Style.BOLD_ITALIC, 8); + mFontMono = Font.create(mRS, mRes, "mono", Font.Style.NORMAL, 8); + + mTextAlloc = Allocation.createFromString(mRS, "String from allocation", Allocation.USAGE_SCRIPT); + + mScript.set_gFontSans(mFontSans); + mScript.set_gFontSerif(mFontSerif); + mScript.set_gFontSerifBold(mFontSerifBold); + mScript.set_gFontSerifItalic(mFontSerifItalic); + mScript.set_gFontSerifBoldItalic(mFontSerifBoldItalic); + mScript.set_gFontMono(mFontMono); + mScript.set_gTextAlloc(mTextAlloc); + } + + private void initMesh() { + mMbyNMesh = getMbyNMesh(256, 256, 10, 10); + mScript.set_gMbyNMesh(mMbyNMesh); + + FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.torus); + FileA3D.IndexEntry entry = model.getIndexEntry(0); + if (entry == null || entry.getEntryType() != FileA3D.EntryType.MESH) { + Log.e("rs", "could not load model"); + } else { + mTorus = (Mesh)entry.getObject(); + mScript.set_gTorusMesh(mTorus); + } + } + + private void initSamplers() { + Sampler.Builder bs = new Sampler.Builder(mRS); + bs.setMinification(Sampler.Value.LINEAR); + bs.setMagnification(Sampler.Value.LINEAR); + bs.setWrapS(Sampler.Value.WRAP); + bs.setWrapT(Sampler.Value.WRAP); + mLinearWrap = bs.create(); + + mLinearClamp = Sampler.CLAMP_LINEAR(mRS); + mNearestClamp = Sampler.CLAMP_NEAREST(mRS); + mMipLinearWrap = Sampler.WRAP_LINEAR_MIP_LINEAR(mRS); + + bs = new Sampler.Builder(mRS); + bs.setMinification(Sampler.Value.LINEAR_MIP_LINEAR); + bs.setMagnification(Sampler.Value.LINEAR); + bs.setWrapS(Sampler.Value.WRAP); + bs.setWrapT(Sampler.Value.WRAP); + bs.setAnisotropy(8.0f); + mMipLinearAniso8 = bs.create(); + bs.setAnisotropy(15.0f); + mMipLinearAniso15 = bs.create(); + + mScript.set_gLinearClamp(mLinearClamp); + mScript.set_gLinearWrap(mLinearWrap); + mScript.set_gMipLinearWrap(mMipLinearWrap); + mScript.set_gMipLinearAniso8(mMipLinearAniso8); + mScript.set_gMipLinearAniso15(mMipLinearAniso15); + mScript.set_gNearestClamp(mNearestClamp); + } + + private void initProgramRaster() { + mCullBack = ProgramRaster.CULL_BACK(mRS); + mCullFront = ProgramRaster.CULL_FRONT(mRS); + mCullNone = ProgramRaster.CULL_NONE(mRS); + + mScript.set_gCullBack(mCullBack); + mScript.set_gCullFront(mCullFront); + mScript.set_gCullNone(mCullNone); + } + + private void initRS() { + + mScript = new ScriptC_rsrenderstates(mRS, mRes, R.raw.rsrenderstates); + + mMaxModes = mScript.get_gMaxModes(); + + initSamplers(); + initProgramStore(); + initProgramFragment(); + initProgramVertex(); + initFonts(); + loadImages(); + initMesh(); + initProgramRaster(); + initCustomShaders(); + + mRS.bindRootScript(mScript); + } +} + + + diff --git a/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsRenderStatesView.java b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsRenderStatesView.java new file mode 100644 index 0000000..a15e38f --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/RsRenderStatesView.java @@ -0,0 +1,78 @@ +/* + * 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. + */ + +package com.example.android.rs.miscsamples; + +import android.renderscript.RSSurfaceView; +import android.renderscript.RenderScriptGL; + +import android.content.Context; +import android.view.MotionEvent; +import android.view.SurfaceHolder; + +public class RsRenderStatesView extends RSSurfaceView { + + public RsRenderStatesView(Context context) { + super(context); + ensureRenderScript(); + } + + private RenderScriptGL mRS; + private RsRenderStatesRS mRender; + + private void ensureRenderScript() { + if (mRS == null) { + RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); + sc.setDepth(16, 24); + mRS = createRenderScriptGL(sc); + mRender = new RsRenderStatesRS(); + mRender.init(mRS, getResources()); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + ensureRenderScript(); + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { + super.surfaceChanged(holder, format, w, h); + mRender.surfaceChanged(); + } + + @Override + protected void onDetachedFromWindow() { + mRender = null; + if (mRS != null) { + mRS = null; + destroyRenderScriptGL(); + } + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + mRender.onActionDown((int)ev.getX(), (int)ev.getY()); + return true; + } + + return false; + } +} + + diff --git a/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/rslist.rs b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/rslist.rs new file mode 100644 index 0000000..d9d450d --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/rslist.rs @@ -0,0 +1,70 @@ +// Copyright (C) 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. + +#pragma version(1) + +#pragma rs java_package_name(com.example.android.rs.miscsamples) + +#include "rs_graphics.rsh" + +float gDY; + +rs_font gItalic; + +typedef struct ListAllocs_s { + rs_allocation text; +} ListAllocs; + +ListAllocs *gList; + +void init() { + gDY = 0.0f; +} + +int textPos = 0; + +int root(void) { + + rsgClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + textPos -= (int)gDY*2; + gDY *= 0.95; + + rsgFontColor(0.9f, 0.9f, 0.9f, 1.0f); + rsgBindFont(gItalic); + + rs_allocation listAlloc; + listAlloc = rsGetAllocation(gList); + int allocSize = rsAllocationGetDimX(listAlloc); + + int width = rsgGetWidth(); + int height = rsgGetHeight(); + + int itemHeight = 80; + int currentYPos = itemHeight + textPos; + + for (int i = 0; i < allocSize; i ++) { + if (currentYPos - itemHeight > height) { + break; + } + + if (currentYPos > 0) { + rsgDrawRect(0, currentYPos - 1, width, currentYPos, 0); + rsgDrawText(gList[i].text, 30, currentYPos - 32); + } + currentYPos += itemHeight; + } + + return 10; +} diff --git a/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/rsrenderstates.rs b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/rsrenderstates.rs new file mode 100644 index 0000000..5dabd00 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/rsrenderstates.rs @@ -0,0 +1,680 @@ +// Copyright (C) 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. + +#pragma version(1) + +#pragma rs java_package_name(com.example.android.rs.miscsamples) + +#include "rs_graphics.rsh" +#include "shader_def.rsh" + +const int gMaxModes = 11; + +rs_program_vertex gProgVertex; +rs_program_fragment gProgFragmentColor; +rs_program_fragment gProgFragmentTexture; + +rs_program_store gProgStoreBlendNoneDepth; +rs_program_store gProgStoreBlendNone; +rs_program_store gProgStoreBlendAlpha; +rs_program_store gProgStoreBlendAdd; + +rs_allocation gTexOpaque; +rs_allocation gTexTorus; +rs_allocation gTexTransparent; +rs_allocation gTexChecker; +rs_allocation gTexCube; + +rs_mesh gMbyNMesh; +rs_mesh gTorusMesh; + +rs_font gFontSans; +rs_font gFontSerif; +rs_font gFontSerifBold; +rs_font gFontSerifItalic; +rs_font gFontSerifBoldItalic; +rs_font gFontMono; +rs_allocation gTextAlloc; + +int gDisplayMode; + +rs_sampler gLinearClamp; +rs_sampler gLinearWrap; +rs_sampler gMipLinearWrap; +rs_sampler gMipLinearAniso8; +rs_sampler gMipLinearAniso15; +rs_sampler gNearestClamp; + +rs_program_raster gCullBack; +rs_program_raster gCullFront; +rs_program_raster gCullNone; + +// Custom vertex shader compunents +VertexShaderConstants *gVSConstants; +VertexShaderConstants2 *gVSConstants2; +FragentShaderConstants *gFSConstants; +FragentShaderConstants2 *gFSConstants2; +// Export these out to easily set the inputs to shader +VertexShaderInputs *gVSInputs; +// Custom shaders we use for lighting +rs_program_vertex gProgVertexCustom; +rs_program_fragment gProgFragmentCustom; +rs_program_vertex gProgVertexCustom2; +rs_program_fragment gProgFragmentCustom2; +rs_program_vertex gProgVertexCube; +rs_program_fragment gProgFragmentCube; +rs_program_fragment gProgFragmentMultitex; + +float gDt = 0; + +void init() { +} + +static void displayFontSamples() { + rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f); + int yPos = 100; + rsgBindFont(gFontSans); + rsgDrawText("Sans font sample", 30, yPos); + yPos += 30; + rsgFontColor(0.5f, 0.9f, 0.5f, 1.0f); + rsgBindFont(gFontSerif); + rsgDrawText("Serif font sample", 30, yPos); + yPos += 30; + rsgFontColor(0.7f, 0.7f, 0.7f, 1.0f); + rsgBindFont(gFontSerifBold); + rsgDrawText("Serif Bold font sample", 30, yPos); + yPos += 30; + rsgFontColor(0.5f, 0.5f, 0.9f, 1.0f); + rsgBindFont(gFontSerifItalic); + rsgDrawText("Serif Italic font sample", 30, yPos); + yPos += 30; + rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f); + rsgBindFont(gFontSerifBoldItalic); + rsgDrawText("Serif Bold Italic font sample", 30, yPos); + yPos += 30; + rsgBindFont(gFontMono); + rsgDrawText("Monospace font sample", 30, yPos); + yPos += 50; + + // Now use text metrics to center the text + uint width = rsgGetWidth(); + uint height = rsgGetHeight(); + int left = 0, right = 0, top = 0, bottom = 0; + + rsgFontColor(0.9f, 0.9f, 0.95f, 1.0f); + rsgBindFont(gFontSerifBoldItalic); + + rsgMeasureText(gTextAlloc, &left, &right, &top, &bottom); + int centeredPos = width / 2 - (right - left) / 2; + rsgDrawText(gTextAlloc, centeredPos, yPos); + yPos += 30; + + const char* text = "Centered Text Sample"; + rsgMeasureText(text, &left, &right, &top, &bottom); + centeredPos = width / 2 - (right - left) / 2; + rsgDrawText(text, centeredPos, yPos); + yPos += 30; + + rsgBindFont(gFontSans); + text = "More Centered Text Samples"; + rsgMeasureText(text, &left, &right, &top, &bottom); + centeredPos = width / 2 - (right - left) / 2; + rsgDrawText(text, centeredPos, yPos); + yPos += 30; + + // Now draw bottom and top right aligned text + text = "Top-right aligned text"; + rsgMeasureText(text, &left, &right, &top, &bottom); + rsgDrawText(text, width - right, top); + + text = "Top-left"; + rsgMeasureText(text, &left, &right, &top, &bottom); + rsgDrawText(text, -left, top); + + text = "Bottom-right aligned text"; + rsgMeasureText(text, &left, &right, &top, &bottom); + rsgDrawText(text, width - right, height + bottom); + +} + +static void bindProgramVertexOrtho() { + // Default vertex sahder + rsgBindProgramVertex(gProgVertex); + // Setup the projectioni matrix + rs_matrix4x4 proj; + rsMatrixLoadOrtho(&proj, 0, rsgGetWidth(), rsgGetHeight(), 0, -500, 500); + rsgProgramVertexLoadProjectionMatrix(&proj); +} + +static void displayShaderSamples() { + bindProgramVertexOrtho(); + rs_matrix4x4 matrix; + rsMatrixLoadIdentity(&matrix); + rsgProgramVertexLoadModelMatrix(&matrix); + + // Fragment shader with texture + rsgBindProgramStore(gProgStoreBlendNone); + rsgBindProgramFragment(gProgFragmentTexture); + rsgBindSampler(gProgFragmentTexture, 0, gLinearClamp); + rsgBindTexture(gProgFragmentTexture, 0, gTexOpaque); + + float startX = 0, startY = 0; + float width = 256, height = 256; + rsgDrawQuadTexCoords(startX, startY, 0, 0, 0, + startX, startY + height, 0, 0, 1, + startX + width, startY + height, 0, 1, 1, + startX + width, startY, 0, 1, 0); + + startX = 200; startY = 0; + width = 128; height = 128; + rsgDrawQuadTexCoords(startX, startY, 0, 0, 0, + startX, startY + height, 0, 0, 1, + startX + width, startY + height, 0, 1, 1, + startX + width, startY, 0, 1, 0); + + rsgBindProgramStore(gProgStoreBlendAlpha); + rsgBindTexture(gProgFragmentTexture, 0, gTexTransparent); + startX = 0; startY = 200; + width = 128; height = 128; + rsgDrawQuadTexCoords(startX, startY, 0, 0, 0, + startX, startY + height, 0, 0, 1, + startX + width, startY + height, 0, 1, 1, + startX + width, startY, 0, 1, 0); + + // Fragment program with simple color + rsgBindProgramFragment(gProgFragmentColor); + rsgProgramFragmentConstantColor(gProgFragmentColor, 0.9, 0.3, 0.3, 1); + rsgDrawRect(200, 300, 350, 450, 0); + rsgProgramFragmentConstantColor(gProgFragmentColor, 0.3, 0.9, 0.3, 1); + rsgDrawRect(50, 400, 400, 600, 0); + + rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f); + rsgBindFont(gFontMono); + rsgDrawText("Texture shader", 10, 50); + rsgDrawText("Alpha-blended texture shader", 10, 280); + rsgDrawText("Flat color shader", 100, 450); +} + +static void displayBlendingSamples() { + int i; + + bindProgramVertexOrtho(); + rs_matrix4x4 matrix; + rsMatrixLoadIdentity(&matrix); + rsgProgramVertexLoadModelMatrix(&matrix); + + rsgBindProgramFragment(gProgFragmentColor); + + rsgBindProgramStore(gProgStoreBlendNone); + for (i = 0; i < 3; i ++) { + float iPlusOne = (float)(i + 1); + rsgProgramFragmentConstantColor(gProgFragmentColor, + 0.1f*iPlusOne, 0.2f*iPlusOne, 0.3f*iPlusOne, 1); + float yPos = 150 * (float)i; + rsgDrawRect(0, yPos, 200, yPos + 200, 0); + } + + rsgBindProgramStore(gProgStoreBlendAlpha); + for (i = 0; i < 3; i ++) { + float iPlusOne = (float)(i + 1); + rsgProgramFragmentConstantColor(gProgFragmentColor, + 0.2f*iPlusOne, 0.3f*iPlusOne, 0.1f*iPlusOne, 0.5); + float yPos = 150 * (float)i; + rsgDrawRect(150, yPos, 350, yPos + 200, 0); + } + + rsgBindProgramStore(gProgStoreBlendAdd); + for (i = 0; i < 3; i ++) { + float iPlusOne = (float)(i + 1); + rsgProgramFragmentConstantColor(gProgFragmentColor, + 0.3f*iPlusOne, 0.1f*iPlusOne, 0.2f*iPlusOne, 0.5); + float yPos = 150 * (float)i; + rsgDrawRect(300, yPos, 500, yPos + 200, 0); + } + + + rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f); + rsgBindFont(gFontMono); + rsgDrawText("No Blending", 10, 50); + rsgDrawText("Alpha Blending", 160, 150); + rsgDrawText("Additive Blending", 320, 250); + +} + +static void displayMeshSamples() { + + bindProgramVertexOrtho(); + rs_matrix4x4 matrix; + rsMatrixLoadTranslate(&matrix, 128, 128, 0); + rsgProgramVertexLoadModelMatrix(&matrix); + + // Fragment shader with texture + rsgBindProgramStore(gProgStoreBlendNone); + rsgBindProgramFragment(gProgFragmentTexture); + rsgBindSampler(gProgFragmentTexture, 0, gLinearClamp); + rsgBindTexture(gProgFragmentTexture, 0, gTexOpaque); + + rsgDrawMesh(gMbyNMesh); + + rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f); + rsgBindFont(gFontMono); + rsgDrawText("User gen 10 by 10 grid mesh", 10, 250); +} + +static void displayTextureSamplers() { + + bindProgramVertexOrtho(); + rs_matrix4x4 matrix; + rsMatrixLoadIdentity(&matrix); + rsgProgramVertexLoadModelMatrix(&matrix); + + // Fragment shader with texture + rsgBindProgramStore(gProgStoreBlendNone); + rsgBindProgramFragment(gProgFragmentTexture); + rsgBindTexture(gProgFragmentTexture, 0, gTexOpaque); + + // Linear clamp + rsgBindSampler(gProgFragmentTexture, 0, gLinearClamp); + float startX = 0, startY = 0; + float width = 300, height = 300; + rsgDrawQuadTexCoords(startX, startY, 0, 0, 0, + startX, startY + height, 0, 0, 1.1, + startX + width, startY + height, 0, 1.1, 1.1, + startX + width, startY, 0, 1.1, 0); + + // Linear Wrap + rsgBindSampler(gProgFragmentTexture, 0, gLinearWrap); + startX = 0; startY = 300; + width = 300; height = 300; + rsgDrawQuadTexCoords(startX, startY, 0, 0, 0, + startX, startY + height, 0, 0, 1.1, + startX + width, startY + height, 0, 1.1, 1.1, + startX + width, startY, 0, 1.1, 0); + + // Nearest + rsgBindSampler(gProgFragmentTexture, 0, gNearestClamp); + startX = 300; startY = 0; + width = 300; height = 300; + rsgDrawQuadTexCoords(startX, startY, 0, 0, 0, + startX, startY + height, 0, 0, 1.1, + startX + width, startY + height, 0, 1.1, 1.1, + startX + width, startY, 0, 1.1, 0); + + rsgBindSampler(gProgFragmentTexture, 0, gMipLinearWrap); + startX = 300; startY = 300; + width = 300; height = 300; + rsgDrawQuadTexCoords(startX, startY, 0, 0, 0, + startX, startY + height, 0, 0, 1.5, + startX + width, startY + height, 0, 1.5, 1.5, + startX + width, startY, 0, 1.5, 0); + + rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f); + rsgBindFont(gFontMono); + rsgDrawText("Filtering: linear clamp", 10, 290); + rsgDrawText("Filtering: linear wrap", 10, 590); + rsgDrawText("Filtering: nearest clamp", 310, 290); + rsgDrawText("Filtering: miplinear wrap", 310, 590); +} + +static float gTorusRotation = 0; + +static void displayCullingSamples() { + rsgBindProgramVertex(gProgVertex); + // Setup the projectioni matrix with 60 degree field of view + rs_matrix4x4 proj; + float aspect = (float)rsgGetWidth() / (float)rsgGetHeight(); + rsMatrixLoadPerspective(&proj, 30.0f, aspect, 0.1f, 100.0f); + rsgProgramVertexLoadProjectionMatrix(&proj); + + // Fragment shader with texture + rsgBindProgramStore(gProgStoreBlendNoneDepth); + rsgBindProgramFragment(gProgFragmentTexture); + rsgBindSampler(gProgFragmentTexture, 0, gLinearClamp); + rsgBindTexture(gProgFragmentTexture, 0, gTexTorus); + + // Aplly a rotation to our mesh + gTorusRotation += 50.0f * gDt; + if (gTorusRotation > 360.0f) { + gTorusRotation -= 360.0f; + } + + rs_matrix4x4 matrix; + // Position our model on the screen + rsMatrixLoadTranslate(&matrix, -2.0f, 0.0f, -10.0f); + rsMatrixRotate(&matrix, gTorusRotation, 1.0f, 0.0f, 0.0f); + rsgProgramVertexLoadModelMatrix(&matrix); + // Use front face culling + rsgBindProgramRaster(gCullFront); + rsgDrawMesh(gTorusMesh); + + rsMatrixLoadTranslate(&matrix, 2.0f, 0.0f, -10.0f); + rsMatrixRotate(&matrix, gTorusRotation, 1.0f, 0.0f, 0.0f); + rsgProgramVertexLoadModelMatrix(&matrix); + // Use back face culling + rsgBindProgramRaster(gCullBack); + rsgDrawMesh(gTorusMesh); + + rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f); + rsgBindFont(gFontMono); + rsgDrawText("Displaying mesh front/back face culling", 10, rsgGetHeight() - 10); +} + +static float gLight0Rotation = 0; +static float gLight1Rotation = 0; + +static void setupCustomShaderLights() { + float4 light0Pos = {-5.0f, 5.0f, -10.0f, 1.0f}; + float4 light1Pos = {2.0f, 5.0f, 15.0f, 1.0f}; + float4 light0DiffCol = {0.9f, 0.7f, 0.7f, 1.0f}; + float4 light0SpecCol = {0.9f, 0.6f, 0.6f, 1.0f}; + float4 light1DiffCol = {0.5f, 0.5f, 0.9f, 1.0f}; + float4 light1SpecCol = {0.5f, 0.5f, 0.9f, 1.0f}; + + gLight0Rotation += 50.0f * gDt; + if (gLight0Rotation > 360.0f) { + gLight0Rotation -= 360.0f; + } + gLight1Rotation -= 50.0f * gDt; + if (gLight1Rotation > 360.0f) { + gLight1Rotation -= 360.0f; + } + + rs_matrix4x4 l0Mat; + rsMatrixLoadRotate(&l0Mat, gLight0Rotation, 1.0f, 0.0f, 0.0f); + light0Pos = rsMatrixMultiply(&l0Mat, light0Pos); + rs_matrix4x4 l1Mat; + rsMatrixLoadRotate(&l1Mat, gLight1Rotation, 0.0f, 0.0f, 1.0f); + light1Pos = rsMatrixMultiply(&l1Mat, light1Pos); + + // Set light 0 properties + gVSConstants->light0_Posision = light0Pos; + gVSConstants->light0_Diffuse = 1.0f; + gVSConstants->light0_Specular = 0.5f; + gVSConstants->light0_CosinePower = 10.0f; + // Set light 1 properties + gVSConstants->light1_Posision = light1Pos; + gVSConstants->light1_Diffuse = 1.0f; + gVSConstants->light1_Specular = 0.7f; + gVSConstants->light1_CosinePower = 25.0f; + rsgAllocationSyncAll(rsGetAllocation(gVSConstants)); + + gVSConstants2->light_Posision[0] = light0Pos; + gVSConstants2->light_Diffuse[0] = 1.0f; + gVSConstants2->light_Specular[0] = 0.5f; + gVSConstants2->light_CosinePower[0] = 10.0f; + gVSConstants2->light_Posision[1] = light1Pos; + gVSConstants2->light_Diffuse[1] = 1.0f; + gVSConstants2->light_Specular[1] = 0.7f; + gVSConstants2->light_CosinePower[1] = 25.0f; + rsgAllocationSyncAll(rsGetAllocation(gVSConstants2)); + + // Update fragmetn shader constants + // Set light 0 colors + gFSConstants->light0_DiffuseColor = light0DiffCol; + gFSConstants->light0_SpecularColor = light0SpecCol; + // Set light 1 colors + gFSConstants->light1_DiffuseColor = light1DiffCol; + gFSConstants->light1_SpecularColor = light1SpecCol; + rsgAllocationSyncAll(rsGetAllocation(gFSConstants)); + + gFSConstants2->light_DiffuseColor[0] = light0DiffCol; + gFSConstants2->light_SpecularColor[0] = light0SpecCol; + // Set light 1 colors + gFSConstants2->light_DiffuseColor[1] = light1DiffCol; + gFSConstants2->light_SpecularColor[1] = light1SpecCol; + rsgAllocationSyncAll(rsGetAllocation(gFSConstants2)); +} + +static void displayCustomShaderSamples() { + + // Update vertex shader constants + // Load model matrix + // Aplly a rotation to our mesh + gTorusRotation += 50.0f * gDt; + if (gTorusRotation > 360.0f) { + gTorusRotation -= 360.0f; + } + + // Position our model on the screen + rsMatrixLoadTranslate(&gVSConstants->model, 0.0f, 0.0f, -10.0f); + rsMatrixRotate(&gVSConstants->model, gTorusRotation, 1.0f, 0.0f, 0.0f); + rsMatrixRotate(&gVSConstants->model, gTorusRotation, 0.0f, 0.0f, 1.0f); + // Setup the projectioni matrix + float aspect = (float)rsgGetWidth() / (float)rsgGetHeight(); + rsMatrixLoadPerspective(&gVSConstants->proj, 30.0f, aspect, 0.1f, 100.0f); + setupCustomShaderLights(); + + rsgBindProgramVertex(gProgVertexCustom); + + // Fragment shader with texture + rsgBindProgramStore(gProgStoreBlendNoneDepth); + rsgBindProgramFragment(gProgFragmentCustom); + rsgBindSampler(gProgFragmentCustom, 0, gLinearClamp); + rsgBindTexture(gProgFragmentCustom, 0, gTexTorus); + + // Use back face culling + rsgBindProgramRaster(gCullBack); + rsgDrawMesh(gTorusMesh); + + rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f); + rsgBindFont(gFontMono); + rsgDrawText("Custom shader sample", 10, rsgGetHeight() - 10); +} + +static void displayCustomShaderSamples2() { + + // Update vertex shader constants + // Load model matrix + // Aplly a rotation to our mesh + gTorusRotation += 50.0f * gDt; + if (gTorusRotation > 360.0f) { + gTorusRotation -= 360.0f; + } + + // Position our model on the screen + rsMatrixLoadTranslate(&gVSConstants2->model[1], 0.0f, 0.0f, -10.0f); + rsMatrixLoadIdentity(&gVSConstants2->model[0]); + rsMatrixRotate(&gVSConstants2->model[0], gTorusRotation, 1.0f, 0.0f, 0.0f); + rsMatrixRotate(&gVSConstants2->model[0], gTorusRotation, 0.0f, 0.0f, 1.0f); + // Setup the projectioni matrix + float aspect = (float)rsgGetWidth() / (float)rsgGetHeight(); + rsMatrixLoadPerspective(&gVSConstants2->proj, 30.0f, aspect, 0.1f, 100.0f); + setupCustomShaderLights(); + + rsgBindProgramVertex(gProgVertexCustom2); + + // Fragment shader with texture + rsgBindProgramStore(gProgStoreBlendNoneDepth); + rsgBindProgramFragment(gProgFragmentCustom2); + rsgBindSampler(gProgFragmentCustom2, 0, gLinearClamp); + rsgBindTexture(gProgFragmentCustom2, 0, gTexTorus); + + // Use back face culling + rsgBindProgramRaster(gCullBack); + rsgDrawMesh(gTorusMesh); + + rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f); + rsgBindFont(gFontMono); + rsgDrawText("Custom shader sample with array uniforms", 10, rsgGetHeight() - 10); +} + +static void displayCubemapShaderSample() { + // Update vertex shader constants + // Load model matrix + // Aplly a rotation to our mesh + gTorusRotation += 50.0f * gDt; + if (gTorusRotation > 360.0f) { + gTorusRotation -= 360.0f; + } + + // Position our model on the screen + // Position our model on the screen + rsMatrixLoadTranslate(&gVSConstants->model, 0.0f, 0.0f, -10.0f); + rsMatrixRotate(&gVSConstants->model, gTorusRotation, 1.0f, 0.0f, 0.0f); + rsMatrixRotate(&gVSConstants->model, gTorusRotation, 0.0f, 0.0f, 1.0f); + // Setup the projectioni matrix + float aspect = (float)rsgGetWidth() / (float)rsgGetHeight(); + rsMatrixLoadPerspective(&gVSConstants->proj, 30.0f, aspect, 0.1f, 100.0f); + rsgAllocationSyncAll(rsGetAllocation(gFSConstants)); + + rsgBindProgramVertex(gProgVertexCube); + + // Fragment shader with texture + rsgBindProgramStore(gProgStoreBlendNoneDepth); + rsgBindProgramFragment(gProgFragmentCube); + rsgBindSampler(gProgFragmentCube, 0, gLinearClamp); + rsgBindTexture(gProgFragmentCube, 0, gTexCube); + + // Use back face culling + rsgBindProgramRaster(gCullBack); + rsgDrawMesh(gTorusMesh); + + rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f); + rsgBindFont(gFontMono); + rsgDrawText("Cubemap shader sample", 10, rsgGetHeight() - 10); +} + +static void displayMultitextureSample() { + bindProgramVertexOrtho(); + rs_matrix4x4 matrix; + rsMatrixLoadIdentity(&matrix); + rsgProgramVertexLoadModelMatrix(&matrix); + + // Fragment shader with texture + rsgBindProgramStore(gProgStoreBlendNone); + rsgBindProgramFragment(gProgFragmentMultitex); + rsgBindSampler(gProgFragmentMultitex, 0, gLinearClamp); + rsgBindSampler(gProgFragmentMultitex, 1, gLinearWrap); + rsgBindSampler(gProgFragmentMultitex, 2, gLinearClamp); + rsgBindTexture(gProgFragmentMultitex, 0, gTexChecker); + rsgBindTexture(gProgFragmentMultitex, 1, gTexTorus); + rsgBindTexture(gProgFragmentMultitex, 2, gTexTransparent); + + float startX = 0, startY = 0; + float width = 256, height = 256; + rsgDrawQuadTexCoords(startX, startY, 0, 0, 0, + startX, startY + height, 0, 0, 1, + startX + width, startY + height, 0, 1, 1, + startX + width, startY, 0, 1, 0); + + rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f); + rsgBindFont(gFontMono); + rsgDrawText("Custom shader with multitexturing", 10, 280); +} + +static float gAnisoTime = 0.0f; +static uint anisoMode = 0; +static void displayAnisoSample() { + + gAnisoTime += gDt; + + rsgBindProgramVertex(gProgVertex); + float aspect = (float)rsgGetWidth() / (float)rsgGetHeight(); + rs_matrix4x4 proj; + rsMatrixLoadPerspective(&proj, 30.0f, aspect, 0.1f, 100.0f); + rsgProgramVertexLoadProjectionMatrix(&proj); + + rs_matrix4x4 matrix; + // Fragment shader with texture + rsgBindProgramStore(gProgStoreBlendNone); + rsgBindProgramFragment(gProgFragmentTexture); + rsMatrixLoadTranslate(&matrix, 0.0f, 0.0f, -10.0f); + rsMatrixRotate(&matrix, -80, 1.0f, 0.0f, 0.0f); + rsgProgramVertexLoadModelMatrix(&matrix); + + rsgBindProgramRaster(gCullNone); + + rsgBindTexture(gProgFragmentTexture, 0, gTexChecker); + + if (gAnisoTime >= 5.0f) { + gAnisoTime = 0.0f; + anisoMode ++; + anisoMode = anisoMode % 3; + } + + if (anisoMode == 0) { + rsgBindSampler(gProgFragmentTexture, 0, gMipLinearAniso8); + } else if (anisoMode == 1) { + rsgBindSampler(gProgFragmentTexture, 0, gMipLinearAniso15); + } else { + rsgBindSampler(gProgFragmentTexture, 0, gMipLinearWrap); + } + + float startX = -15; + float startY = -15; + float width = 30; + float height = 30; + rsgDrawQuadTexCoords(startX, startY, 0, 0, 0, + startX, startY + height, 0, 0, 10, + startX + width, startY + height, 0, 10, 10, + startX + width, startY, 0, 10, 0); + + rsgBindProgramRaster(gCullBack); + + rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f); + rsgBindFont(gFontMono); + if (anisoMode == 0) { + rsgDrawText("Anisotropic filtering 8", 10, 40); + } else if (anisoMode == 1) { + rsgDrawText("Anisotropic filtering 15", 10, 40); + } else { + rsgDrawText("Miplinear filtering", 10, 40); + } +} + +int root(void) { + + gDt = rsGetDt(); + + rsgClearColor(0.2f, 0.2f, 0.2f, 0.0f); + rsgClearDepth(1.0f); + + switch (gDisplayMode) { + case 0: + displayFontSamples(); + break; + case 1: + displayShaderSamples(); + break; + case 2: + displayBlendingSamples(); + break; + case 3: + displayMeshSamples(); + break; + case 4: + displayTextureSamplers(); + break; + case 5: + displayCullingSamples(); + break; + case 6: + displayCustomShaderSamples(); + break; + case 7: + displayMultitextureSample(); + break; + case 8: + displayAnisoSample(); + break; + case 9: + displayCustomShaderSamples2(); + break; + case 10: + displayCubemapShaderSample(); + break; + } + + return 10; +} diff --git a/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/shader_def.rsh b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/shader_def.rsh new file mode 100644 index 0000000..08cf361 --- /dev/null +++ b/tests/RenderScriptTests/MiscSamples/src/com/example/android/rs/miscsamples/shader_def.rsh @@ -0,0 +1,83 @@ +// Copyright (C) 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. + +#pragma version(1) + +#pragma rs java_package_name(com.example.android.rs.miscsamples) + +typedef struct VertexShaderConstants_s { + rs_matrix4x4 model; + rs_matrix4x4 proj; + float4 light0_Posision; + float light0_Diffuse; + float light0_Specular; + float light0_CosinePower; + + float4 light1_Posision; + float light1_Diffuse; + float light1_Specular; + float light1_CosinePower; +} VertexShaderConstants; + +typedef struct VertexShaderConstants2_s { + rs_matrix4x4 model[2]; + rs_matrix4x4 proj; + float4 light_Posision[2]; + float light_Diffuse[2]; + float light_Specular[2]; + float light_CosinePower[2]; +} VertexShaderConstants2; + +typedef struct VertexShaderConstants3_s { + rs_matrix4x4 model; + rs_matrix4x4 proj; + float time; +} VertexShaderConstants3; + + +typedef struct FragentShaderConstants_s { + float4 light0_DiffuseColor; + float4 light0_SpecularColor; + + float4 light1_DiffuseColor; + float4 light1_SpecularColor; +} FragentShaderConstants; + +typedef struct FragentShaderConstants2_s { + float4 light_DiffuseColor[2]; + float4 light_SpecularColor[2]; +} FragentShaderConstants2; + +typedef struct FragentShaderConstants3_s { + float4 light0_DiffuseColor; + float4 light0_SpecularColor; + float4 light0_Posision; + float light0_Diffuse; + float light0_Specular; + float light0_CosinePower; + + float4 light1_DiffuseColor; + float4 light1_SpecularColor; + float4 light1_Posision; + float light1_Diffuse; + float light1_Specular; + float light1_CosinePower; +} FragentShaderConstants3; + +typedef struct VertexShaderInputs_s { + float4 position; + float3 normal; + float2 texture0; +} VertexShaderInputs; + diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java index 9321cb3..d0f3e62 100644 --- a/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java @@ -72,6 +72,7 @@ public class RSTestCore { unitTests.add(new UT_clamp(this, mRes, mCtx)); unitTests.add(new UT_clamp_relaxed(this, mRes, mCtx)); unitTests.add(new UT_convert(this, mRes, mCtx)); + unitTests.add(new UT_convert_relaxed(this, mRes, mCtx)); unitTests.add(new UT_rsdebug(this, mRes, mCtx)); unitTests.add(new UT_rstime(this, mRes, mCtx)); unitTests.add(new UT_rstypes(this, mRes, mCtx)); diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_convert_relaxed.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_convert_relaxed.java new file mode 100644 index 0000000..728806c --- /dev/null +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_convert_relaxed.java @@ -0,0 +1,41 @@ +/* + * 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.rs.test; + +import android.content.Context; +import android.content.res.Resources; +import android.renderscript.*; + +public class UT_convert_relaxed extends UnitTest { + private Resources mRes; + + protected UT_convert_relaxed(RSTestCore rstc, Resources res, Context ctx) { + super(rstc, "Convert (Relaxed)", ctx); + mRes = res; + } + + public void run() { + RenderScript pRS = RenderScript.create(mCtx); + ScriptC_convert_relaxed s = + new ScriptC_convert_relaxed(pRS, mRes, R.raw.convert_relaxed); + pRS.setMessageHandler(mRsMessage); + s.invoke_convert_test(); + pRS.finish(); + waitForMessage(); + pRS.destroy(); + } +} diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/convert_relaxed.rs b/tests/RenderScriptTests/tests/src/com/android/rs/test/convert_relaxed.rs new file mode 100644 index 0000000..81abb9b --- /dev/null +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/convert_relaxed.rs @@ -0,0 +1,2 @@ +#include "convert.rs" +#pragma rs_fp_relaxed |