CustomTiles: add a custom long press PendingIntent

Ref: CYNGNOS-1602
Change-Id: Id0cca88fabb091dcf0fbad2ae24416fa1c0af83e
Signed-off-by: Roman Birg <roman@cyngn.com>
This commit is contained in:
Roman Birg 2016-01-14 09:44:13 -08:00
parent 5400b2f30e
commit 8d4920022f
4 changed files with 89 additions and 0 deletions

View File

@ -53,6 +53,15 @@ public class CustomTile implements Parcelable {
**/ **/
public PendingIntent onClick; public PendingIntent onClick;
/**
* An optional intent to execute when the custom tile entry is long clicked. If
* this is an activity, it must include the
* {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK} flag, which requires
* that you take care of task management. Activities will also automatically trigger
* the host panel to automatically collapse after executing the pending intent.
**/
public PendingIntent onLongClick;
/** /**
* An optional settings intent to execute when the custom tile's detail is shown * An optional settings intent to execute when the custom tile's detail is shown
* If this is an activity, it must include the * If this is an activity, it must include the
@ -162,6 +171,12 @@ public class CustomTile implements Parcelable {
this.sensitiveData = (parcel.readInt() == 1); this.sensitiveData = (parcel.readInt() == 1);
} }
if (parcelableVersion >= Build.CM_VERSION_CODES.DRAGON_FRUIT) {
if (parcel.readInt() != 0) {
this.onLongClick = PendingIntent.CREATOR.createFromParcel(parcel);
}
}
parcel.setDataPosition(startPosition + parcelableSize); parcel.setDataPosition(startPosition + parcelableSize);
} }
@ -196,6 +211,9 @@ public class CustomTile implements Parcelable {
if (onClick != null) { if (onClick != null) {
b.append("onClick=" + onClick.toString() + NEW_LINE); b.append("onClick=" + onClick.toString() + NEW_LINE);
} }
if (onLongClick != null) {
b.append("onLongClick=" + onLongClick.toString() + NEW_LINE);
}
if (onSettingsClick != null) { if (onSettingsClick != null) {
b.append("onSettingsClick=" + onSettingsClick.toString() + NEW_LINE); b.append("onSettingsClick=" + onSettingsClick.toString() + NEW_LINE);
} }
@ -229,6 +247,7 @@ public class CustomTile implements Parcelable {
public void cloneInto(CustomTile that) { public void cloneInto(CustomTile that) {
that.resourcesPackageName = this.resourcesPackageName; that.resourcesPackageName = this.resourcesPackageName;
that.onClick = this.onClick; that.onClick = this.onClick;
that.onLongClick = this.onLongClick;
that.onSettingsClick = this.onSettingsClick; that.onSettingsClick = this.onSettingsClick;
that.onClickUri = this.onClickUri; that.onClickUri = this.onClickUri;
that.label = this.label; that.label = this.label;
@ -314,6 +333,14 @@ public class CustomTile implements Parcelable {
} }
out.writeInt(sensitiveData ? 1 : 0); out.writeInt(sensitiveData ? 1 : 0);
// ==== DRAGONFRUIT ====
if (onLongClick != null) {
out.writeInt(1);
onLongClick.writeToParcel(out, 0);
} else {
out.writeInt(0);
}
// Go back and write size // Go back and write size
int parcelableSize = out.dataPosition() - startPosition; int parcelableSize = out.dataPosition() - startPosition;
out.setDataPosition(sizePosition); out.setDataPosition(sizePosition);
@ -907,6 +934,7 @@ public class CustomTile implements Parcelable {
*/ */
public static class Builder { public static class Builder {
private PendingIntent mOnClick; private PendingIntent mOnClick;
private PendingIntent mOnLongClick;
private Intent mOnSettingsClick; private Intent mOnSettingsClick;
private Uri mOnClickUri; private Uri mOnClickUri;
private String mLabel; private String mLabel;
@ -976,6 +1004,17 @@ public class CustomTile implements Parcelable {
return this; return this;
} }
/**
* Set a {@link android.app.PendingIntent} to be fired on custom tile long press.
* Note: if this is an activity, the host panel will automatically collapse.
* @param intent
* @return {@link cyanogenmod.app.CustomTile.Builder}
*/
public Builder setOnLongClickIntent(PendingIntent intent) {
mOnLongClick = intent;
return this;
}
/** /**
* Set a settings {@link android.content.Intent} to be fired on custom * Set a settings {@link android.content.Intent} to be fired on custom
* tile detail pane click * tile detail pane click
@ -1080,6 +1119,7 @@ public class CustomTile implements Parcelable {
CustomTile tile = new CustomTile(); CustomTile tile = new CustomTile();
tile.resourcesPackageName = mContext.getPackageName(); tile.resourcesPackageName = mContext.getPackageName();
tile.onClick = mOnClick; tile.onClick = mOnClick;
tile.onLongClick = mOnLongClick;
tile.onSettingsClick = mOnSettingsClick; tile.onSettingsClick = mOnSettingsClick;
tile.onClickUri = mOnClickUri; tile.onClickUri = mOnClickUri;
tile.label = mLabel; tile.label = mLabel;

View File

@ -148,6 +148,21 @@ public class CMStatusBarTest extends TestActivity {
} }
}, },
new Test("test publish tile with long press") {
public void run() {
CustomTile customTile = new CustomTile.Builder(CMStatusBarTest.this)
.setLabel("Test Long press From SDK")
.setIcon(R.drawable.ic_launcher)
.setOnLongClickIntent(PendingIntent.getActivity(CMStatusBarTest.this, 0,
new Intent(CMStatusBarTest.this,DummySettings.class)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), 0))
.setContentDescription("Content description")
.build();
CMStatusBarManager.getInstance(CMStatusBarTest.this)
.publishTile(CUSTOM_TILE_SETTINGS_ID, customTile);
}
},
new Test("test publish tile with delete intent") { new Test("test publish tile with delete intent") {
public void run() { public void run() {
Intent intent = new Intent(CMStatusBarTest.this, DummySettings.class); Intent intent = new Intent(CMStatusBarTest.this, DummySettings.class);

View File

@ -57,6 +57,17 @@ public class CustomTileBuilderTest extends AndroidTestCase {
assertEquals(pendingIntent, customTile.onClick); assertEquals(pendingIntent, customTile.onClick);
} }
@SmallTest
public void testCustomTileBuilderOnLongClickIntent() {
Intent intent = new Intent(Intent.ACTION_DIAL);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
CustomTile customTile = new CustomTile.Builder(mContext)
.setOnLongClickIntent(pendingIntent)
.build();
assertNotNull(customTile.onLongClick);
assertEquals(pendingIntent, customTile.onLongClick);
}
@SmallTest @SmallTest
public void testCustomTileBuilderOnSettingsClickIntent() { public void testCustomTileBuilderOnSettingsClickIntent() {
Intent intent = new Intent(mContext, DummySettings.class); Intent intent = new Intent(mContext, DummySettings.class);

View File

@ -64,6 +64,29 @@ public class CustomTileTest extends AndroidTestCase {
fromParcel.onClick.getIntent().toString()); fromParcel.onClick.getIntent().toString());
} }
@SmallTest
public void testCustomTileOnLongiClickIntentUnravelFromParcel() {
Intent intent = new Intent(Intent.ACTION_DIAL);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
CustomTile expectedCustomTile = new CustomTile.Builder(mContext)
.setOnLongClickIntent(pendingIntent)
.build();
// Write to parcel
Parcel parcel = Parcel.obtain();
expectedCustomTile.writeToParcel(parcel, 0);
// Rewind
parcel.setDataPosition(0);
// Verify data when unraveling
CustomTile fromParcel = CustomTile.CREATOR.createFromParcel(parcel);
assertNotNull(fromParcel.onLongClick);
assertEquals(expectedCustomTile.onLongClick.getIntent().toString(),
fromParcel.onLongClick.getIntent().toString());
}
@SmallTest @SmallTest
public void testCustomTileOnSettingsClickIntentUnravelFromParcel() { public void testCustomTileOnSettingsClickIntentUnravelFromParcel() {
Intent intent = new Intent(mContext, DummySettings.class); Intent intent = new Intent(mContext, DummySettings.class);