Fix skia crash in widget preview loading

This fix works making sure all drawables are mutated before drawing
them in the background. Mutation has to be executed on the main
thread because that operation is not thread safe.

Bug: 12525890
Change-Id: Id7bdf9cf48d3e7b7f31938bdea4a3bf1632cf337
This commit is contained in:
Adrian Roos
2014-04-15 21:07:49 +02:00
parent b6ecd78159
commit 65d60e21ec
2 changed files with 104 additions and 3 deletions

View File

@@ -0,0 +1,80 @@
/*
* Copyright (C) 2014 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.launcher3;
import android.os.Handler;
import android.os.Looper;
import java.util.List;
import java.util.concurrent.AbstractExecutorService;
import java.util.concurrent.TimeUnit;
/**
* An executor service that executes its tasks on the main thread.
*
* Shutting down this executor is not supported.
*/
public class MainThreadExecutor extends AbstractExecutorService {
private Handler mHandler = new Handler(Looper.getMainLooper());
@Override
public void execute(Runnable runnable) {
if (Looper.getMainLooper() == Looper.myLooper()) {
runnable.run();
} else {
mHandler.post(runnable);
}
}
/**
* Not supported and throws an exception when used.
*/
@Override
@Deprecated
public void shutdown() {
throw new UnsupportedOperationException();
}
/**
* Not supported and throws an exception when used.
*/
@Override
@Deprecated
public List<Runnable> shutdownNow() {
throw new UnsupportedOperationException();
}
@Override
public boolean isShutdown() {
return false;
}
@Override
public boolean isTerminated() {
return false;
}
/**
* Not supported and throws an exception when used.
*/
@Override
@Deprecated
public boolean awaitTermination(long l, TimeUnit timeUnit) throws InterruptedException {
throw new UnsupportedOperationException();
}
}