/*
* Tencent is pleased to support the open source community by making Tinker available.
*
* Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*
* 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.tencent.tinker.lib.service;
import com.tencent.tinker.lib.tinker.Tinker;
import com.tencent.tinker.lib.tinker.TinkerLoadResult;
import com.tencent.tinker.lib.util.TinkerLog;
import com.tencent.tinker.lib.util.TinkerServiceInternals;
import com.tencent.tinker.loader.shareutil.ShareConstants;
import com.tencent.tinker.loader.shareutil.SharePatchFileUtil;
import java.io.File;
/**
* Created by zhangshaowen on 16/3/19.
*/
public class DefaultTinkerResultService extends AbstractResultService {
private static final String TAG = "Tinker.DefaultTinkerResultService";
/**
* we may want to use the new patch just now!!
*
* @param result
*/
@Override
public void onPatchResult(PatchResult result) {
if (result == null) {
TinkerLog.e(TAG, "DefaultTinkerResultService received null result!!!!");
return;
}
TinkerLog.i(TAG, "DefaultTinkerResultService received a result:%s ", result.toString());
//first, we want to kill the recover process
TinkerServiceInternals.killTinkerPatchServiceProcess(getApplicationContext());
// if success and newPatch, it is nice to delete the raw file, and restart at once
// only main process can load an upgrade patch!
if (result.isSuccess) {
deleteRawPatchFile(new File(result.rawPatchFilePath));
if (checkIfNeedKill(result)) {
android.os.Process.killProcess(android.os.Process.myPid());
} else {
TinkerLog.i(TAG, "I have already install the newly patch version!");
}
}
}
/**
* don't delete tinker version file
* @param rawFile
*/
public void deleteRawPatchFile(File rawFile) {
if (!SharePatchFileUtil.isLegalFile(rawFile)) {
return;
}
TinkerLog.w(TAG, "deleteRawPatchFile rawFile path: %s", rawFile.getPath());
String fileName = rawFile.getName();
if (!fileName.startsWith(ShareConstants.PATCH_BASE_NAME)
|| !fileName.endsWith(ShareConstants.PATCH_SUFFIX)) {
SharePatchFileUtil.safeDeleteFile(rawFile);
return;
}
File parentFile = rawFile.getParentFile();
if (!parentFile.getName().startsWith(ShareConstants.PATCH_BASE_NAME)) {
SharePatchFileUtil.safeDeleteFile(rawFile);
} else {
File grandFile = parentFile.getParentFile();
if (!grandFile.getName().equals(ShareConstants.PATCH_DIRECTORY_NAME)) {
SharePatchFileUtil.safeDeleteFile(rawFile);
}
}
}
public boolean checkIfNeedKill(PatchResult result) {
Tinker tinker = Tinker.with(getApplicationContext());
if (tinker.isTinkerLoaded()) {
TinkerLoadResult tinkerLoadResult = tinker.getTinkerLoadResultIfPresent();
if (tinkerLoadResult != null) {
String currentVersion = tinkerLoadResult.currentVersion;
if (result.patchVersion != null && result.patchVersion.equals(currentVersion)) {
return false;
}
}
}
return true;
}
}