Utils.java revision 287f2d82aaf91d881f5de50a133d21684a8d4821
1d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson/*
2d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson * Copyright (C) 2012 The Android Open Source Project
3d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson *
4d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson * Licensed under the Apache License, Version 2.0 (the "License");
5d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson * you may not use this file except in compliance with the License.
6d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson * You may obtain a copy of the License at
7d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson *
8d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson *      http://www.apache.org/licenses/LICENSE-2.0
9d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson *
10d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson * Unless required by applicable law or agreed to in writing, software
11d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson * distributed under the License is distributed on an "AS IS" BASIS,
12d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson * See the License for the specific language governing permissions and
14d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson * limitations under the License.
15d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson */
16d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
17d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelsonpackage com.android.deskclock;
18d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
19d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelsonimport android.content.Context;
20d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelsonimport android.content.Intent;
21d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelsonimport android.content.pm.PackageInfo;
22d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelsonimport android.content.pm.PackageManager.NameNotFoundException;
23d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelsonimport android.net.Uri;
24287f2d82aaf91d881f5de50a133d21684a8d4821Sam Blitzsteinimport android.os.SystemClock;
25d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelsonimport android.text.TextUtils;
26d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelsonimport android.view.MenuItem;
27d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
28d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelsonimport java.util.Locale;
29d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
30d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
31d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelsonpublic class Utils {
32d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson    private final static String TAG = Utils.class.getName();
33d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
34d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson    private final static String PARAM_LANGUAGE_CODE = "hl";
35d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
36d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson    /**
37d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson     * Help URL query parameter key for the app version.
38d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson     */
39d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson    private final static String PARAM_VERSION = "version";
40d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
41d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson    /**
42d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson     * Cached version code to prevent repeated calls to the package manager.
43d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson     */
44d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson    private static String sCachedVersionCode = null;
45d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
46d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
47d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
48d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson    public static void prepareHelpMenuItem(Context context, MenuItem helpMenuItem) {
49d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        String helpUrlString = context.getResources().getString(R.string.desk_clock_help_url);
50d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        if (TextUtils.isEmpty(helpUrlString)) {
51d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson            // The help url string is empty or null, so set the help menu item to be invisible.
52d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson            helpMenuItem.setVisible(false);
53d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson            return;
54d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        }
55d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        // The help url string exists, so first add in some extra query parameters.  87
56d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        final Uri fullUri = uriWithAddedParameters(context, Uri.parse(helpUrlString));
57d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
58d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        // Then, create an intent that will be fired when the user
59d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        // selects this help menu item.
60d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        Intent intent = new Intent(Intent.ACTION_VIEW, fullUri);
61d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
62d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson                | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
63d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
64d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        // Set the intent to the help menu item, show the help menu item in the overflow
65d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        // menu, and make it visible.
66d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        helpMenuItem.setIntent(intent);
67d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        helpMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
68d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        helpMenuItem.setVisible(true);
69d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson    }
70d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
71d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson    /**
72d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson     * Adds two query parameters into the Uri, namely the language code and the version code
73d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson     * of the app's package as gotten via the context.
74d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson     * @return the uri with added query parameters
75d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson     */
76d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson    private static Uri uriWithAddedParameters(Context context, Uri baseUri) {
77d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        Uri.Builder builder = baseUri.buildUpon();
78d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
79d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        // Add in the preferred language
80d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        builder.appendQueryParameter(PARAM_LANGUAGE_CODE, Locale.getDefault().toString());
81d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
82d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        // Add in the package version code
83d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        if (sCachedVersionCode == null) {
84d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson            // There is no cached version code, so try to get it from the package manager.
85d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson            try {
86d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson                // cache the version code
87d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson                PackageInfo info = context.getPackageManager().getPackageInfo(
88d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson                        context.getPackageName(), 0);
89d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson                sCachedVersionCode = Integer.toString(info.versionCode);
90d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
91d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson                // append the version code to the uri
92d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson                builder.appendQueryParameter(PARAM_VERSION, sCachedVersionCode);
93d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson            } catch (NameNotFoundException e) {
94d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson                // Cannot find the package name, so don't add in the version parameter
95d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson                // This shouldn't happen.
96d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson                Log.wtf("Invalid package name for context " + e);
97d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson            }
98d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        } else {
99d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson            builder.appendQueryParameter(PARAM_VERSION, sCachedVersionCode);
100d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        }
101d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
102d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        // Build the full uri and return it
103d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson        return builder.build();
104d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson    }
105d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson
106287f2d82aaf91d881f5de50a133d21684a8d4821Sam Blitzstein    public static long getTimeNow() {
107287f2d82aaf91d881f5de50a133d21684a8d4821Sam Blitzstein        return SystemClock.elapsedRealtime();
108287f2d82aaf91d881f5de50a133d21684a8d4821Sam Blitzstein    }
109287f2d82aaf91d881f5de50a133d21684a8d4821Sam Blitzstein
110d2f8c51aba02f5e8cbbf82234ff453f305fba759Isaac Katzenelson}
111