1d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein/* 2d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein * Copyright (C) 2013 The Android Open Source Project 3d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein * 4d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein * Licensed under the Apache License, Version 2.0 (the "License"); 5d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein * you may not use this file except in compliance with the License. 6d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein * You may obtain a copy of the License at 7d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein * 8d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein * http://www.apache.org/licenses/LICENSE-2.0 9d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein * 10d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein * Unless required by applicable law or agreed to in writing, software 11d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein * distributed under the License is distributed on an "AS IS" BASIS, 12d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein * See the License for the specific language governing permissions and 14d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein * limitations under the License. 15d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein */ 16d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein 17d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzsteinpackage com.example.bitmapsample; 18d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein 19d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzsteinimport com.android.bitmap.RequestKey; 20d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein 21d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzsteinimport java.io.IOException; 22d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzsteinimport java.io.InputStream; 23d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzsteinimport java.net.MalformedURLException; 24d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzsteinimport java.net.URL; 25d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein 26d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzsteinpublic class BitmapRequestKeyImpl implements RequestKey { 27d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein public final String mUriString; 28d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein public final URL mUrl; 29d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein 302e4d0863dba53435372ec96538f2ef3e1c3675bfMark Wei private boolean mSlept; 312e4d0863dba53435372ec96538f2ef3e1c3675bfMark Wei 32d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein public BitmapRequestKeyImpl(String uriString) { 33d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein mUriString = uriString; 34d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein URL url = null; 35d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein try { 36d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein url = new URL(uriString); 37d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein } catch (MalformedURLException e) { 38d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein e.printStackTrace(); 39d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein } 40d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein mUrl = url; 412e4d0863dba53435372ec96538f2ef3e1c3675bfMark Wei mSlept = false; 42d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein } 43d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein 44d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein @Override 45d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein public boolean equals(Object o) { 46d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein if (o == null || !(o instanceof BitmapRequestKeyImpl)) { 47d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein return false; 48d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein } 49d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein final BitmapRequestKeyImpl other = (BitmapRequestKeyImpl) o; 50d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein return mUriString.equals(other.mUriString); 51d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein } 52d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein 53d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein @Override 54d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein public int hashCode() { 55d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein int hash = 17; 56d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein hash += 31 * hash + mUriString.hashCode(); 57d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein return hash; 58d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein } 59d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein 60d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein @Override 61d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein public String toString() { 62d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein final StringBuilder sb = new StringBuilder("["); 63d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein sb.append(mUriString); 64d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein sb.append("]"); 65d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein return sb.toString(); 66d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein } 67d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein 68d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein @Override 699c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei public Cancelable createFileDescriptorFactoryAsync(final RequestKey key, 709c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei final Callback callback) { 71d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein return null; 72d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein } 73d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein 74d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein @Override 75d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein public InputStream createInputStream() throws IOException { 762e4d0863dba53435372ec96538f2ef3e1c3675bfMark Wei // Artificially sleep for (deterministically) random amount of time. 772e4d0863dba53435372ec96538f2ef3e1c3675bfMark Wei if (!mSlept) { 782e4d0863dba53435372ec96538f2ef3e1c3675bfMark Wei // Character difference between shortest and longest uri. 792e4d0863dba53435372ec96538f2ef3e1c3675bfMark Wei final long spread = 26; 802e4d0863dba53435372ec96538f2ef3e1c3675bfMark Wei // Maximum amount of time to sleep. 815030ae34cd5978a8ab8a06f6c3b69b8645873122Mark Wei final long max = 3; 822e4d0863dba53435372ec96538f2ef3e1c3675bfMark Wei final long duration = (long) ((float) (mUriString.length() % spread) / spread * max 832e4d0863dba53435372ec96538f2ef3e1c3675bfMark Wei * 1000); 842e4d0863dba53435372ec96538f2ef3e1c3675bfMark Wei try { 852e4d0863dba53435372ec96538f2ef3e1c3675bfMark Wei Thread.sleep(duration); 862e4d0863dba53435372ec96538f2ef3e1c3675bfMark Wei } catch (InterruptedException ignored) { 872e4d0863dba53435372ec96538f2ef3e1c3675bfMark Wei } 882e4d0863dba53435372ec96538f2ef3e1c3675bfMark Wei mSlept = true; 892e4d0863dba53435372ec96538f2ef3e1c3675bfMark Wei } 90d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein return mUrl.openStream(); 91d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein } 92d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein 93d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein @Override 94d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein public boolean hasOrientationExif() throws IOException { 95d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein return false; 96d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein } 97d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein 98d2e1718fa8e1199b03dc0d069711b24e946aa858Sam Blitzstein}