| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.minting; | 5 package org.chromium.minting; |
| 6 | 6 |
| 7 import android.app.Activity; | 7 import android.app.Activity; |
| 8 import android.content.ComponentName; | 8 import android.content.ComponentName; |
| 9 import android.content.Intent; | 9 import android.content.Intent; |
| 10 import android.content.SharedPreferences; | 10 import android.content.SharedPreferences; |
| 11 import android.content.pm.ApplicationInfo; | 11 import android.content.pm.ApplicationInfo; |
| 12 import android.content.pm.PackageManager; | 12 import android.content.pm.PackageManager; |
| 13 import android.content.pm.PackageManager.NameNotFoundException; | 13 import android.content.pm.PackageManager.NameNotFoundException; |
| 14 import android.graphics.Bitmap; | 14 import android.graphics.Bitmap; |
| 15 import android.graphics.BitmapFactory; | 15 import android.graphics.BitmapFactory; |
| 16 import android.os.Bundle; | 16 import android.os.Bundle; |
| 17 import android.util.Base64; | 17 import android.util.Base64; |
| 18 import android.util.Log; | 18 import android.util.Log; |
| 19 import android.view.View; | 19 import android.view.View; |
| 20 import android.view.View.OnClickListener; | 20 import android.view.View.OnClickListener; |
| 21 | 21 |
| 22 import org.chromium.minting.lib.common.WebAPKConstants; | 22 import org.chromium.minting.lib.common.WebAPKConstants; |
| 23 import org.chromium.minting.lib.common.WebAPKUtils; |
| 23 | 24 |
| 24 import java.io.ByteArrayOutputStream; | 25 import java.io.ByteArrayOutputStream; |
| 25 | 26 |
| 26 /** | 27 /** |
| 27 * Example client activity for a minted APK. | 28 * Example client activity for a minted APK. |
| 28 */ | 29 */ |
| 29 public class MainActivity extends Activity implements OnClickListener { | 30 public class MainActivity extends Activity { |
| 30 private static final String EXTRA_ID = "org.chromium.chrome.browser.webapp_i
d"; | 31 private static final String EXTRA_ID = "org.chromium.chrome.browser.webapp_i
d"; |
| 31 private static final String EXTRA_ICON = "org.chromium.chrome.browser.webapp
_icon"; | 32 private static final String EXTRA_ICON = "org.chromium.chrome.browser.webapp
_icon"; |
| 32 private static final String EXTRA_NAME = "org.chromium.chrome.browser.webapp
_name"; | 33 private static final String EXTRA_NAME = "org.chromium.chrome.browser.webapp
_name"; |
| 33 private static final String EXTRA_SHORT_NAME = "org.chromium.chrome.browser.
webapp_name"; | 34 private static final String EXTRA_SHORT_NAME = "org.chromium.chrome.browser.
webapp_name"; |
| 34 private static final String EXTRA_URL = "org.chromium.chrome.browser.webapp_
url"; | 35 private static final String EXTRA_URL = "org.chromium.chrome.browser.webapp_
url"; |
| 35 private static final String EXTRA_MAC = "org.chromium.chrome.browser.webapp_
mac"; | 36 private static final String EXTRA_MAC = "org.chromium.chrome.browser.webapp_
mac"; |
| 36 private static final String EXTRA_SCOPE = "org.chromium.chrome.browser.webap
p_scope"; | 37 private static final String EXTRA_SCOPE = "org.chromium.chrome.browser.webap
p_scope"; |
| 37 private static final String EXTRA_MINTING_PACKAGE_NAME = "EXTRA_MINTING_PACK
AGE_NAME"; | 38 private static final String EXTRA_MINTING_PACKAGE_NAME = "EXTRA_MINTING_PACK
AGE_NAME"; |
| 38 private static final String EXTRA_CALLER_PACKAGE_NAME = "EXTRA_CALLER_PACKAG
E_NAME"; | |
| 39 private static final String META_DATA_HOST_URL = "hostUrl"; | 39 private static final String META_DATA_HOST_URL = "hostUrl"; |
| 40 private static final String META_DATA_MAC = "mac"; | 40 private static final String META_DATA_MAC = "mac"; |
| 41 private static final String META_DATA_SCOPE = "scope"; | 41 private static final String META_DATA_SCOPE = "scope"; |
| 42 | 42 |
| 43 private static final String TAG = "cr_MintingAPKExample"; | 43 private static final String TAG = "cr_MintingAPKExample"; |
| 44 | 44 |
| 45 @Override | 45 @Override |
| 46 protected void onCreate(Bundle savedInstanceState) { | 46 protected void onCreate(Bundle savedInstanceState) { |
| 47 super.onCreate(savedInstanceState); | 47 super.onCreate(savedInstanceState); |
| 48 | 48 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 75 Bitmap icon = BitmapFactory.decodeResource(getResources(), | 75 Bitmap icon = BitmapFactory.decodeResource(getResources(), |
| 76 org.chromium.minting.R.drawable.app_icon); | 76 org.chromium.minting.R.drawable.app_icon); |
| 77 encodedIcon = encodeBitmapAsString(icon); | 77 encodedIcon = encodeBitmapAsString(icon); |
| 78 Log.w(TAG, "Url of the minted APK: " + url); | 78 Log.w(TAG, "Url of the minted APK: " + url); |
| 79 Log.w(TAG, "webappId of the minted APK: " + webappId); | 79 Log.w(TAG, "webappId of the minted APK: " + webappId); |
| 80 Log.w(TAG, "name of the minted APK:" + name); | 80 Log.w(TAG, "name of the minted APK:" + name); |
| 81 } catch (NameNotFoundException e) { | 81 } catch (NameNotFoundException e) { |
| 82 e.printStackTrace(); | 82 e.printStackTrace(); |
| 83 } | 83 } |
| 84 | 84 |
| 85 SharedPreferences prefs = | |
| 86 getSharedPreferences(MintingApplication.MINT_PREFS, MODE_PRIVATE
); | |
| 87 String chromePackageFromPref = prefs.getString(MintingApplication.HOST_P
ACKAGE_PREF, | |
| 88 MintingApplication.DEFAULT_CHROME_PACKAGE_NAME); | |
| 89 String callerPackageName = intent.getStringExtra(EXTRA_CALLER_PACKAGE_NA
ME); | |
| 90 // Update value if needed | |
| 91 if (callerPackageName != null && !callerPackageName.equals(chromePackage
FromPref)) { | |
| 92 prefs.edit().putString(MintingApplication.HOST_PACKAGE_PREF, callerP
ackageName) | |
| 93 .apply(); | |
| 94 Log.d(TAG, "Chrome with package " + callerPackageName + " is new hos
t"); | |
| 95 } | |
| 96 String chromePackageName = callerPackageName == null ? chromePackageFrom
Pref : | |
| 97 callerPackageName; | |
| 98 | |
| 99 Intent newIntent = new Intent(); | 85 Intent newIntent = new Intent(); |
| 100 newIntent.setComponent(new ComponentName(chromePackageName, | 86 newIntent.setComponent(new ComponentName(WebAPKUtils.getHostBrowserPacka
geName(this), |
| 101 "org.chromium.chrome.browser.webapps.WebappLauncherActivity")); | 87 "org.chromium.chrome.browser.webapps.WebappLauncherActivity")); |
| 102 newIntent.putExtra(EXTRA_ID, webappId); | 88 newIntent.putExtra(EXTRA_ID, webappId); |
| 103 newIntent.putExtra(EXTRA_NAME, name); | 89 newIntent.putExtra(EXTRA_NAME, name); |
| 104 newIntent.putExtra(EXTRA_SHORT_NAME, name); | 90 newIntent.putExtra(EXTRA_SHORT_NAME, name); |
| 105 newIntent.putExtra(EXTRA_MINTING_PACKAGE_NAME, packageName); | 91 newIntent.putExtra(EXTRA_MINTING_PACKAGE_NAME, packageName); |
| 106 newIntent.putExtra(EXTRA_SCOPE, scope); | 92 newIntent.putExtra(EXTRA_SCOPE, scope); |
| 107 newIntent.putExtra(EXTRA_URL, url); | 93 newIntent.putExtra(EXTRA_URL, url); |
| 108 newIntent.putExtra(EXTRA_MAC, mac); | 94 newIntent.putExtra(EXTRA_MAC, mac); |
| 109 newIntent.putExtra(EXTRA_ICON, encodedIcon); | 95 newIntent.putExtra(EXTRA_ICON, encodedIcon); |
| 110 startActivity(newIntent); | 96 startActivity(newIntent); |
| 111 finish(); | 97 finish(); |
| 112 } | 98 } |
| 113 | 99 |
| 114 @Override | |
| 115 public void onClick(View v) { | |
| 116 | |
| 117 } | |
| 118 | 100 |
| 119 /** | 101 /** |
| 120 * Compresses a bitmap into a PNG and converts into a Base64 encoded string. | 102 * Compresses a bitmap into a PNG and converts into a Base64 encoded string. |
| 121 * The encoded string can be decoded using {@link decodeBitmapFromString(Str
ing)}. | 103 * The encoded string can be decoded using {@link decodeBitmapFromString(Str
ing)}. |
| 122 * @param bitmap The Bitmap to compress and encode. | 104 * @param bitmap The Bitmap to compress and encode. |
| 123 * @return the String encoding the Bitmap. | 105 * @return the String encoding the Bitmap. |
| 124 */ | 106 */ |
| 125 private static String encodeBitmapAsString(Bitmap bitmap) { | 107 private static String encodeBitmapAsString(Bitmap bitmap) { |
| 126 if (bitmap == null) return ""; | 108 if (bitmap == null) return ""; |
| 127 ByteArrayOutputStream output = new ByteArrayOutputStream(); | 109 ByteArrayOutputStream output = new ByteArrayOutputStream(); |
| 128 bitmap.compress(Bitmap.CompressFormat.PNG, 100, output); | 110 bitmap.compress(Bitmap.CompressFormat.PNG, 100, output); |
| 129 return Base64.encodeToString(output.toByteArray(), Base64.DEFAULT); | 111 return Base64.encodeToString(output.toByteArray(), Base64.DEFAULT); |
| 130 } | 112 } |
| 131 | 113 |
| 132 /** | 114 /** |
| 133 * Returns whether a url is valid. | 115 * Returns whether a url is valid. |
| 134 * @param url The url to check. | 116 * @param url The url to check. |
| 135 * @return Whether the url is valid. | 117 * @return Whether the url is valid. |
| 136 */ | 118 */ |
| 137 private static boolean isUrlValid(String url) { | 119 private static boolean isUrlValid(String url) { |
| 138 if (url == null) { | 120 if (url == null) { |
| 139 return false; | 121 return false; |
| 140 } | 122 } |
| 141 | 123 |
| 142 return url.startsWith("http:") || url.startsWith("https:"); | 124 return url.startsWith("http:") || url.startsWith("https:"); |
| 143 } | 125 } |
| 144 } | 126 } |
| OLD | NEW |