/*
 * Copyright (C) 2012 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.inputmethod.research;

import android.app.IntentService;
import android.content.Intent;
import android.util.Log;

import com.android.inputmethod.research.MotionEventReader.ReplayData;

import java.io.File;
import java.util.concurrent.TimeUnit;

/**
 * Provide a mechanism to invoke the replayer from outside.
 *
 * In particular, makes access from a host possible through {@code adb am startservice}.
 */
public class ReplayerService extends IntentService {
    private static final String TAG = ReplayerService.class.getSimpleName();
    private static final String EXTRA_FILENAME = "com.android.inputmethod.research.extra.FILENAME";
    private static final long MAX_REPLAY_TIME = TimeUnit.SECONDS.toMillis(60);

    public ReplayerService() {
        super(ReplayerService.class.getSimpleName());
    }

    @Override
    protected void onHandleIntent(final Intent intent) {
        final String filename = intent.getStringExtra(EXTRA_FILENAME);
        if (filename == null) return;

        final ReplayData replayData = new MotionEventReader().readMotionEventData(
                new File(filename));
        synchronized (this) {
            Replayer.getInstance().replay(replayData, new Runnable() {
                @Override
                public void run() {
                    synchronized (ReplayerService.this) {
                        ReplayerService.this.notify();
                    }
                }
            });
            try {
                wait(MAX_REPLAY_TIME);
            } catch (InterruptedException e) {
                Log.e(TAG, "Timeout while replaying.", e);
            }
        }
    }
}