Use JobIntentService to start the Backgroundworkerservice and ActionServiceImpl services. + Deleted WakeLock code. + Made changes to com.android.messaging.test tests so that all tests pass with the new JobService. I am not sure if these tests passed before these changes. + CTS tests passed without any changes. + Added TEST_MAPPING file for presubmit tests. Bug: 115499280 Bug: 119503204 Test: manual - Tested the messaging UI. Ran the following CTS tests on Pixel phone. $ make -j 40 rw-r--r-- 1 rtenneti primarygroup 8624061 Feb 19 12:37 out/target/product/marlin/system/app/messaging/messaging.apk $ make messagingtests -j -rw-r--r-- 1 rtenneti primarygroup 729713 Feb 19 12:52 out/target/product/marlin/testcases/messagingtests/messagingtests.apk $ adb install -r -d out/target/product/marlin/system/app/messaging/messaging.apk $ adb install -r -d out/target/product/marlin/testcases/messagingtests/messagingtests.apk $ adb shell am instrument -w com.android.messaging.test Test results for InstrumentationTestRunner=........... Time: 13.353 OK (113 tests) CTS tests for Mesaging app --------------------------- $ ./development/testrunner/runtest.py --path cts/tests/app/src/android/app/cts/NotificationTest.java android.app.cts.NotificationTest:........................... Time: 0.299 OK (27 tests) atest ----- $ cd .../packages/apps/Messaging $ atest Running Tests... messagingtests (113 Tests) ------------------------- ... [113/113] com.android.messaging.util.YouTubeUtilTest#testGetYoutubePreviewImageLink: PASSED (2ms) Results from tests that require device: Summary ------- messagingtests: Passed: 113, Failed: 0, Ignored: 0 All tests passed! Change-Id: I9494f0750954e6364abb695aa867494669ae54c4
161 lines
5.6 KiB
Java
161 lines
5.6 KiB
Java
/*
|
|
* Copyright (C) 2015 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.messaging.datamodel.action;
|
|
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.os.Bundle;
|
|
|
|
import androidx.core.app.JobIntentService;
|
|
|
|
import com.android.messaging.Factory;
|
|
import com.android.messaging.datamodel.DataModel;
|
|
import com.android.messaging.datamodel.DataModelException;
|
|
import com.android.messaging.util.Assert;
|
|
import com.android.messaging.util.LogUtil;
|
|
import com.android.messaging.util.LoggingTimer;
|
|
import com.google.common.annotations.VisibleForTesting;
|
|
|
|
import java.util.List;
|
|
|
|
/**
|
|
* Background worker service is an initial example of a background work queue handler
|
|
* Used to actually "send" messages which may take some time and should not block ActionService
|
|
* or UI
|
|
*/
|
|
public class BackgroundWorkerService extends JobIntentService {
|
|
private static final String TAG = LogUtil.BUGLE_DATAMODEL_TAG;
|
|
private static final boolean VERBOSE = false;
|
|
|
|
/**
|
|
* Unique job ID for this service.
|
|
*/
|
|
public static final int JOB_ID = 1001;
|
|
|
|
private final ActionService mHost;
|
|
|
|
public BackgroundWorkerService() {
|
|
super();
|
|
mHost = DataModel.get().getActionService();
|
|
}
|
|
|
|
/**
|
|
* Queue a list of requests from action service to this worker
|
|
*/
|
|
public static void queueBackgroundWork(final List<Action> actions) {
|
|
for (final Action action : actions) {
|
|
startServiceWithAction(action, 0);
|
|
}
|
|
}
|
|
|
|
// ops
|
|
@VisibleForTesting
|
|
protected static final int OP_PROCESS_REQUEST = 400;
|
|
|
|
// extras
|
|
@VisibleForTesting
|
|
protected static final String EXTRA_OP_CODE = "op";
|
|
@VisibleForTesting
|
|
protected static final String EXTRA_ACTION = "action";
|
|
@VisibleForTesting
|
|
protected static final String EXTRA_ATTEMPT = "retry_attempt";
|
|
|
|
/**
|
|
* Queue action intent to the BackgroundWorkerService.
|
|
*/
|
|
private static void startServiceWithAction(final Action action,
|
|
final int retryCount) {
|
|
final Intent intent = new Intent();
|
|
intent.putExtra(EXTRA_ACTION, action);
|
|
intent.putExtra(EXTRA_ATTEMPT, retryCount);
|
|
startServiceWithIntent(OP_PROCESS_REQUEST, intent);
|
|
}
|
|
|
|
/**
|
|
* Queue intent to the BackgroundWorkerService.
|
|
*/
|
|
private static void startServiceWithIntent(final int opcode, final Intent intent) {
|
|
final Context context = Factory.get().getApplicationContext();
|
|
|
|
intent.setClass(context, BackgroundWorkerService.class);
|
|
intent.putExtra(EXTRA_OP_CODE, opcode);
|
|
|
|
enqueueWork(context, intent);
|
|
}
|
|
|
|
public static void enqueueWork(Context context, Intent work) {
|
|
enqueueWork(context, BackgroundWorkerService.class, JOB_ID, work);
|
|
}
|
|
|
|
@Override
|
|
protected void onHandleWork(final Intent intent) {
|
|
if (intent == null) {
|
|
// Shouldn't happen but sometimes does following another crash.
|
|
LogUtil.w(TAG, "BackgroundWorkerService.onHandleIntent: Called with null intent");
|
|
return;
|
|
}
|
|
final int opcode = intent.getIntExtra(EXTRA_OP_CODE, 0);
|
|
|
|
switch(opcode) {
|
|
case OP_PROCESS_REQUEST: {
|
|
final Action action = intent.getParcelableExtra(EXTRA_ACTION);
|
|
final int attempt = intent.getIntExtra(EXTRA_ATTEMPT, -1);
|
|
doBackgroundWork(action, attempt);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
LogUtil.w(TAG, "Unrecognized opcode in BackgroundWorkerService " + opcode);
|
|
throw new RuntimeException("Unrecognized opcode in BackgroundWorkerService");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Local execution of background work for action on ActionService thread
|
|
*/
|
|
private void doBackgroundWork(final Action action, final int attempt) {
|
|
action.markBackgroundWorkStarting();
|
|
Bundle response = null;
|
|
try {
|
|
final LoggingTimer timer = new LoggingTimer(
|
|
TAG, action.getClass().getSimpleName() + "#doBackgroundWork");
|
|
timer.start();
|
|
|
|
response = action.doBackgroundWork();
|
|
|
|
timer.stopAndLog();
|
|
action.markBackgroundCompletionQueued();
|
|
mHost.handleResponseFromBackgroundWorker(action, response);
|
|
} catch (final Exception exception) {
|
|
final boolean retry = false;
|
|
LogUtil.e(TAG, "Error in background worker", exception);
|
|
if (!(exception instanceof DataModelException)) {
|
|
// DataModelException is expected (sort-of) and handled in handleFailureFromWorker
|
|
// below, but other exceptions should crash ENG builds
|
|
Assert.fail("Unexpected error in background worker - abort");
|
|
}
|
|
if (retry) {
|
|
action.markBackgroundWorkQueued();
|
|
startServiceWithAction(action, attempt + 1);
|
|
} else {
|
|
action.markBackgroundCompletionQueued();
|
|
mHost.handleFailureFromBackgroundWorker(action, exception);
|
|
}
|
|
}
|
|
}
|
|
}
|