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