1
0
mirror of https://github.com/MGislv/NekoX.git synced 2024-07-02 10:33:36 +00:00

feat: Internal Updater, following GitHub Releases

This commit is contained in:
luvletter2333 2021-05-07 00:31:47 +08:00
parent 238e3afb37
commit 38d78341da
No known key found for this signature in database
GPG Key ID: BFD68B892BECC1D8
11 changed files with 191 additions and 2 deletions

View File

@ -63,6 +63,8 @@
java.lang.Object readResolve();
}
-keep class tw.nekomimi.nekogram.InternalUpdater$ReleaseMetadata { *; }
-keep class tw.nekomimi.nekogram.InternalUpdater$ApkMetadata { *; }
# Constant folding for resource integers may mean that a resource passed to this method appears to be unused. Keep the method to prevent this from happening.
-keep class com.google.android.exoplayer2.upstream.RawResourceDataSource {

View File

@ -33,13 +33,14 @@ public class BuildVars {
public static boolean isUnknown = !BuildConfig.BUILD_TYPE.startsWith("release");
public static boolean isMini = BuildConfig.FLAVOR.startsWith("mini");
public static boolean isPlay = BuildConfig.FLAVOR.endsWith("Play");
public static boolean isFdroid = BuildConfig.BUILD_TYPE.toLowerCase().contains("fdroid");
static {
try {
PackageInfo info = ApplicationLoader.applicationContext.getPackageManager().getPackageInfo(ApplicationLoader.applicationContext.getPackageName(), 0);
BUILD_VERSION = info.versionCode;
BUILD_VERSION_STRING = info.packageName;
BUILD_VERSION_STRING = info.versionName;
} catch (PackageManager.NameNotFoundException e) {
BUILD_VERSION = BuildConfig.VERSION_CODE;
BUILD_VERSION_STRING = BuildConfig.VERSION_NAME;

View File

@ -166,11 +166,15 @@ import org.telegram.ui.Components.ViewPagerFixed;
import java.util.ArrayList;
import cn.hutool.core.date.DateTime;
import kotlin.Unit;
import tw.nekomimi.nekogram.BottomBuilder;
import tw.nekomimi.nekogram.InternalUpdater;
import tw.nekomimi.nekogram.NekoConfig;
import tw.nekomimi.nekogram.NekoXConfig;
import tw.nekomimi.nekogram.utils.PrivacyUtil;
import tw.nekomimi.nekogram.utils.ProxyUtil;
import tw.nekomimi.nekogram.utils.UIUtil;
import tw.nekomimi.nekogram.utils.UpdateUtil;
import tw.nekomimi.nekogram.utils.VibrateUtil;
@ -3510,6 +3514,8 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
PrivacyUtil.postCheckAll(getParentActivity(), currentAccount);
UpdateUtil.postCheckFollowChannel(getParentActivity(), currentAccount);
if (!BuildVars.isFdroid && NekoXConfig.autoUpdateReleaseChannel != 0 && DateTime.now().compareTo(NekoXConfig.nextUpdateCheck) > 0)
UIUtil.runOnIoDispatcher(() -> InternalUpdater.checkUpdate(getParentActivity(), true), 6000);
return fragmentView;
}

View File

@ -175,6 +175,7 @@ import cn.hutool.core.util.StrUtil;
import kotlin.Unit;
import libv2ray.Libv2ray;
import tw.nekomimi.nekogram.BottomBuilder;
import tw.nekomimi.nekogram.InternalUpdater;
import tw.nekomimi.nekogram.NekoConfig;
import tw.nekomimi.nekogram.NekoXConfig;
import tw.nekomimi.nekogram.NekoXSettingActivity;
@ -2934,6 +2935,48 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
return Unit.INSTANCE;
});
if (!BuildVars.isFdroid) {
builder.addItem(LocaleController.getString("CheckUpdate", R.string.CheckUpdate), R.drawable.baseline_search_24, (it) -> {
UIUtil.runOnIoDispatcher(() -> InternalUpdater.checkUpdate(getParentActivity(), false));
return Unit.INSTANCE;
});
String currentChannel = " - ";
switch (NekoXConfig.autoUpdateReleaseChannel) {
case 0:
currentChannel += LocaleController.getString("AutoCheckUpdateOFF", R.string.AutoCheckUpdateOFF);
break;
case 1:
currentChannel += LocaleController.getString("AutoCheckUpdateStable", R.string.AutoCheckUpdateStable);
break;
case 2:
currentChannel += LocaleController.getString("AutoCheckUpdateRc", R.string.AutoCheckUpdateRc);
break;
}
builder.addItem(LocaleController.getString("AutoCheckUpdateSwitch", R.string.AutoCheckUpdateSwitch) + currentChannel, R.drawable.update_black_24, (it) -> {
BottomBuilder switchBuilder = new BottomBuilder(getParentActivity());
switchBuilder.addTitle(LocaleController.getString("AutoCheckUpdateSwitch", R.string.AutoCheckUpdateSwitch));
switchBuilder.addRadioItem(LocaleController.getString("AutoCheckUpdateOFF", R.string.AutoCheckUpdateOFF), NekoXConfig.autoUpdateReleaseChannel == 0, (radioButtonCell) -> {
NekoXConfig.setAutoUpdateReleaseChannel(0);
switchBuilder.doRadioCheck(radioButtonCell);
return Unit.INSTANCE;
});
switchBuilder.addRadioItem(LocaleController.getString("AutoCheckUpdateStable", R.string.AutoCheckUpdateStable), NekoXConfig.autoUpdateReleaseChannel == 1, (radioButtonCell) -> {
NekoXConfig.setAutoUpdateReleaseChannel(1);
switchBuilder.doRadioCheck(radioButtonCell);
return Unit.INSTANCE;
});
switchBuilder.addRadioItem(LocaleController.getString("AutoCheckUpdateRc", R.string.AutoCheckUpdateRc), NekoXConfig.autoUpdateReleaseChannel == 2, (radioButtonCell) -> {
NekoXConfig.setAutoUpdateReleaseChannel(2);
switchBuilder.doRadioCheck(radioButtonCell);
return Unit.INSTANCE;
});
showDialog(switchBuilder.create());
return Unit.INSTANCE;
});
}
if (NekoXConfig.developerModeEntrance || NekoXConfig.developerMode || ArrayUtil.contains(NekoXConfig.developers, getUserConfig().clientUserId)) {
builder.addItem(LocaleController.getString("DeveloperSettings", R.string.DeveloperSettings), R.drawable.baseline_developer_mode_24, (it) -> {
BottomBuilder devBuilder = new BottomBuilder(ProfileActivity.this.getParentActivity());
@ -3235,7 +3278,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
avatarContainer = new FrameLayout(context);
avatarContainer2 = new FrameLayout(context);
AndroidUtilities.updateViewVisibilityAnimated(avatarContainer2, true, 1f, false);
frameLayout.addView(avatarContainer2, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
frameLayout.addView(avatarContainer2, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT));
avatarContainer.setPivotX(0);
avatarContainer.setPivotY(0);
avatarContainer2.addView(avatarContainer, LayoutHelper.createFrame(42, 42, Gravity.TOP | Gravity.LEFT, 64, 0, 0, 0));
@ -3581,6 +3624,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
pinchToZoomHelper = new PinchToZoomHelper(decorView) {
Paint statusBarPaint;
@Override
protected void invalidateViews() {
super.invalidateViews();

View File

@ -0,0 +1,108 @@
package tw.nekomimi.nekogram;
import android.content.Context;
import android.widget.Toast;
import com.google.gson.Gson;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.BuildConfig;
import org.telegram.messenger.BuildVars;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.R;
import org.telegram.messenger.browser.Browser;
import org.telegram.ui.ActionBar.AlertDialog;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.http.HttpRequest;
import tw.nekomimi.nekogram.utils.FileUtil;
public class InternalUpdater {
private static final String API_URL_RELEASE = "https://api.github.com/repos/NekoX-Dev/NekoX/releases?per_page=10";
private static class ReleaseMetadata {
String name;
String body;
String published_at;
String html_url;
ApkMetadata[] assets;
}
private static class ApkMetadata {
String name;
String browser_download_url;
}
private static ApkMetadata matchBuild(ApkMetadata[] apks) {
String target = BuildConfig.FLAVOR + "-" + FileUtil.getAbi() + "-" + BuildConfig.BUILD_TYPE + ".apk";
FileLog.e(target);
for (ApkMetadata apk : apks) {
if (apk.name.contains(target))
return apk;
}
return null;
}
public static void checkUpdate(Context ctx, boolean isAutoCheck) {
if (BuildVars.isFdroid)
return;
try {
NekoXConfig.setNextUpdateCheck(DateTime.now().offsetNew(DateField.HOUR, 24));
String ret = HttpRequest.get(API_URL_RELEASE).header("accept", "application/vnd.github.v3+json").execute().body();
ReleaseMetadata[] releases = new Gson().fromJson(ret, ReleaseMetadata[].class);
ReleaseMetadata release = null;
for (ReleaseMetadata rel : releases) {
if (rel.name.contains("rc") && NekoXConfig.autoUpdateReleaseChannel < 2 || rel.name.contains("preview") && NekoXConfig.autoUpdateReleaseChannel < 3)
continue;
if (rel.name.equals("v" + BuildConfig.VERSION_NAME))
break;
release = rel;
break;
}
if (release == null) {
FileLog.d("no update");
if (!isAutoCheck)
AndroidUtilities.runOnUIThread(() -> Toast.makeText(ctx, LocaleController.getString("VersionUpdateNoUpdate", R.string.VersionUpdateNoUpdate), Toast.LENGTH_SHORT).show());
return;
} else if (release.name.equals(NekoXConfig.ignoredUpdateTag) && isAutoCheck) {
FileLog.d("ignored tag " + release.name);
return;
}
final ApkMetadata apk = matchBuild(release.assets);
ReleaseMetadata finalRelease = release;
AndroidUtilities.runOnUIThread(() -> {
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
builder.setTitle(LocaleController.getString("VersionUpdateTitle", R.string.VersionUpdateTitle));
String message = finalRelease.name + " " + LocaleController.formatDateChat(DateTime.of(finalRelease.published_at, DatePattern.UTC_PATTERN).toTimestamp().getTime() / 1000) + "\n\n";
if (apk == null)
message += LocaleController.getString("VersionUpdateVariantNotMatch", R.string.VersionUpdateVariantNotMatch);
else
message += apk.name.replace(".apk", "");
builder.setMessage(message);
builder.setPositiveButton(LocaleController.getString("VersionUpdateConfirm", R.string.VersionUpdateConfirm), (dialog, which) -> {
if (apk != null)
Browser.openUrl(ctx, apk.browser_download_url);
else
Browser.openUrl(ctx, finalRelease.html_url);
});
builder.setNeutralButton(LocaleController.getString("VersionUpdateIgnore", R.string.VersionUpdateIgnore), (dialog, which) -> NekoXConfig.setIgnoredUpdateTag(finalRelease.name));
builder.setNegativeButton(LocaleController.getString("VersionUpdateNotNow", R.string.VersionUpdateNotNow), (dialog, which) -> NekoXConfig.setNextUpdateCheck(DateTime.now().offsetNew(DateField.HOUR, 24 * 3)));
builder.show();
});
} catch (Exception e) {
FileLog.e(e);
if (!isAutoCheck)
AndroidUtilities.runOnUIThread(() -> Toast.makeText(ctx, "An exception occurred during checking updates.", Toast.LENGTH_SHORT).show());
}
}
}

View File

@ -6,6 +6,8 @@ import org.telegram.messenger.BuildConfig;
import org.telegram.messenger.BuildVars;
import org.telegram.messenger.NotificationCenter;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import tw.nekomimi.nekogram.database.NitritesKt;
public class NekoXConfig {
@ -37,6 +39,10 @@ public class NekoXConfig {
public static boolean enableStickerPin = preferences.getBoolean("enableStickerPin", false);
public static int autoUpdateReleaseChannel = preferences.getInt("autoUpdateReleaseChannel", 2);
public static String ignoredUpdateTag = preferences.getString("ignoredUpdateTag", "");
public static DateTime nextUpdateCheck = DateTime.of(preferences.getString("nextUpdateCheck", "2021-01-01T00:00:00Z"), DatePattern.UTC_PATTERN);
public static void toggleDeveloperMode() {
@ -158,5 +164,17 @@ public class NekoXConfig {
}
public static void setAutoUpdateReleaseChannel(int channel) {
preferences.edit().putInt("autoUpdateReleaseChannel", autoUpdateReleaseChannel = channel).apply();
}
public static void setIgnoredUpdateTag(String ignored) {
preferences.edit().putString("ignoredUpdateTag", ignoredUpdateTag = ignored).apply();
}
public static void setNextUpdateCheck(DateTime dateTime) {
nextUpdateCheck = dateTime;
preferences.edit().putString("nextUpdateCheck", dateTime.toString(DatePattern.UTC_PATTERN)).apply();
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 536 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 B

View File

@ -237,4 +237,14 @@
<string name="ImportSettings">Import settings</string>
<string name="ImportSettingsAlert">Are you sure you want to overwrite the settings? Importing settings from unknown sources may cause the pin to be overwritten and cause the application to be locked.</string>
<string name="nekoXPaymentRemovedToast">The payment function has been removed.</string>
<string name="VersionUpdateTitle">New Version Available</string>
<string name="VersionUpdateVariantNotMatch">Version variants fail to match automatically.\nPlease download manually from GitHub.</string>
<string name="VersionUpdateConfirm">UPDATE</string>
<string name="VersionUpdateIgnore">Ignore</string>
<string name="VersionUpdateNotNow">Not now</string>
<string name="VersionUpdateNoUpdate">No Update.</string>
<string name="AutoCheckUpdateOFF">OFF</string>
<string name="AutoCheckUpdateSwitch">Automatic Update</string>
<string name="AutoCheckUpdateStable">Stable</string>
<string name="AutoCheckUpdateRc">Release Candidate</string>
</resources>