am bcbcaa7e: Wallpapers, animations, pending intent.

Merge commit 'bcbcaa7edd32ba67c6290d79f7e7821c4b5b39ac' into eclair-plus-aosp

* commit 'bcbcaa7edd32ba67c6290d79f7e7821c4b5b39ac':
  Wallpapers, animations, pending intent.
This commit is contained in:
Dianne Hackborn
2009-09-10 13:06:08 -07:00
committed by Android Git Automerger
32 changed files with 619 additions and 201 deletions

View File

@@ -2649,10 +2649,8 @@ public class Activity extends ContextThemeWrapper
}
@Override
protected void onApplyThemeResource(Resources.Theme theme,
int resid,
boolean first)
{
protected void onApplyThemeResource(Resources.Theme theme, int resid,
boolean first) {
if (mParent == null) {
super.onApplyThemeResource(theme, resid, first);
} else {
@@ -2722,6 +2720,66 @@ public class Activity extends ContextThemeWrapper
}
}
/**
* Like {@link #startActivityForResult(Intent, int)}, but allowing you
* to use a PendingIntent to describe the activity to be started. Note
* that the given PendingIntent <em>must</em> have been created with
* {@link PendingIntent#getActivity PendingIntent.getActivity}; all other
* types will result in an IllegalArgumentException being thrown.
*
* @param intent The PendingIntent to launch.
* @param requestCode If >= 0, this code will be returned in
* onActivityResult() when the activity exits.
* @param fillInIntent If non-null, this will be provided as the
* intent parameter to {@link PendingIntent#send(Context, int, Intent)
* PendingIntent.send(Context, int, Intent)}.
* @param flagsMask Intent flags in the original PendingIntent that you
* would like to change.
* @param flagsValues Desired values for any bits set in
* <var>flagsMask</var>
*/
public void startActivityForResult(PendingIntent intent, int requestCode,
Intent fillInIntent, int flagsMask, int flagsValues)
throws PendingIntent.CanceledException {
if (mParent == null) {
startActivityForResultInner(intent, requestCode, fillInIntent,
flagsMask, flagsValues, this);
} else {
mParent.startActivityFromChild(this, intent, requestCode,
fillInIntent, flagsMask, flagsValues);
}
}
private void startActivityForResultInner(PendingIntent intent, int requestCode,
Intent fillInIntent, int flagsMask, int flagsValues, Activity activity)
throws PendingIntent.CanceledException {
try {
String resolvedType = null;
if (fillInIntent != null) {
resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
}
int result = ActivityManagerNative.getDefault()
.startActivityPendingIntent(mMainThread.getApplicationThread(), intent,
fillInIntent, resolvedType, mToken, activity.mEmbeddedID,
requestCode, flagsMask, flagsValues);
if (result == IActivityManager.START_CANCELED) {
throw new PendingIntent.CanceledException();
}
Instrumentation.checkStartActivityResult(result, null);
} catch (RemoteException e) {
}
if (requestCode >= 0) {
// If this start is requesting a result, we can avoid making
// the activity visible until the result is received. Setting
// this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
// activity hidden during this time, to avoid flickering.
// This can only be done when a result is requested because
// that guarantees we will get information back when the
// activity is finished, no matter what happens to it.
mStartedActivity = true;
}
}
/**
* Launch a new activity. You will not receive any information about when
* the activity exits. This implementation overrides the base version,
@@ -2745,6 +2803,27 @@ public class Activity extends ContextThemeWrapper
startActivityForResult(intent, -1);
}
/**
* Like {@link #startActivity(Intent)}, but taking a PendingIntent
* to start; see
* {@link #startActivityForResult(PendingIntent, int, Intent, int, int)}
* for more information.
*
* @param intent The PendingIntent to launch.
* @param fillInIntent If non-null, this will be provided as the
* intent parameter to {@link PendingIntent#send(Context, int, Intent)
* PendingIntent.send(Context, int, Intent)}.
* @param flagsMask Intent flags in the original PendingIntent that you
* would like to change.
* @param flagsValues Desired values for any bits set in
* <var>flagsMask</var>
*/
public void startActivity(PendingIntent intent,
Intent fillInIntent, int flagsMask, int flagsValues)
throws PendingIntent.CanceledException {
startActivityForResult(intent, -1, fillInIntent, flagsMask, flagsValues);
}
/**
* A special variation to launch an activity only if a new activity
* instance is needed to handle the given Intent. In other words, this is
@@ -2865,6 +2944,19 @@ public class Activity extends ContextThemeWrapper
}
}
/**
* Like {@link #startActivityFromChild(Activity, Intent, int)}, but
* taking a PendingIntent; see
* {@link #startActivityForResult(PendingIntent, int, Intent, int, int)}
* for more information.
*/
public void startActivityFromChild(Activity child, PendingIntent intent,
int requestCode, Intent fillInIntent, int flagsMask, int flagsValues)
throws PendingIntent.CanceledException {
startActivityForResultInner(intent, requestCode, fillInIntent,
flagsMask, flagsValues, child);
}
/**
* Call this to set the result that your activity will return to its
* caller.

View File

@@ -144,6 +144,30 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
reply.writeInt(result);
return true;
}
case START_ACTIVITY_PENDING_INTENT_TRANSACTION:
{
data.enforceInterface(IActivityManager.descriptor);
IBinder b = data.readStrongBinder();
IApplicationThread app = ApplicationThreadNative.asInterface(b);
PendingIntent intent = PendingIntent.CREATOR.createFromParcel(data);
Intent fillInIntent = null;
if (data.readInt() != 0) {
fillInIntent = Intent.CREATOR.createFromParcel(data);
}
String resolvedType = data.readString();
IBinder resultTo = data.readStrongBinder();
String resultWho = data.readString();
int requestCode = data.readInt();
int flagsMask = data.readInt();
int flagsValues = data.readInt();
int result = startActivityPendingIntent(app, intent,
fillInIntent, resolvedType, resultTo, resultWho,
requestCode, flagsMask, flagsValues);
reply.writeNoException();
reply.writeInt(result);
return true;
}
case START_NEXT_MATCHING_ACTIVITY_TRANSACTION:
{
@@ -1179,6 +1203,34 @@ class ActivityManagerProxy implements IActivityManager
data.recycle();
return result;
}
public int startActivityPendingIntent(IApplicationThread caller,
PendingIntent intent, Intent fillInIntent, String resolvedType,
IBinder resultTo, String resultWho, int requestCode,
int flagsMask, int flagsValues) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeStrongBinder(caller != null ? caller.asBinder() : null);
intent.writeToParcel(data, 0);
if (fillInIntent != null) {
data.writeInt(1);
fillInIntent.writeToParcel(data, 0);
} else {
data.writeInt(0);
}
data.writeString(resolvedType);
data.writeStrongBinder(resultTo);
data.writeString(resultWho);
data.writeInt(requestCode);
data.writeInt(flagsMask);
data.writeInt(flagsValues);
mRemote.transact(START_ACTIVITY_PENDING_INTENT_TRANSACTION, data, reply, 0);
reply.readException();
int result = reply.readInt();
reply.recycle();
data.recycle();
return result;
}
public boolean startNextMatchingActivity(IBinder callingActivity,
Intent intent) throws RemoteException {
Parcel data = Parcel.obtain();

View File

@@ -77,10 +77,16 @@ public interface IActivityManager extends IInterface {
public static final int START_CLASS_NOT_FOUND = -2;
public static final int START_FORWARD_AND_REQUEST_CONFLICT = -3;
public static final int START_PERMISSION_DENIED = -4;
public static final int START_NOT_ACTIVITY = -5;
public static final int START_CANCELED = -6;
public int startActivity(IApplicationThread caller,
Intent intent, String resolvedType, Uri[] grantedUriPermissions,
int grantedMode, IBinder resultTo, String resultWho, int requestCode,
boolean onlyIfNeeded, boolean debug) throws RemoteException;
public int startActivityPendingIntent(IApplicationThread caller,
PendingIntent intent, Intent fillInIntent, String resolvedType,
IBinder resultTo, String resultWho, int requestCode,
int flagsMask, int flagsValues) throws RemoteException;
public boolean startNextMatchingActivity(IBinder callingActivity,
Intent intent) throws RemoteException;
public boolean finishActivity(IBinder token, int code, Intent data)
@@ -436,4 +442,5 @@ public interface IActivityManager extends IInterface {
int CLOSE_SYSTEM_DIALOGS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+96;
int GET_PROCESS_MEMORY_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+97;
int KILL_APPLICATION_PROCESS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+98;
int START_ACTIVITY_PENDING_INTENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+99;
}

View File

@@ -1468,7 +1468,7 @@ public class Instrumentation {
mWatcher = watcher;
}
/*package*/ static void checkStartActivityResult(int res, Intent intent) {
/*package*/ static void checkStartActivityResult(int res, Object intent) {
if (res >= IActivityManager.START_SUCCESS) {
return;
}
@@ -1476,10 +1476,10 @@ public class Instrumentation {
switch (res) {
case IActivityManager.START_INTENT_NOT_RESOLVED:
case IActivityManager.START_CLASS_NOT_FOUND:
if (intent.getComponent() != null)
if (intent instanceof Intent && ((Intent)intent).getComponent() != null)
throw new ActivityNotFoundException(
"Unable to find explicit activity class "
+ intent.getComponent().toShortString()
+ ((Intent)intent).getComponent().toShortString()
+ "; have you declared this activity in your AndroidManifest.xml?");
throw new ActivityNotFoundException(
"No Activity found to handle " + intent);
@@ -1489,6 +1489,9 @@ public class Instrumentation {
case IActivityManager.START_FORWARD_AND_REQUEST_CONFLICT:
throw new AndroidRuntimeException(
"FORWARD_RESULT_FLAG used while also requesting a result");
case IActivityManager.START_NOT_ACTIVITY:
throw new IllegalArgumentException(
"PendingIntent is not an activity");
default:
throw new AndroidRuntimeException("Unknown error code "
+ res + " when starting " + intent);

View File

@@ -519,7 +519,8 @@ public final class PendingIntent implements Parcelable {
mTarget = IIntentSender.Stub.asInterface(target);
}
/*package*/ IIntentSender getTarget() {
/** @hide */
public IIntentSender getTarget() {
return mTarget;
}
}

View File

@@ -22,7 +22,10 @@ import com.android.internal.view.BaseSurfaceHolder;
import android.app.Service;
import android.app.WallpaperManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Rect;
import android.os.IBinder;
import android.os.Message;
@@ -88,6 +91,8 @@ public abstract class WallpaperService extends Service {
boolean mInitializing = true;
boolean mVisible;
boolean mScreenOn = true;
boolean mReportedVisible;
boolean mDestroyed;
// Current window state.
@@ -117,6 +122,19 @@ public abstract class WallpaperService extends Service {
float mPendingYOffset;
MotionEvent mPendingMove;
final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
mScreenOn = true;
reportVisibility();
} else if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
mScreenOn = false;
reportVisibility();
}
}
};
final BaseSurfaceHolder mSurfaceHolder = new BaseSurfaceHolder() {
@Override
@@ -239,7 +257,7 @@ public abstract class WallpaperService extends Service {
* {@link #onVisibilityChanged(boolean)}.
*/
public boolean isVisible() {
return mVisible;
return mReportedVisible;
}
/**
@@ -489,6 +507,11 @@ public abstract class WallpaperService extends Service {
mSession = ViewRoot.getWindowSession(getMainLooper());
mWindow.setSession(mSession);
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(mReceiver, filter);
if (DEBUG) Log.v(TAG, "onCreate(): " + this);
onCreate(mSurfaceHolder);
@@ -505,11 +528,19 @@ public abstract class WallpaperService extends Service {
}
void doVisibilityChanged(boolean visible) {
mVisible = visible;
reportVisibility();
}
void reportVisibility() {
if (!mDestroyed) {
mVisible = visible;
if (DEBUG) Log.v(TAG, "onVisibilityChanged(" + visible
+ "): " + this);
onVisibilityChanged(visible);
boolean visible = mVisible && mScreenOn;
if (mReportedVisible != visible) {
mReportedVisible = visible;
if (DEBUG) Log.v(TAG, "onVisibilityChanged(" + visible
+ "): " + this);
onVisibilityChanged(visible);
}
}
}
@@ -562,6 +593,8 @@ public abstract class WallpaperService extends Service {
if (DEBUG) Log.v(TAG, "onDestroy(): " + this);
onDestroy();
unregisterReceiver(mReceiver);
if (mCreated) {
try {
mSession.remove(mWindow);