File: UpdateServiceHelper.java

package info (click to toggle)
wine-gecko-2.24 2.24%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 740,092 kB
  • ctags: 688,789
  • sloc: cpp: 3,160,639; ansic: 1,619,153; python: 164,084; java: 128,022; asm: 114,527; xml: 69,863; sh: 55,281; makefile: 49,648; perl: 20,454; objc: 2,344; yacc: 2,066; pascal: 995; lex: 982; exp: 449; php: 244; lisp: 228; awk: 211; sed: 61; csh: 21; ada: 16; ruby: 3
file content (144 lines) | stat: -rw-r--r-- 5,840 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

package org.mozilla.gecko.updater;

import org.mozilla.gecko.AppConstants;
import org.mozilla.gecko.util.GeckoJarReader;

import android.content.Context;
import android.content.Intent;

import android.content.pm.PackageManager;
import android.content.pm.ApplicationInfo;

import android.os.Build;

import android.util.Log;

import java.net.URL;

public class UpdateServiceHelper {
    public static final String ACTION_REGISTER_FOR_UPDATES = AppConstants.ANDROID_PACKAGE_NAME + ".REGISTER_FOR_UPDATES";
    public static final String ACTION_UNREGISTER_FOR_UPDATES = AppConstants.ANDROID_PACKAGE_NAME + ".UNREGISTER_FOR_UPDATES";
    public static final String ACTION_CHECK_FOR_UPDATE = AppConstants.ANDROID_PACKAGE_NAME + ".CHECK_FOR_UPDATE";
    public static final String ACTION_CHECK_UPDATE_RESULT = AppConstants.ANDROID_PACKAGE_NAME + ".CHECK_UPDATE_RESULT";
    public static final String ACTION_DOWNLOAD_UPDATE = AppConstants.ANDROID_PACKAGE_NAME + ".DOWNLOAD_UPDATE";
    public static final String ACTION_APPLY_UPDATE = AppConstants.ANDROID_PACKAGE_NAME + ".APPLY_UPDATE";

    // Flags for ACTION_CHECK_FOR_UPDATE
    public static final int FLAG_FORCE_DOWNLOAD = 1;
    public static final int FLAG_OVERWRITE_EXISTING = 1 << 1;
    public static final int FLAG_REINSTALL = 1 << 2;
    public static final int FLAG_RETRY = 1 << 3;

    // Name of the Intent extra for the autodownload policy, used with ACTION_REGISTER_FOR_UPDATES
    public static final String EXTRA_AUTODOWNLOAD_NAME = "autodownload";

    // Values for EXTRA_AUTODOWNLOAD_NAME
    public static final int AUTODOWNLOAD_WIFI = 0;
    public static final int AUTODOWNLOAD_DISABLED = 1;
    public static final int AUTODOWNLOAD_ENABLED = 2;

    // Name of the Intent extra that holds the flags for ACTION_CHECK_FOR_UPDATE
    public static final String EXTRA_UPDATE_FLAGS_NAME = "updateFlags";

    // Name of the Intent extra that holds the APK path, used with ACTION_APPLY_UPDATE
    public static final String EXTRA_PACKAGE_PATH_NAME = "packagePath";

    private static final String LOGTAG = "UpdateServiceHelper";
    private static final String DEFAULT_UPDATE_LOCALE = "en-US";

    private static final String UPDATE_URL;

    static {
        final String pkgSpecial;
        if (AppConstants.MOZ_PKG_SPECIAL != null) {
            pkgSpecial = "-" + AppConstants.MOZ_PKG_SPECIAL;
        } else {
            pkgSpecial = "";
        }
        UPDATE_URL = "https://aus2.mozilla.org/update/4/" + AppConstants.MOZ_APP_BASENAME + "/" +
                     AppConstants.MOZ_APP_VERSION         +
                     "/%BUILDID%/Android_"                + AppConstants.MOZ_APP_ABI + pkgSpecial +
                     "/%LOCALE%/"                         + AppConstants.MOZ_UPDATE_CHANNEL +
                     "/%OS_VERSION%/default/default/"     + AppConstants.MOZILLA_VERSION +
                     "/update.xml";
    }

    public enum CheckUpdateResult {
        // Keep these in sync with mobile/android/chrome/content/about.xhtml
        NOT_AVAILABLE,
        AVAILABLE,
        DOWNLOADING,
        DOWNLOADED
    }

    public static URL getUpdateUrl(Context context, boolean force) {
        PackageManager pm = context.getPackageManager();

        String locale = null;
        try {
            ApplicationInfo info = pm.getApplicationInfo(AppConstants.ANDROID_PACKAGE_NAME, 0);
            String updateLocaleUrl = "jar:jar:file://" + info.sourceDir + "!/" + AppConstants.OMNIJAR_NAME + "!/update.locale";

            locale = GeckoJarReader.getText(updateLocaleUrl);

            if (locale != null)
                locale = locale.trim();
            else
                locale = DEFAULT_UPDATE_LOCALE;
        } catch (android.content.pm.PackageManager.NameNotFoundException e) {
            // Shouldn't really be possible, but fallback to default locale
            Log.i(LOGTAG, "Failed to read update locale file, falling back to " + DEFAULT_UPDATE_LOCALE);
            locale = DEFAULT_UPDATE_LOCALE;
        }

        String url = UPDATE_URL.replace("%LOCALE%", locale).
            replace("%OS_VERSION%", Build.VERSION.RELEASE).
            replace("%BUILDID%", force ? "0" : AppConstants.MOZ_APP_BUILDID);

        try {
            return new URL(url);
        } catch (java.net.MalformedURLException e) {
            Log.e(LOGTAG, "Failed to create update url: ", e);
            return null;
        }
    }

    public static boolean isUpdaterEnabled() {
        return AppConstants.MOZ_UPDATER;
    }

    public static void registerForUpdates(Context context, String policy) {
        if (policy == null)
            return;

        int intPolicy;
        if (policy.equals("wifi")) {
            intPolicy = AUTODOWNLOAD_WIFI;
        } else if (policy.equals("disabled")) {
            intPolicy = AUTODOWNLOAD_DISABLED;
        } else if (policy.equals("enabled")) {
            intPolicy = AUTODOWNLOAD_ENABLED;
        } else {
            Log.w(LOGTAG, "Unhandled autoupdate policy: " + policy);
            return;
        }

        registerForUpdates(context, intPolicy);
    }

    // 'policy' should one of AUTODOWNLOAD_WIFI, AUTODOWNLOAD_DISABLED, AUTODOWNLOAD_ENABLED
    public static void registerForUpdates(Context context, int policy) {
        if (!isUpdaterEnabled())
            return;

        Intent intent = new Intent(UpdateServiceHelper.ACTION_REGISTER_FOR_UPDATES, null, context, UpdateService.class);
        intent.putExtra(EXTRA_AUTODOWNLOAD_NAME, policy);

        context.startService(intent);
    }
}