1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
package com.adobe.phonegap.push;
import android.app.Activity;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.support.v4.app.RemoteInput;
public class PushHandlerActivity extends Activity implements PushConstants {
private static String LOG_TAG = "PushPlugin_PushHandlerActivity";
/*
* this activity will be started if the user touches a notification that we own.
* We send it's data off to the push plugin for processing.
* If needed, we boot up the main activity to kickstart the application.
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
public void onCreate(Bundle savedInstanceState) {
GCMIntentService gcm = new GCMIntentService();
Intent intent = getIntent();
int notId = intent.getExtras().getInt(NOT_ID, 0);
Log.d(LOG_TAG, "not id = " + notId);
gcm.setNotification(notId, "");
super.onCreate(savedInstanceState);
Log.v(LOG_TAG, "onCreate");
String callback = getIntent().getExtras().getString("callback");
Log.d(LOG_TAG, "callback = " + callback);
boolean foreground = getIntent().getExtras().getBoolean("foreground", true);
boolean startOnBackground = getIntent().getExtras().getBoolean(START_IN_BACKGROUND, false);
if(!startOnBackground){
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(GCMIntentService.getAppName(this), notId);
}
boolean isPushPluginActive = PushPlugin.isActive();
boolean inline = processPushBundle(isPushPluginActive, intent);
if(inline && android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.N){
foreground = true;
}
Log.d(LOG_TAG, "bringToForeground = " + foreground);
finish();
Log.d(LOG_TAG, "isPushPluginActive = " + isPushPluginActive);
if (!isPushPluginActive && foreground && inline) {
Log.d(LOG_TAG, "forceMainActivityReload");
forceMainActivityReload(false);
} else if(startOnBackground) {
Log.d(LOG_TAG, "startOnBackgroundTrue");
forceMainActivityReload(true);
} else {
Log.d(LOG_TAG, "don't want main activity");
}
}
/**
* Takes the pushBundle extras from the intent,
* and sends it through to the PushPlugin for processing.
*/
private boolean processPushBundle(boolean isPushPluginActive, Intent intent) {
Bundle extras = getIntent().getExtras();
Bundle remoteInput = null;
if (extras != null) {
Bundle originalExtras = extras.getBundle(PUSH_BUNDLE);
originalExtras.putBoolean(FOREGROUND, false);
originalExtras.putBoolean(COLDSTART, !isPushPluginActive);
originalExtras.putString(ACTION_CALLBACK, extras.getString(CALLBACK));
remoteInput = RemoteInput.getResultsFromIntent(intent);
if (remoteInput != null) {
String inputString = remoteInput.getCharSequence(INLINE_REPLY).toString();
Log.d(LOG_TAG, "response: " + inputString);
originalExtras.putString(INLINE_REPLY, inputString);
}
PushPlugin.sendExtras(originalExtras);
}
return remoteInput == null;
}
/**
* Forces the main activity to re-launch if it's unloaded.
*/
private void forceMainActivityReload(boolean startOnBackground) {
PackageManager pm = getPackageManager();
Intent launchIntent = pm.getLaunchIntentForPackage(getApplicationContext().getPackageName());
Bundle extras = getIntent().getExtras();
if (extras != null) {
Bundle originalExtras = extras.getBundle(PUSH_BUNDLE);
if (originalExtras != null) {
launchIntent.putExtras(originalExtras);
}
launchIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
launchIntent.addFlags(Intent.FLAG_FROM_BACKGROUND);
launchIntent.putExtra(START_IN_BACKGROUND, startOnBackground);
}
startActivity(launchIntent);
}
@Override
protected void onResume() {
super.onResume();
final NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancelAll();
}
}
|