Skip to content

Commit 991c9a3

Browse files
committed
Enable profile anyway after certain timeout
Fix: 29214877 Change-Id: Ia6c102ce05dfdf2e79748697f6fc58d4298571db
1 parent 6cbfea9 commit 991c9a3

File tree

4 files changed

+50
-7
lines changed

4 files changed

+50
-7
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@
103103
<intent-filter>
104104
<action android:name="com.google.android.work.action.FIRST_ACCOUNT_READY"/>
105105
</intent-filter>
106+
<intent-filter>
107+
<action android:name="com.afwsamples.testdpc.FIRST_ACCOUNT_READY_TIMEOUT"/>
108+
</intent-filter>
106109
</receiver>
107110

108111
<provider

app/src/main/java/com/afwsamples/testdpc/EnableProfileActivity.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,21 @@ public class EnableProfileActivity extends Activity implements NavigationBar.Nav
5959
public static final String EXTRA_ENABLE_PROFILE_NOW = "enable_profile_now";
6060
private static final IntentFilter sIntentFilter =
6161
new IntentFilter(FIRST_ACCOUNT_READY_PROCESSED_ACTION);
62+
private static final long WAIT_FOR_FIRST_ACCOUNT_READY_TIMEOUT = 60 * 1000;
6263

6364
@Override
6465
protected void onCreate(Bundle savedInstanceState) {
6566
super.onCreate(savedInstanceState);
6667
mEnableProfileNow = getIntent().getBooleanExtra(EXTRA_ENABLE_PROFILE_NOW, false);
67-
if (savedInstanceState == null && mEnableProfileNow) {
68-
ProvisioningUtil.enableProfile(this);
68+
if (savedInstanceState == null) {
69+
if (mEnableProfileNow) {
70+
ProvisioningUtil.enableProfile(this);
71+
} else {
72+
// Set up an alarm to enable profile in case we do not receive first account
73+
// broadcast for whatever reason.
74+
FirstAccountReadyBroadcastReceiver.scheduleFirstAccountReadyTimeoutAlarm(
75+
this, WAIT_FOR_FIRST_ACCOUNT_READY_TIMEOUT);
76+
}
6977
}
7078
setContentView(R.layout.enable_profile_activity);
7179
mSetupWizardLayout = (SetupWizardLayout) findViewById(R.id.setup_wizard_layout);

app/src/main/java/com/afwsamples/testdpc/FirstAccountReadyBroadcastReceiver.java

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616

1717
package com.afwsamples.testdpc;
1818

19-
import android.app.admin.DevicePolicyManager;
19+
import android.app.AlarmManager;
20+
import android.app.PendingIntent;
2021
import android.content.BroadcastReceiver;
2122
import android.content.ComponentName;
2223
import android.content.Context;
2324
import android.content.Intent;
2425
import android.content.pm.PackageManager;
26+
import android.os.SystemClock;
2527
import android.util.Log;
2628

2729
import com.afwsamples.testdpc.provision.CheckInState;
@@ -40,12 +42,19 @@ public class FirstAccountReadyBroadcastReceiver extends BroadcastReceiver {
4042
private static final String FIRST_ACCOUNT_READY_ACTION =
4143
"com.google.android.work.action.FIRST_ACCOUNT_READY";
4244

45+
public static final String FIRST_ACCOUNT_READY_TIMEOUT_ACTION =
46+
"com.afwsamples.testdpc.FIRST_ACCOUNT_READY_TIMEOUT";
47+
4348
public void onReceive(Context context, Intent intent) {
44-
Log.d(TAG, "Received: " + intent.getAction());
45-
if (FIRST_ACCOUNT_READY_ACTION.equals(intent.getAction())) {
49+
final String action = intent.getAction();
50+
Log.d(TAG, "Received: " + action);
51+
if (FIRST_ACCOUNT_READY_ACTION.equals(action) ||
52+
FIRST_ACCOUNT_READY_TIMEOUT_ACTION.equals(action)) {
4653
CheckInState checkInState = new CheckInState(context);
47-
checkInState.setFirstAccountReady();
48-
ProvisioningUtil.enableProfile(context);
54+
if (!checkInState.isFirstAccountReady()) {
55+
checkInState.setFirstAccountReady();
56+
ProvisioningUtil.enableProfile(context);
57+
}
4958
// This receiver is disabled in ProvisioningUtil.enableProfile, no more code should
5059
// be put after it.
5160
}
@@ -59,4 +68,26 @@ public static void setEnabled(Context context, boolean enabled) {
5968
DONT_KILL_APP
6069
);
6170
}
71+
72+
/**
73+
* Enable profile anyway if we cannot receive the broadcast after certain amount time.
74+
*/
75+
public static void scheduleFirstAccountReadyTimeoutAlarm(Context context, long timeout) {
76+
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
77+
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
78+
SystemClock.elapsedRealtime() + timeout,
79+
createFirstAccountReadyTimeoutPendingIntent(context));
80+
}
81+
82+
public static void cancelFirstAccountReadyTimeoutAlarm(Context context) {
83+
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
84+
alarmManager.cancel(createFirstAccountReadyTimeoutPendingIntent(context));
85+
}
86+
87+
private static PendingIntent createFirstAccountReadyTimeoutPendingIntent(Context context) {
88+
Intent intent = new Intent(context, FirstAccountReadyBroadcastReceiver.class);
89+
intent.setAction(FirstAccountReadyBroadcastReceiver.FIRST_ACCOUNT_READY_TIMEOUT_ACTION);
90+
return PendingIntent.getBroadcast(
91+
context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
92+
}
6293
}

app/src/main/java/com/afwsamples/testdpc/provision/ProvisioningUtil.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
public class ProvisioningUtil {
2828
public static void enableProfile(Context context) {
29+
FirstAccountReadyBroadcastReceiver.cancelFirstAccountReadyTimeoutAlarm(context);
2930
DevicePolicyManager manager = (DevicePolicyManager) context.getSystemService(
3031
Context.DEVICE_POLICY_SERVICE);
3132
ComponentName componentName = DeviceAdminReceiver.getComponentName(context);

0 commit comments

Comments
 (0)