/*
* Copyright (C) 2010 ZXing authors
*
* 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 ntu.com.google.zxing.client.android.result.supplement;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Handler;
import android.text.Html;
import android.text.Spanned;
import android.view.View;
import android.widget.TextView;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import ntu.com.google.zxing.client.result.ISBNParsedResult;
import ntu.com.google.zxing.client.result.ParsedResult;
import ntu.com.google.zxing.client.result.ProductParsedResult;
import ntu.com.google.zxing.client.result.URIParsedResult;
public abstract class SupplementalInfoRetriever implements Callable<Void> {
private static ExecutorService executorInstance = null;
private static synchronized ExecutorService getExecutorService() {
if (executorInstance == null) {
executorInstance = Executors.newCachedThreadPool(new ThreadFactory() {
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
});
}
return executorInstance;
}
public static void maybeInvokeRetrieval(TextView textView, ParsedResult result, Handler handler,
Context context) {
SupplementalInfoRetriever retriever = null;
if (result instanceof URIParsedResult) {
retriever = new URIResultInfoRetriever(textView, (URIParsedResult) result, handler, context);
} else if (result instanceof ProductParsedResult) {
retriever = new ProductResultInfoRetriever(textView,
((ProductParsedResult) result).getProductID(), handler, context);
} else if (result instanceof ISBNParsedResult) {
retriever = new ProductResultInfoRetriever(textView, ((ISBNParsedResult) result).getISBN(),
handler, context);
}
if (retriever != null) {
ExecutorService executor = getExecutorService();
Future<?> future = executor.submit(retriever);
// Make sure it's interrupted after a short time though
executor.submit(new KillerCallable(future, 10, TimeUnit.SECONDS));
}
}
private final WeakReference<TextView> textViewRef;
private final Handler handler;
private final Context context;
SupplementalInfoRetriever(TextView textView, Handler handler, Context context) {
this.textViewRef = new WeakReference<TextView>(textView);
this.handler = handler;
this.context = context;
}
public final Void call() throws IOException, InterruptedException {
retrieveSupplementalInfo();
return null;
}
abstract void retrieveSupplementalInfo() throws IOException, InterruptedException;
final void append(final String newText) throws InterruptedException {
final TextView textView = textViewRef.get();
if (textView == null) {
throw new InterruptedException();
}
handler.post(new Runnable() {
public void run() {
Spanned html = Html.fromHtml(newText + '\n');
textView.append(html);
}
});
}
final void setLink(final String uri) {
textViewRef.get().setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
context.startActivity(intent);
}
});
}
}