From b19edd2fbfe3d177083de8941fbd86990d3d4cff Mon Sep 17 00:00:00 2001 From: Jacques Foucry Date: Mon, 6 Jun 2016 11:46:10 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20des=20=C3=A9l=C3=A9ments=20n=C3=A9cessa?= =?UTF-8?q?ire=20=C3=A0=20ZXing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 - app/libs/android-core-3.2.2-SNAPSHOT.jar | Bin 0 -> 11493 bytes app/libs/core-3.2.2-SNAPSHOT.jar | Bin 0 -> 548485 bytes app/src/main/AndroidManifest.xml | 16 + .../client/android/AmbientLightManager.java | 86 ++ .../zxing/client/android/BeepManager.java | 132 +++ .../zxing/client/android/CaptureActivity.java | 769 ++++++++++++++++++ .../android/CaptureActivityHandler.java | 167 ++++ .../google/zxing/client/android/Contents.java | 115 +++ .../client/android/DecodeFormatManager.java | 105 +++ .../zxing/client/android/DecodeHandler.java | 123 +++ .../client/android/DecodeHintManager.java | 236 ++++++ .../zxing/client/android/DecodeThread.java | 113 +++ .../zxing/client/android/FinishListener.java | 49 ++ .../zxing/client/android/HelpActivity.java | 66 ++ .../zxing/client/android/HttpHelper.java | 228 ++++++ .../zxing/client/android/InactivityTimer.java | 116 +++ .../zxing/client/android/IntentSource.java | 26 + .../google/zxing/client/android/Intents.java | 278 +++++++ .../zxing/client/android/LocaleManager.java | 188 +++++ .../client/android/PreferencesActivity.java | 72 ++ .../client/android/PreferencesFragment.java | 128 +++ .../android/ScanFromWebPageManager.java | 76 ++ .../ViewfinderResultPointCallback.java | 35 + .../zxing/client/android/ViewfinderView.java | 192 +++++ .../android/book/BrowseBookListener.java | 61 ++ .../book/SearchBookContentsActivity.java | 274 +++++++ .../book/SearchBookContentsAdapter.java | 59 ++ .../book/SearchBookContentsListItem.java | 84 ++ .../book/SearchBookContentsResult.java | 66 ++ .../android/camera/AutoFocusManager.java | 132 +++ .../camera/CameraConfigurationManager.java | 251 ++++++ .../client/android/camera/CameraManager.java | 332 ++++++++ .../client/android/camera/FrontLightMode.java | 42 + .../android/camera/PreviewCallback.java | 56 ++ .../android/camera/open/CameraFacing.java | 24 + .../android/camera/open/OpenCamera.java | 52 ++ .../camera/open/OpenCameraInterface.java | 95 +++ .../android/clipboard/ClipboardInterface.java | 58 ++ .../client/android/encode/ContactEncoder.java | 96 +++ .../client/android/encode/EncodeActivity.java | 243 ++++++ .../client/android/encode/Formatter.java | 33 + .../android/encode/MECARDContactEncoder.java | 97 +++ .../client/android/encode/QRCodeEncoder.java | 390 +++++++++ .../android/encode/VCardContactEncoder.java | 155 ++++ .../android/encode/VCardFieldFormatter.java | 79 ++ .../encode/VCardTelDisplayFormatter.java | 73 ++ .../client/android/history/DBHelper.java | 60 ++ .../android/history/HistoryActivity.java | 163 ++++ .../client/android/history/HistoryItem.java | 50 ++ .../android/history/HistoryItemAdapter.java | 71 ++ .../android/history/HistoryManager.java | 366 +++++++++ .../result/AddressBookResultHandler.java | 221 +++++ .../android/result/CalendarResultHandler.java | 187 +++++ .../result/EmailAddressResultHandler.java | 72 ++ .../android/result/GeoResultHandler.java | 68 ++ .../android/result/ISBNResultHandler.java | 77 ++ .../android/result/ProductResultHandler.java | 84 ++ .../android/result/ResultButtonListener.java | 40 + .../client/android/result/ResultHandler.java | 516 ++++++++++++ .../android/result/ResultHandlerFactory.java | 64 ++ .../android/result/SMSResultHandler.java | 86 ++ .../android/result/TelResultHandler.java | 82 ++ .../android/result/TextResultHandler.java | 77 ++ .../android/result/URIResultHandler.java | 106 +++ .../android/result/WifiResultHandler.java | 93 +++ .../supplement/BookResultInfoRetriever.java | 107 +++ .../ProductResultInfoRetriever.java | 84 ++ .../supplement/SupplementalInfoRetriever.java | 181 +++++ .../result/supplement/TitleRetriever.java | 70 ++ .../supplement/URIResultInfoRetriever.java | 65 ++ .../zxing/client/android/share/AppInfo.java | 65 ++ .../android/share/AppPickerActivity.java | 64 ++ .../client/android/share/BookmarkAdapter.java | 82 ++ .../android/share/BookmarkPickerActivity.java | 86 ++ .../android/share/LoadPackagesAsyncTask.java | 114 +++ .../client/android/share/ShareActivity.java | 306 +++++++ .../client/android/wifi/NetworkType.java | 41 + .../android/wifi/WifiConfigManager.java | 226 +++++ .../pilldroid/MedicamentListActivity.java | 41 +- .../main/res/drawable/share_via_barcode.png | Bin 0 -> 3207 bytes .../res/layout/activity_medicament_list.xml | 1 + .../main/res/layout/app_picker_list_item.xml | 38 + .../res/layout/bookmark_picker_list_item.xml | 38 + app/src/main/res/layout/capture.xml | 204 +++++ app/src/main/res/layout/encode.xml | 53 ++ app/src/main/res/layout/help.xml | 21 + app/src/main/res/layout/history_list_item.xml | 38 + .../main/res/layout/search_book_contents.xml | 54 ++ .../layout/search_book_contents_header.xml | 24 + .../layout/search_book_contents_list_item.xml | 40 + app/src/main/res/layout/share.xml | 95 +++ app/src/main/res/menu/capture.xml | 38 + app/src/main/res/menu/encode.xml | 28 + app/src/main/res/menu/history.xml | 28 + app/src/main/res/raw/beep.ogg | Bin 0 -> 6401 bytes app/src/main/res/values/arrays.xml | 62 ++ app/src/main/res/values/colors.xml | 11 + app/src/main/res/values/dimens.xml | 5 + app/src/main/res/values/ids.xml | 25 + app/src/main/res/values/strings.xml | 124 +++ app/src/main/res/values/styles.xml | 10 +- app/src/main/res/xml/preferences.xml | 135 +++ 103 files changed, 11144 insertions(+), 15 deletions(-) create mode 100644 app/libs/android-core-3.2.2-SNAPSHOT.jar create mode 100644 app/libs/core-3.2.2-SNAPSHOT.jar create mode 100644 app/src/main/java/com/google/zxing/client/android/AmbientLightManager.java create mode 100644 app/src/main/java/com/google/zxing/client/android/BeepManager.java create mode 100644 app/src/main/java/com/google/zxing/client/android/CaptureActivity.java create mode 100644 app/src/main/java/com/google/zxing/client/android/CaptureActivityHandler.java create mode 100644 app/src/main/java/com/google/zxing/client/android/Contents.java create mode 100644 app/src/main/java/com/google/zxing/client/android/DecodeFormatManager.java create mode 100644 app/src/main/java/com/google/zxing/client/android/DecodeHandler.java create mode 100644 app/src/main/java/com/google/zxing/client/android/DecodeHintManager.java create mode 100644 app/src/main/java/com/google/zxing/client/android/DecodeThread.java create mode 100644 app/src/main/java/com/google/zxing/client/android/FinishListener.java create mode 100644 app/src/main/java/com/google/zxing/client/android/HelpActivity.java create mode 100644 app/src/main/java/com/google/zxing/client/android/HttpHelper.java create mode 100644 app/src/main/java/com/google/zxing/client/android/InactivityTimer.java create mode 100644 app/src/main/java/com/google/zxing/client/android/IntentSource.java create mode 100644 app/src/main/java/com/google/zxing/client/android/Intents.java create mode 100644 app/src/main/java/com/google/zxing/client/android/LocaleManager.java create mode 100644 app/src/main/java/com/google/zxing/client/android/PreferencesActivity.java create mode 100644 app/src/main/java/com/google/zxing/client/android/PreferencesFragment.java create mode 100644 app/src/main/java/com/google/zxing/client/android/ScanFromWebPageManager.java create mode 100644 app/src/main/java/com/google/zxing/client/android/ViewfinderResultPointCallback.java create mode 100644 app/src/main/java/com/google/zxing/client/android/ViewfinderView.java create mode 100644 app/src/main/java/com/google/zxing/client/android/book/BrowseBookListener.java create mode 100644 app/src/main/java/com/google/zxing/client/android/book/SearchBookContentsActivity.java create mode 100644 app/src/main/java/com/google/zxing/client/android/book/SearchBookContentsAdapter.java create mode 100644 app/src/main/java/com/google/zxing/client/android/book/SearchBookContentsListItem.java create mode 100644 app/src/main/java/com/google/zxing/client/android/book/SearchBookContentsResult.java create mode 100644 app/src/main/java/com/google/zxing/client/android/camera/AutoFocusManager.java create mode 100644 app/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationManager.java create mode 100644 app/src/main/java/com/google/zxing/client/android/camera/CameraManager.java create mode 100644 app/src/main/java/com/google/zxing/client/android/camera/FrontLightMode.java create mode 100644 app/src/main/java/com/google/zxing/client/android/camera/PreviewCallback.java create mode 100644 app/src/main/java/com/google/zxing/client/android/camera/open/CameraFacing.java create mode 100644 app/src/main/java/com/google/zxing/client/android/camera/open/OpenCamera.java create mode 100644 app/src/main/java/com/google/zxing/client/android/camera/open/OpenCameraInterface.java create mode 100644 app/src/main/java/com/google/zxing/client/android/clipboard/ClipboardInterface.java create mode 100644 app/src/main/java/com/google/zxing/client/android/encode/ContactEncoder.java create mode 100644 app/src/main/java/com/google/zxing/client/android/encode/EncodeActivity.java create mode 100644 app/src/main/java/com/google/zxing/client/android/encode/Formatter.java create mode 100644 app/src/main/java/com/google/zxing/client/android/encode/MECARDContactEncoder.java create mode 100644 app/src/main/java/com/google/zxing/client/android/encode/QRCodeEncoder.java create mode 100644 app/src/main/java/com/google/zxing/client/android/encode/VCardContactEncoder.java create mode 100644 app/src/main/java/com/google/zxing/client/android/encode/VCardFieldFormatter.java create mode 100644 app/src/main/java/com/google/zxing/client/android/encode/VCardTelDisplayFormatter.java create mode 100644 app/src/main/java/com/google/zxing/client/android/history/DBHelper.java create mode 100644 app/src/main/java/com/google/zxing/client/android/history/HistoryActivity.java create mode 100644 app/src/main/java/com/google/zxing/client/android/history/HistoryItem.java create mode 100644 app/src/main/java/com/google/zxing/client/android/history/HistoryItemAdapter.java create mode 100644 app/src/main/java/com/google/zxing/client/android/history/HistoryManager.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/AddressBookResultHandler.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/CalendarResultHandler.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/EmailAddressResultHandler.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/GeoResultHandler.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/ISBNResultHandler.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/ProductResultHandler.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/ResultButtonListener.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/ResultHandler.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/ResultHandlerFactory.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/SMSResultHandler.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/TelResultHandler.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/TextResultHandler.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/URIResultHandler.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/WifiResultHandler.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/supplement/BookResultInfoRetriever.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/supplement/ProductResultInfoRetriever.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/supplement/SupplementalInfoRetriever.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/supplement/TitleRetriever.java create mode 100644 app/src/main/java/com/google/zxing/client/android/result/supplement/URIResultInfoRetriever.java create mode 100644 app/src/main/java/com/google/zxing/client/android/share/AppInfo.java create mode 100644 app/src/main/java/com/google/zxing/client/android/share/AppPickerActivity.java create mode 100644 app/src/main/java/com/google/zxing/client/android/share/BookmarkAdapter.java create mode 100644 app/src/main/java/com/google/zxing/client/android/share/BookmarkPickerActivity.java create mode 100644 app/src/main/java/com/google/zxing/client/android/share/LoadPackagesAsyncTask.java create mode 100644 app/src/main/java/com/google/zxing/client/android/share/ShareActivity.java create mode 100644 app/src/main/java/com/google/zxing/client/android/wifi/NetworkType.java create mode 100644 app/src/main/java/com/google/zxing/client/android/wifi/WifiConfigManager.java create mode 100644 app/src/main/res/drawable/share_via_barcode.png create mode 100644 app/src/main/res/layout/app_picker_list_item.xml create mode 100644 app/src/main/res/layout/bookmark_picker_list_item.xml create mode 100644 app/src/main/res/layout/capture.xml create mode 100644 app/src/main/res/layout/encode.xml create mode 100644 app/src/main/res/layout/help.xml create mode 100644 app/src/main/res/layout/history_list_item.xml create mode 100644 app/src/main/res/layout/search_book_contents.xml create mode 100644 app/src/main/res/layout/search_book_contents_header.xml create mode 100644 app/src/main/res/layout/search_book_contents_list_item.xml create mode 100644 app/src/main/res/layout/share.xml create mode 100644 app/src/main/res/menu/capture.xml create mode 100644 app/src/main/res/menu/encode.xml create mode 100644 app/src/main/res/menu/history.xml create mode 100644 app/src/main/res/raw/beep.ogg create mode 100644 app/src/main/res/values/arrays.xml create mode 100644 app/src/main/res/values/ids.xml create mode 100644 app/src/main/res/xml/preferences.xml diff --git a/app/build.gradle b/app/build.gradle index 94c7b8a..c258254 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,8 +33,4 @@ dependencies { compile 'com.android.support:support-v4:23.3.0' compile 'com.android.support:recyclerview-v7:23.3.0' compile 'com.android.support:design:23.3.0' - compile 'com.embarkmobile:zxing-android-minimal:2.0@aar' - compile 'com.embarkmobile:zxing-android-legacy:2.0.0@aar' - compile 'com.embarkmobile:zxing-android-integration:2.0.0@aar' - compile 'com.google.zxing:core:3.0.1' } diff --git a/app/libs/android-core-3.2.2-SNAPSHOT.jar b/app/libs/android-core-3.2.2-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..503f817c053daed0163a3a58b41601a0d7a7f3df GIT binary patch literal 11493 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

%yan311(RUIKcO~Zds?4fhcDmX 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�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 z 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

APZEOqK&^k`*FTXgfC4Bi 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

hMabr@Oir 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

hx}OCMIgI{NUOBs=}MMcF_3=uOe1d`-7X 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

|pp`Hlx9c(!WRKNZhkHn~C9vQVAU(Bqx+`Sc@C^ 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 DQ$6)x literal 0 HcmV?d00001 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5113f17..2580491 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/google/zxing/client/android/AmbientLightManager.java b/app/src/main/java/com/google/zxing/client/android/AmbientLightManager.java new file mode 100644 index 0000000..2074265 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/AmbientLightManager.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import android.content.Context; +import android.content.SharedPreferences; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.preference.PreferenceManager; +import com.google.zxing.client.android.camera.CameraManager; +import com.google.zxing.client.android.camera.FrontLightMode; + +/** + * Detects ambient light and switches on the front light when very dark, and off again when sufficiently light. + * + * @author Sean Owen + * @author Nikolaus Huber + */ +final class AmbientLightManager implements SensorEventListener { + + private static final float TOO_DARK_LUX = 45.0f; + private static final float BRIGHT_ENOUGH_LUX = 450.0f; + + private final Context context; + private CameraManager cameraManager; + private Sensor lightSensor; + + AmbientLightManager(Context context) { + this.context = context; + } + + void start(CameraManager cameraManager) { + this.cameraManager = cameraManager; + SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); + if (FrontLightMode.readPref(sharedPrefs) == FrontLightMode.AUTO) { + SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); + lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); + if (lightSensor != null) { + sensorManager.registerListener(this, lightSensor, SensorManager.SENSOR_DELAY_NORMAL); + } + } + } + + void stop() { + if (lightSensor != null) { + SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); + sensorManager.unregisterListener(this); + cameraManager = null; + lightSensor = null; + } + } + + @Override + public void onSensorChanged(SensorEvent sensorEvent) { + float ambientLightLux = sensorEvent.values[0]; + if (cameraManager != null) { + if (ambientLightLux <= TOO_DARK_LUX) { + cameraManager.setTorch(true); + } else if (ambientLightLux >= BRIGHT_ENOUGH_LUX) { + cameraManager.setTorch(false); + } + } + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + // do nothing + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/BeepManager.java b/app/src/main/java/com/google/zxing/client/android/BeepManager.java new file mode 100644 index 0000000..f4f2e58 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/BeepManager.java @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.AssetFileDescriptor; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.os.Vibrator; +import android.preference.PreferenceManager; +import android.util.Log; + +import net.foucry.pilldroid.R; + +import java.io.Closeable; +import java.io.IOException; + +/** + * Manages beeps and vibrations for {@link CaptureActivity}. + */ +final class BeepManager implements MediaPlayer.OnErrorListener, Closeable { + + private static final String TAG = BeepManager.class.getSimpleName(); + + private static final float BEEP_VOLUME = 0.10f; + private static final long VIBRATE_DURATION = 200L; + + private final Activity activity; + private MediaPlayer mediaPlayer; + private boolean playBeep; + private boolean vibrate; + + BeepManager(Activity activity) { + this.activity = activity; + this.mediaPlayer = null; + updatePrefs(); + } + + synchronized void updatePrefs() { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); + playBeep = shouldBeep(prefs, activity); + vibrate = prefs.getBoolean(PreferencesActivity.KEY_VIBRATE, false); + if (playBeep && mediaPlayer == null) { + // The volume on STREAM_SYSTEM is not adjustable, and users found it too loud, + // so we now play on the music stream. + activity.setVolumeControlStream(AudioManager.STREAM_MUSIC); + mediaPlayer = buildMediaPlayer(activity); + } + } + + synchronized void playBeepSoundAndVibrate() { + if (playBeep && mediaPlayer != null) { + mediaPlayer.start(); + } + if (vibrate) { + Vibrator vibrator = (Vibrator) activity.getSystemService(Context.VIBRATOR_SERVICE); + vibrator.vibrate(VIBRATE_DURATION); + } + } + + private static boolean shouldBeep(SharedPreferences prefs, Context activity) { + boolean shouldPlayBeep = prefs.getBoolean(PreferencesActivity.KEY_PLAY_BEEP, true); + if (shouldPlayBeep) { + // See if sound settings overrides this + AudioManager audioService = (AudioManager) activity.getSystemService(Context.AUDIO_SERVICE); + if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) { + shouldPlayBeep = false; + } + } + return shouldPlayBeep; + } + + private MediaPlayer buildMediaPlayer(Context activity) { + MediaPlayer mediaPlayer = new MediaPlayer(); + try { + AssetFileDescriptor file = activity.getResources().openRawResourceFd(R.raw.beep); + try { + mediaPlayer.setDataSource(file.getFileDescriptor(), file.getStartOffset(), file.getLength()); + } finally { + file.close(); + } + mediaPlayer.setOnErrorListener(this); + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + mediaPlayer.setLooping(false); + mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME); + mediaPlayer.prepare(); + return mediaPlayer; + } catch (IOException ioe) { + Log.w(TAG, ioe); + mediaPlayer.release(); + return null; + } + } + + @Override + public synchronized boolean onError(MediaPlayer mp, int what, int extra) { + if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) { + // we are finished, so put up an appropriate error toast if required and finish + activity.finish(); + } else { + // possibly media player error, so release and recreate + close(); + updatePrefs(); + } + return true; + } + + @Override + public synchronized void close() { + if (mediaPlayer != null) { + mediaPlayer.release(); + mediaPlayer = null; + } + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/CaptureActivity.java b/app/src/main/java/com/google/zxing/client/android/CaptureActivity.java new file mode 100644 index 0000000..2263eb2 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/CaptureActivity.java @@ -0,0 +1,769 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.DecodeHintType; +import com.google.zxing.Result; +import com.google.zxing.ResultMetadataType; +import com.google.zxing.ResultPoint; +import com.google.zxing.client.android.camera.CameraManager; +import com.google.zxing.client.android.clipboard.ClipboardInterface; +import com.google.zxing.client.android.history.HistoryActivity; +import com.google.zxing.client.android.history.HistoryItem; +import com.google.zxing.client.android.history.HistoryManager; +import com.google.zxing.client.android.result.ResultButtonListener; +import com.google.zxing.client.android.result.ResultHandler; +import com.google.zxing.client.android.result.ResultHandlerFactory; +import com.google.zxing.client.android.result.supplement.SupplementalInfoRetriever; +import com.google.zxing.client.android.share.ShareActivity; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.ActivityInfo; +import android.content.res.Configuration; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.preference.PreferenceManager; +import android.util.Log; +import android.util.TypedValue; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.Surface; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import net.foucry.pilldroid.R; + +import java.io.IOException; +import java.text.DateFormat; +import java.util.Collection; +import java.util.Date; +import java.util.EnumSet; +import java.util.Map; + +/** + * This activity opens the camera and does the actual scanning on a background thread. It draws a + * viewfinder to help the user place the barcode correctly, shows feedback as the image processing + * is happening, and then overlays the results when a scan is successful. + * + * @author dswitkin@google.com (Daniel Switkin) + * @author Sean Owen + */ +public final class CaptureActivity extends Activity implements SurfaceHolder.Callback { + + private static final String TAG = CaptureActivity.class.getSimpleName(); + + private static final long DEFAULT_INTENT_RESULT_DURATION_MS = 1500L; + private static final long BULK_MODE_SCAN_DELAY_MS = 1000L; + + private static final String[] ZXING_URLS = { "http://zxing.appspot.com/scan", "zxing://scan/" }; + + public static final int HISTORY_REQUEST_CODE = 0x0000bacc; + + private static final Collection DISPLAYABLE_METADATA_TYPES = + EnumSet.of(ResultMetadataType.ISSUE_NUMBER, + ResultMetadataType.SUGGESTED_PRICE, + ResultMetadataType.ERROR_CORRECTION_LEVEL, + ResultMetadataType.POSSIBLE_COUNTRY); + + private CameraManager cameraManager; + private CaptureActivityHandler handler; + private Result savedResultToShow; + private ViewfinderView viewfinderView; + private TextView statusView; + private View resultView; + private Result lastResult; + private boolean hasSurface; + private boolean copyToClipboard; + private IntentSource source; + private String sourceUrl; + private ScanFromWebPageManager scanFromWebPageManager; + private Collection decodeFormats; + private Map decodeHints; + private String characterSet; + private HistoryManager historyManager; + private InactivityTimer inactivityTimer; + private BeepManager beepManager; + private AmbientLightManager ambientLightManager; + + ViewfinderView getViewfinderView() { + return viewfinderView; + } + + public Handler getHandler() { + return handler; + } + + CameraManager getCameraManager() { + return cameraManager; + } + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + Window window = getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + setContentView(R.layout.capture); + + hasSurface = false; + inactivityTimer = new InactivityTimer(this); + beepManager = new BeepManager(this); + ambientLightManager = new AmbientLightManager(this); + + PreferenceManager.setDefaultValues(this, R.xml.preferences, false); + } + + @Override + protected void onResume() { + super.onResume(); + + // historyManager must be initialized here to update the history preference + historyManager = new HistoryManager(this); + historyManager.trimHistory(); + + // CameraManager must be initialized here, not in onCreate(). This is necessary because we don't + // want to open the camera driver and measure the screen size if we're going to show the help on + // first launch. That led to bugs where the scanning rectangle was the wrong size and partially + // off screen. + cameraManager = new CameraManager(getApplication()); + + viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view); + viewfinderView.setCameraManager(cameraManager); + + resultView = findViewById(R.id.result_view); + statusView = (TextView) findViewById(R.id.status_view); + + handler = null; + lastResult = null; + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + + if (prefs.getBoolean(PreferencesActivity.KEY_DISABLE_AUTO_ORIENTATION, true)) { + setRequestedOrientation(getCurrentOrientation()); + } else { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); + } + + resetStatusView(); + + + beepManager.updatePrefs(); + ambientLightManager.start(cameraManager); + + inactivityTimer.onResume(); + + Intent intent = getIntent(); + + copyToClipboard = prefs.getBoolean(PreferencesActivity.KEY_COPY_TO_CLIPBOARD, true) + && (intent == null || intent.getBooleanExtra(Intents.Scan.SAVE_HISTORY, true)); + + source = IntentSource.NONE; + sourceUrl = null; + scanFromWebPageManager = null; + decodeFormats = null; + characterSet = null; + + if (intent != null) { + + String action = intent.getAction(); + String dataString = intent.getDataString(); + + if (Intents.Scan.ACTION.equals(action)) { + + // Scan the formats the intent requested, and return the result to the calling activity. + source = IntentSource.NATIVE_APP_INTENT; + decodeFormats = DecodeFormatManager.parseDecodeFormats(intent); + decodeHints = DecodeHintManager.parseDecodeHints(intent); + + if (intent.hasExtra(Intents.Scan.WIDTH) && intent.hasExtra(Intents.Scan.HEIGHT)) { + int width = intent.getIntExtra(Intents.Scan.WIDTH, 0); + int height = intent.getIntExtra(Intents.Scan.HEIGHT, 0); + if (width > 0 && height > 0) { + cameraManager.setManualFramingRect(width, height); + } + } + + if (intent.hasExtra(Intents.Scan.CAMERA_ID)) { + int cameraId = intent.getIntExtra(Intents.Scan.CAMERA_ID, -1); + if (cameraId >= 0) { + cameraManager.setManualCameraId(cameraId); + } + } + + String customPromptMessage = intent.getStringExtra(Intents.Scan.PROMPT_MESSAGE); + if (customPromptMessage != null) { + statusView.setText(customPromptMessage); + } + + } else if (dataString != null && + dataString.contains("http://www.google") && + dataString.contains("/m/products/scan")) { + + // Scan only products and send the result to mobile Product Search. + source = IntentSource.PRODUCT_SEARCH_LINK; + sourceUrl = dataString; + decodeFormats = DecodeFormatManager.PRODUCT_FORMATS; + + } else if (isZXingURL(dataString)) { + + // Scan formats requested in query string (all formats if none specified). + // If a return URL is specified, send the results there. Otherwise, handle it ourselves. + source = IntentSource.ZXING_LINK; + sourceUrl = dataString; + Uri inputUri = Uri.parse(dataString); + scanFromWebPageManager = new ScanFromWebPageManager(inputUri); + decodeFormats = DecodeFormatManager.parseDecodeFormats(inputUri); + // Allow a sub-set of the hints to be specified by the caller. + decodeHints = DecodeHintManager.parseDecodeHints(inputUri); + + } + + characterSet = intent.getStringExtra(Intents.Scan.CHARACTER_SET); + + } + + SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view); + SurfaceHolder surfaceHolder = surfaceView.getHolder(); + if (hasSurface) { + // The activity was paused but not stopped, so the surface still exists. Therefore + // surfaceCreated() won't be called, so init the camera here. + initCamera(surfaceHolder); + } else { + // Install the callback and wait for surfaceCreated() to init the camera. + surfaceHolder.addCallback(this); + } + } + + private int getCurrentOrientation() { + int rotation = getWindowManager().getDefaultDisplay().getRotation(); + if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + switch (rotation) { + case Surface.ROTATION_0: + case Surface.ROTATION_90: + return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; + default: + return ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; + } + } else { + switch (rotation) { + case Surface.ROTATION_0: + case Surface.ROTATION_270: + return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; + default: + return ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; + } + } + } + + private static boolean isZXingURL(String dataString) { + if (dataString == null) { + return false; + } + for (String url : ZXING_URLS) { + if (dataString.startsWith(url)) { + return true; + } + } + return false; + } + + @Override + protected void onPause() { + if (handler != null) { + handler.quitSynchronously(); + handler = null; + } + inactivityTimer.onPause(); + ambientLightManager.stop(); + beepManager.close(); + cameraManager.closeDriver(); + //historyManager = null; // Keep for onActivityResult + if (!hasSurface) { + SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view); + SurfaceHolder surfaceHolder = surfaceView.getHolder(); + surfaceHolder.removeCallback(this); + } + super.onPause(); + } + + @Override + protected void onDestroy() { + inactivityTimer.shutdown(); + super.onDestroy(); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + switch (keyCode) { + case KeyEvent.KEYCODE_BACK: + if (source == IntentSource.NATIVE_APP_INTENT) { + setResult(RESULT_CANCELED); + finish(); + return true; + } + if ((source == IntentSource.NONE || source == IntentSource.ZXING_LINK) && lastResult != null) { + restartPreviewAfterDelay(0L); + return true; + } + break; + case KeyEvent.KEYCODE_FOCUS: + case KeyEvent.KEYCODE_CAMERA: + // Handle these events so they don't launch the Camera app + return true; + // Use volume up/down to turn on light + case KeyEvent.KEYCODE_VOLUME_DOWN: + cameraManager.setTorch(false); + return true; + case KeyEvent.KEYCODE_VOLUME_UP: + cameraManager.setTorch(true); + return true; + } + return super.onKeyDown(keyCode, event); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater menuInflater = getMenuInflater(); + menuInflater.inflate(R.menu.capture, menu); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + switch (item.getItemId()) { + case R.id.menu_share: + intent.setClassName(this, ShareActivity.class.getName()); + startActivity(intent); + break; + case R.id.menu_history: + intent.setClassName(this, HistoryActivity.class.getName()); + startActivityForResult(intent, HISTORY_REQUEST_CODE); + break; + case R.id.menu_settings: + intent.setClassName(this, PreferencesActivity.class.getName()); + startActivity(intent); + break; + case R.id.menu_help: + intent.setClassName(this, HelpActivity.class.getName()); + startActivity(intent); + break; + default: + return super.onOptionsItemSelected(item); + } + return true; + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent intent) { + if (resultCode == RESULT_OK && requestCode == HISTORY_REQUEST_CODE && historyManager != null) { + int itemNumber = intent.getIntExtra(Intents.History.ITEM_NUMBER, -1); + if (itemNumber >= 0) { + HistoryItem historyItem = historyManager.buildHistoryItem(itemNumber); + decodeOrStoreSavedBitmap(null, historyItem.getResult()); + } + } + } + + private void decodeOrStoreSavedBitmap(Bitmap bitmap, Result result) { + // Bitmap isn't used yet -- will be used soon + if (handler == null) { + savedResultToShow = result; + } else { + if (result != null) { + savedResultToShow = result; + } + if (savedResultToShow != null) { + Message message = Message.obtain(handler, R.id.decode_succeeded, savedResultToShow); + handler.sendMessage(message); + } + savedResultToShow = null; + } + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + if (holder == null) { + Log.e(TAG, "*** WARNING *** surfaceCreated() gave us a null surface!"); + } + if (!hasSurface) { + hasSurface = true; + initCamera(holder); + } + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + hasSurface = false; + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + + } + + /** + * A valid barcode has been found, so give an indication of success and show the results. + * + * @param rawResult The contents of the barcode. + * @param scaleFactor amount by which thumbnail was scaled + * @param barcode A greyscale bitmap of the camera data which was decoded. + */ + public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) { + inactivityTimer.onActivity(); + lastResult = rawResult; + ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler(this, rawResult); + + boolean fromLiveScan = barcode != null; + if (fromLiveScan) { + historyManager.addHistoryItem(rawResult, resultHandler); + // Then not from history, so beep/vibrate and we have an image to draw on + beepManager.playBeepSoundAndVibrate(); + drawResultPoints(barcode, scaleFactor, rawResult); + } + + switch (source) { + case NATIVE_APP_INTENT: + case PRODUCT_SEARCH_LINK: + handleDecodeExternally(rawResult, resultHandler, barcode); + break; + case ZXING_LINK: + if (scanFromWebPageManager == null || !scanFromWebPageManager.isScanFromWebPage()) { + handleDecodeInternally(rawResult, resultHandler, barcode); + } else { + handleDecodeExternally(rawResult, resultHandler, barcode); + } + break; + case NONE: + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + if (fromLiveScan && prefs.getBoolean(PreferencesActivity.KEY_BULK_MODE, false)) { + Toast.makeText(getApplicationContext(), + getResources().getString(R.string.msg_bulk_mode_scanned) + " (" + rawResult.getText() + ')', + Toast.LENGTH_SHORT).show(); + // Wait a moment or else it will scan the same barcode continuously about 3 times + restartPreviewAfterDelay(BULK_MODE_SCAN_DELAY_MS); + } else { + handleDecodeInternally(rawResult, resultHandler, barcode); + } + break; + } + } + + /** + * Superimpose a line for 1D or dots for 2D to highlight the key features of the barcode. + * + * @param barcode A bitmap of the captured image. + * @param scaleFactor amount by which thumbnail was scaled + * @param rawResult The decoded results which contains the points to draw. + */ + private void drawResultPoints(Bitmap barcode, float scaleFactor, Result rawResult) { + ResultPoint[] points = rawResult.getResultPoints(); + if (points != null && points.length > 0) { + Canvas canvas = new Canvas(barcode); + Paint paint = new Paint(); + paint.setColor(getResources().getColor(R.color.result_points)); + if (points.length == 2) { + paint.setStrokeWidth(4.0f); + drawLine(canvas, paint, points[0], points[1], scaleFactor); + } else if (points.length == 4 && + (rawResult.getBarcodeFormat() == BarcodeFormat.UPC_A || + rawResult.getBarcodeFormat() == BarcodeFormat.EAN_13)) { + // Hacky special case -- draw two lines, for the barcode and metadata + drawLine(canvas, paint, points[0], points[1], scaleFactor); + drawLine(canvas, paint, points[2], points[3], scaleFactor); + } else { + paint.setStrokeWidth(10.0f); + for (ResultPoint point : points) { + if (point != null) { + canvas.drawPoint(scaleFactor * point.getX(), scaleFactor * point.getY(), paint); + } + } + } + } + } + + private static void drawLine(Canvas canvas, Paint paint, ResultPoint a, ResultPoint b, float scaleFactor) { + if (a != null && b != null) { + canvas.drawLine(scaleFactor * a.getX(), + scaleFactor * a.getY(), + scaleFactor * b.getX(), + scaleFactor * b.getY(), + paint); + } + } + + // Put up our own UI for how to handle the decoded contents. + private void handleDecodeInternally(Result rawResult, ResultHandler resultHandler, Bitmap barcode) { + + CharSequence displayContents = resultHandler.getDisplayContents(); + + if (copyToClipboard && !resultHandler.areContentsSecure()) { + ClipboardInterface.setText(displayContents, this); + } + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + + if (resultHandler.getDefaultButtonID() != null && prefs.getBoolean(PreferencesActivity.KEY_AUTO_OPEN_WEB, false)) { + resultHandler.handleButtonPress(resultHandler.getDefaultButtonID()); + return; + } + + statusView.setVisibility(View.GONE); + viewfinderView.setVisibility(View.GONE); + resultView.setVisibility(View.VISIBLE); + + ImageView barcodeImageView = (ImageView) findViewById(R.id.barcode_image_view); + if (barcode == null) { + barcodeImageView.setImageBitmap(BitmapFactory.decodeResource(getResources(), + R.mipmap.ic_launcher)); + } else { + barcodeImageView.setImageBitmap(barcode); + } + + TextView formatTextView = (TextView) findViewById(R.id.format_text_view); + formatTextView.setText(rawResult.getBarcodeFormat().toString()); + + TextView typeTextView = (TextView) findViewById(R.id.type_text_view); + typeTextView.setText(resultHandler.getType().toString()); + + DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); + TextView timeTextView = (TextView) findViewById(R.id.time_text_view); + timeTextView.setText(formatter.format(new Date(rawResult.getTimestamp()))); + + + TextView metaTextView = (TextView) findViewById(R.id.meta_text_view); + View metaTextViewLabel = findViewById(R.id.meta_text_view_label); + metaTextView.setVisibility(View.GONE); + metaTextViewLabel.setVisibility(View.GONE); + Map metadata = rawResult.getResultMetadata(); + if (metadata != null) { + StringBuilder metadataText = new StringBuilder(20); + for (Map.Entry entry : metadata.entrySet()) { + if (DISPLAYABLE_METADATA_TYPES.contains(entry.getKey())) { + metadataText.append(entry.getValue()).append('\n'); + } + } + if (metadataText.length() > 0) { + metadataText.setLength(metadataText.length() - 1); + metaTextView.setText(metadataText); + metaTextView.setVisibility(View.VISIBLE); + metaTextViewLabel.setVisibility(View.VISIBLE); + } + } + + TextView contentsTextView = (TextView) findViewById(R.id.contents_text_view); + contentsTextView.setText(displayContents); + int scaledSize = Math.max(22, 32 - displayContents.length() / 4); + contentsTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, scaledSize); + + TextView supplementTextView = (TextView) findViewById(R.id.contents_supplement_text_view); + supplementTextView.setText(""); + supplementTextView.setOnClickListener(null); + if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean( + PreferencesActivity.KEY_SUPPLEMENTAL, true)) { + SupplementalInfoRetriever.maybeInvokeRetrieval(supplementTextView, + resultHandler.getResult(), + historyManager, + this); + } + + int buttonCount = resultHandler.getButtonCount(); + ViewGroup buttonView = (ViewGroup) findViewById(R.id.result_button_view); + buttonView.requestFocus(); + for (int x = 0; x < ResultHandler.MAX_BUTTON_COUNT; x++) { + TextView button = (TextView) buttonView.getChildAt(x); + if (x < buttonCount) { + button.setVisibility(View.VISIBLE); + button.setText(resultHandler.getButtonText(x)); + button.setOnClickListener(new ResultButtonListener(resultHandler, x)); + } else { + button.setVisibility(View.GONE); + } + } + + } + + // Briefly show the contents of the barcode, then handle the result outside Barcode Scanner. + private void handleDecodeExternally(Result rawResult, ResultHandler resultHandler, Bitmap barcode) { + + if (barcode != null) { + viewfinderView.drawResultBitmap(barcode); + } + + long resultDurationMS; + if (getIntent() == null) { + resultDurationMS = DEFAULT_INTENT_RESULT_DURATION_MS; + } else { + resultDurationMS = getIntent().getLongExtra(Intents.Scan.RESULT_DISPLAY_DURATION_MS, + DEFAULT_INTENT_RESULT_DURATION_MS); + } + + if (resultDurationMS > 0) { + String rawResultString = String.valueOf(rawResult); + if (rawResultString.length() > 32) { + rawResultString = rawResultString.substring(0, 32) + " ..."; + } + statusView.setText(getString(resultHandler.getDisplayTitle()) + " : " + rawResultString); + } + + if (copyToClipboard && !resultHandler.areContentsSecure()) { + CharSequence text = resultHandler.getDisplayContents(); + ClipboardInterface.setText(text, this); + } + + if (source == IntentSource.NATIVE_APP_INTENT) { + + // Hand back whatever action they requested - this can be changed to Intents.Scan.ACTION when + // the deprecated intent is retired. + Intent intent = new Intent(getIntent().getAction()); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + intent.putExtra(Intents.Scan.RESULT, rawResult.toString()); + intent.putExtra(Intents.Scan.RESULT_FORMAT, rawResult.getBarcodeFormat().toString()); + byte[] rawBytes = rawResult.getRawBytes(); + if (rawBytes != null && rawBytes.length > 0) { + intent.putExtra(Intents.Scan.RESULT_BYTES, rawBytes); + } + Map metadata = rawResult.getResultMetadata(); + if (metadata != null) { + if (metadata.containsKey(ResultMetadataType.UPC_EAN_EXTENSION)) { + intent.putExtra(Intents.Scan.RESULT_UPC_EAN_EXTENSION, + metadata.get(ResultMetadataType.UPC_EAN_EXTENSION).toString()); + } + Number orientation = (Number) metadata.get(ResultMetadataType.ORIENTATION); + if (orientation != null) { + intent.putExtra(Intents.Scan.RESULT_ORIENTATION, orientation.intValue()); + } + String ecLevel = (String) metadata.get(ResultMetadataType.ERROR_CORRECTION_LEVEL); + if (ecLevel != null) { + intent.putExtra(Intents.Scan.RESULT_ERROR_CORRECTION_LEVEL, ecLevel); + } + @SuppressWarnings("unchecked") + Iterable byteSegments = (Iterable) metadata.get(ResultMetadataType.BYTE_SEGMENTS); + if (byteSegments != null) { + int i = 0; + for (byte[] byteSegment : byteSegments) { + intent.putExtra(Intents.Scan.RESULT_BYTE_SEGMENTS_PREFIX + i, byteSegment); + i++; + } + } + } + sendReplyMessage(R.id.return_scan_result, intent, resultDurationMS); + + } else if (source == IntentSource.PRODUCT_SEARCH_LINK) { + + // Reformulate the URL which triggered us into a query, so that the request goes to the same + // TLD as the scan URL. + int end = sourceUrl.lastIndexOf("/scan"); + String replyURL = sourceUrl.substring(0, end) + "?q=" + resultHandler.getDisplayContents() + "&source=zxing"; + sendReplyMessage(R.id.launch_product_query, replyURL, resultDurationMS); + + } else if (source == IntentSource.ZXING_LINK) { + + if (scanFromWebPageManager != null && scanFromWebPageManager.isScanFromWebPage()) { + String replyURL = scanFromWebPageManager.buildReplyURL(rawResult, resultHandler); + scanFromWebPageManager = null; + sendReplyMessage(R.id.launch_product_query, replyURL, resultDurationMS); + } + + } + } + + private void sendReplyMessage(int id, Object arg, long delayMS) { + if (handler != null) { + Message message = Message.obtain(handler, id, arg); + if (delayMS > 0L) { + handler.sendMessageDelayed(message, delayMS); + } else { + handler.sendMessage(message); + } + } + } + + private void initCamera(SurfaceHolder surfaceHolder) { + if (surfaceHolder == null) { + throw new IllegalStateException("No SurfaceHolder provided"); + } + if (cameraManager.isOpen()) { + Log.w(TAG, "initCamera() while already open -- late SurfaceView callback?"); + return; + } + try { + cameraManager.openDriver(surfaceHolder); + // Creating the handler starts the preview, which can also throw a RuntimeException. + if (handler == null) { + handler = new CaptureActivityHandler(this, decodeFormats, decodeHints, characterSet, cameraManager); + } + decodeOrStoreSavedBitmap(null, null); + } catch (IOException ioe) { + Log.w(TAG, ioe); + displayFrameworkBugMessageAndExit(); + } catch (RuntimeException e) { + // Barcode Scanner has seen crashes in the wild of this variety: + // java.?lang.?RuntimeException: Fail to connect to camera service + Log.w(TAG, "Unexpected error initializing camera", e); + displayFrameworkBugMessageAndExit(); + } + } + + private void displayFrameworkBugMessageAndExit() { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(getString(R.string.app_name)); + builder.setMessage(getString(R.string.msg_camera_framework_bug)); + builder.setPositiveButton(R.string.button_ok, new FinishListener(this)); + builder.setOnCancelListener(new FinishListener(this)); + builder.show(); + } + + public void restartPreviewAfterDelay(long delayMS) { + if (handler != null) { + handler.sendEmptyMessageDelayed(R.id.restart_preview, delayMS); + } + resetStatusView(); + } + + private void resetStatusView() { + resultView.setVisibility(View.GONE); + statusView.setText(R.string.msg_default_status); + statusView.setVisibility(View.VISIBLE); + viewfinderView.setVisibility(View.VISIBLE); + lastResult = null; + } + + public void drawViewfinder() { + viewfinderView.drawViewfinder(); + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/CaptureActivityHandler.java b/app/src/main/java/com/google/zxing/client/android/CaptureActivityHandler.java new file mode 100644 index 0000000..c4698e6 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/CaptureActivityHandler.java @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import android.content.ActivityNotFoundException; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.graphics.BitmapFactory; +import android.provider.Browser; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.DecodeHintType; +import com.google.zxing.Result; +import com.google.zxing.client.android.camera.CameraManager; + +import net.foucry.pilldroid.R; + +import android.app.Activity; +import android.content.Intent; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.util.Log; + +import java.util.Collection; +import java.util.Map; + +/** + * This class handles all the messaging which comprises the state machine for capture. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class CaptureActivityHandler extends Handler { + + private static final String TAG = CaptureActivityHandler.class.getSimpleName(); + + private final CaptureActivity activity; + private final DecodeThread decodeThread; + private State state; + private final CameraManager cameraManager; + + private enum State { + PREVIEW, + SUCCESS, + DONE + } + + CaptureActivityHandler(CaptureActivity activity, + Collection decodeFormats, + Map baseHints, + String characterSet, + CameraManager cameraManager) { + this.activity = activity; + decodeThread = new DecodeThread(activity, decodeFormats, baseHints, characterSet, + new ViewfinderResultPointCallback(activity.getViewfinderView())); + decodeThread.start(); + state = State.SUCCESS; + + // Start ourselves capturing previews and decoding. + this.cameraManager = cameraManager; + cameraManager.startPreview(); + restartPreviewAndDecode(); + } + + @Override + public void handleMessage(Message message) { + switch (message.what) { + case R.id.restart_preview: + restartPreviewAndDecode(); + break; + case R.id.decode_succeeded: + state = State.SUCCESS; + Bundle bundle = message.getData(); + Bitmap barcode = null; + float scaleFactor = 1.0f; + if (bundle != null) { + byte[] compressedBitmap = bundle.getByteArray(DecodeThread.BARCODE_BITMAP); + if (compressedBitmap != null) { + barcode = BitmapFactory.decodeByteArray(compressedBitmap, 0, compressedBitmap.length, null); + // Mutable copy: + barcode = barcode.copy(Bitmap.Config.ARGB_8888, true); + } + scaleFactor = bundle.getFloat(DecodeThread.BARCODE_SCALED_FACTOR); + } + activity.handleDecode((Result) message.obj, barcode, scaleFactor); + break; + case R.id.decode_failed: + // We're decoding as fast as possible, so when one decode fails, start another. + state = State.PREVIEW; + cameraManager.requestPreviewFrame(decodeThread.getHandler(), R.id.decode); + break; + case R.id.return_scan_result: + activity.setResult(Activity.RESULT_OK, (Intent) message.obj); + activity.finish(); + break; + case R.id.launch_product_query: + String url = (String) message.obj; + + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + intent.setData(Uri.parse(url)); + + ResolveInfo resolveInfo = + activity.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); + String browserPackageName = null; + if (resolveInfo != null && resolveInfo.activityInfo != null) { + browserPackageName = resolveInfo.activityInfo.packageName; + Log.d(TAG, "Using browser in package " + browserPackageName); + } + + // Needed for default Android browser / Chrome only apparently + if ("com.android.browser".equals(browserPackageName) || "com.android.chrome".equals(browserPackageName)) { + intent.setPackage(browserPackageName); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra(Browser.EXTRA_APPLICATION_ID, browserPackageName); + } + + try { + activity.startActivity(intent); + } catch (ActivityNotFoundException ignored) { + Log.w(TAG, "Can't find anything to handle VIEW of URI " + url); + } + break; + } + } + + public void quitSynchronously() { + state = State.DONE; + cameraManager.stopPreview(); + Message quit = Message.obtain(decodeThread.getHandler(), R.id.quit); + quit.sendToTarget(); + try { + // Wait at most half a second; should be enough time, and onPause() will timeout quickly + decodeThread.join(500L); + } catch (InterruptedException e) { + // continue + } + + // Be absolutely sure we don't send any queued up messages + removeMessages(R.id.decode_succeeded); + removeMessages(R.id.decode_failed); + } + + private void restartPreviewAndDecode() { + if (state == State.SUCCESS) { + state = State.PREVIEW; + cameraManager.requestPreviewFrame(decodeThread.getHandler(), R.id.decode); + activity.drawViewfinder(); + } + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/Contents.java b/app/src/main/java/com/google/zxing/client/android/Contents.java new file mode 100644 index 0000000..1cfff17 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/Contents.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import android.provider.ContactsContract; + +/** + * The set of constants to use when sending Barcode Scanner an Intent which requests a barcode + * to be encoded. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class Contents { + private Contents() { + } + + public static final class Type { + /** + * Plain text. Use Intent.putExtra(DATA, string). This can be used for URLs too, but string + * must include "http://" or "https://". + */ + public static final String TEXT = "TEXT_TYPE"; + + /** + * An email type. Use Intent.putExtra(DATA, string) where string is the email address. + */ + public static final String EMAIL = "EMAIL_TYPE"; + + /** + * Use Intent.putExtra(DATA, string) where string is the phone number to call. + */ + public static final String PHONE = "PHONE_TYPE"; + + /** + * An SMS type. Use Intent.putExtra(DATA, string) where string is the number to SMS. + */ + public static final String SMS = "SMS_TYPE"; + + /** + * A contact. Send a request to encode it as follows: + * {@code + * import android.provider.Contacts; + * + * Intent intent = new Intent(Intents.Encode.ACTION); + * intent.putExtra(Intents.Encode.TYPE, CONTACT); + * Bundle bundle = new Bundle(); + * bundle.putString(ContactsContract.Intents.Insert.NAME, "Jenny"); + * bundle.putString(ContactsContract.Intents.Insert.PHONE, "8675309"); + * bundle.putString(ContactsContract.Intents.Insert.EMAIL, "jenny@the80s.com"); + * bundle.putString(ContactsContract.Intents.Insert.POSTAL, "123 Fake St. San Francisco, CA 94102"); + * intent.putExtra(Intents.Encode.DATA, bundle); + * } + */ + public static final String CONTACT = "CONTACT_TYPE"; + + /** + * A geographic location. Use as follows: + * Bundle bundle = new Bundle(); + * bundle.putFloat("LAT", latitude); + * bundle.putFloat("LONG", longitude); + * intent.putExtra(Intents.Encode.DATA, bundle); + */ + public static final String LOCATION = "LOCATION_TYPE"; + + private Type() { + } + } + + public static final String URL_KEY = "URL_KEY"; + + public static final String NOTE_KEY = "NOTE_KEY"; + + /** + * When using Type.CONTACT, these arrays provide the keys for adding or retrieving multiple + * phone numbers and addresses. + */ + public static final String[] PHONE_KEYS = { + ContactsContract.Intents.Insert.PHONE, + ContactsContract.Intents.Insert.SECONDARY_PHONE, + ContactsContract.Intents.Insert.TERTIARY_PHONE + }; + + public static final String[] PHONE_TYPE_KEYS = { + ContactsContract.Intents.Insert.PHONE_TYPE, + ContactsContract.Intents.Insert.SECONDARY_PHONE_TYPE, + ContactsContract.Intents.Insert.TERTIARY_PHONE_TYPE + }; + + public static final String[] EMAIL_KEYS = { + ContactsContract.Intents.Insert.EMAIL, + ContactsContract.Intents.Insert.SECONDARY_EMAIL, + ContactsContract.Intents.Insert.TERTIARY_EMAIL + }; + + public static final String[] EMAIL_TYPE_KEYS = { + ContactsContract.Intents.Insert.EMAIL_TYPE, + ContactsContract.Intents.Insert.SECONDARY_EMAIL_TYPE, + ContactsContract.Intents.Insert.TERTIARY_EMAIL_TYPE + }; + +} diff --git a/app/src/main/java/com/google/zxing/client/android/DecodeFormatManager.java b/app/src/main/java/com/google/zxing/client/android/DecodeFormatManager.java new file mode 100644 index 0000000..0cef607 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/DecodeFormatManager.java @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import android.content.Intent; +import android.net.Uri; +import com.google.zxing.BarcodeFormat; + +import java.util.Arrays; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Pattern; + +final class DecodeFormatManager { + + private static final Pattern COMMA_PATTERN = Pattern.compile(","); + + static final Set PRODUCT_FORMATS; + static final Set INDUSTRIAL_FORMATS; + private static final Set ONE_D_FORMATS; + static final Set QR_CODE_FORMATS = EnumSet.of(BarcodeFormat.QR_CODE); + static final Set DATA_MATRIX_FORMATS = EnumSet.of(BarcodeFormat.DATA_MATRIX); + static final Set AZTEC_FORMATS = EnumSet.of(BarcodeFormat.AZTEC); + static final Set PDF417_FORMATS = EnumSet.of(BarcodeFormat.PDF_417); + static { + PRODUCT_FORMATS = EnumSet.of(BarcodeFormat.UPC_A, + BarcodeFormat.UPC_E, + BarcodeFormat.EAN_13, + BarcodeFormat.EAN_8, + BarcodeFormat.RSS_14, + BarcodeFormat.RSS_EXPANDED); + INDUSTRIAL_FORMATS = EnumSet.of(BarcodeFormat.CODE_39, + BarcodeFormat.CODE_93, + BarcodeFormat.CODE_128, + BarcodeFormat.ITF, + BarcodeFormat.CODABAR); + ONE_D_FORMATS = EnumSet.copyOf(PRODUCT_FORMATS); + ONE_D_FORMATS.addAll(INDUSTRIAL_FORMATS); + } + private static final Map> FORMATS_FOR_MODE; + static { + FORMATS_FOR_MODE = new HashMap<>(); + FORMATS_FOR_MODE.put(Intents.Scan.ONE_D_MODE, ONE_D_FORMATS); + FORMATS_FOR_MODE.put(Intents.Scan.PRODUCT_MODE, PRODUCT_FORMATS); + FORMATS_FOR_MODE.put(Intents.Scan.QR_CODE_MODE, QR_CODE_FORMATS); + FORMATS_FOR_MODE.put(Intents.Scan.DATA_MATRIX_MODE, DATA_MATRIX_FORMATS); + FORMATS_FOR_MODE.put(Intents.Scan.AZTEC_MODE, AZTEC_FORMATS); + FORMATS_FOR_MODE.put(Intents.Scan.PDF417_MODE, PDF417_FORMATS); + } + + private DecodeFormatManager() {} + + static Set parseDecodeFormats(Intent intent) { + Iterable scanFormats = null; + CharSequence scanFormatsString = intent.getStringExtra(Intents.Scan.FORMATS); + if (scanFormatsString != null) { + scanFormats = Arrays.asList(COMMA_PATTERN.split(scanFormatsString)); + } + return parseDecodeFormats(scanFormats, intent.getStringExtra(Intents.Scan.MODE)); + } + + static Set parseDecodeFormats(Uri inputUri) { + List formats = inputUri.getQueryParameters(Intents.Scan.FORMATS); + if (formats != null && formats.size() == 1 && formats.get(0) != null){ + formats = Arrays.asList(COMMA_PATTERN.split(formats.get(0))); + } + return parseDecodeFormats(formats, inputUri.getQueryParameter(Intents.Scan.MODE)); + } + + private static Set parseDecodeFormats(Iterable scanFormats, String decodeMode) { + if (scanFormats != null) { + Set formats = EnumSet.noneOf(BarcodeFormat.class); + try { + for (String format : scanFormats) { + formats.add(BarcodeFormat.valueOf(format)); + } + return formats; + } catch (IllegalArgumentException iae) { + // ignore it then + } + } + if (decodeMode != null) { + return FORMATS_FOR_MODE.get(decodeMode); + } + return null; + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/DecodeHandler.java b/app/src/main/java/com/google/zxing/client/android/DecodeHandler.java new file mode 100644 index 0000000..1a8dc9c --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/DecodeHandler.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import android.graphics.Bitmap; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.util.Log; + +import com.google.zxing.BinaryBitmap; +import com.google.zxing.DecodeHintType; +import com.google.zxing.MultiFormatReader; +import com.google.zxing.PlanarYUVLuminanceSource; +import com.google.zxing.ReaderException; +import com.google.zxing.Result; +import com.google.zxing.common.HybridBinarizer; + +import net.foucry.pilldroid.R; + +import java.io.ByteArrayOutputStream; +import java.util.Map; + +final class DecodeHandler extends Handler { + + private static final String TAG = DecodeHandler.class.getSimpleName(); + + private final CaptureActivity activity; + private final MultiFormatReader multiFormatReader; + private boolean running = true; + + DecodeHandler(CaptureActivity activity, Map hints) { + multiFormatReader = new MultiFormatReader(); + multiFormatReader.setHints(hints); + this.activity = activity; + } + + @Override + public void handleMessage(Message message) { + if (!running) { + return; + } + switch (message.what) { + case R.id.decode: + decode((byte[]) message.obj, message.arg1, message.arg2); + break; + case R.id.quit: + running = false; + Looper.myLooper().quit(); + break; + } + } + + /** + * Decode the data within the viewfinder rectangle, and time how long it took. For efficiency, + * reuse the same reader objects from one decode to the next. + * + * @param data The YUV preview frame. + * @param width The width of the preview frame. + * @param height The height of the preview frame. + */ + private void decode(byte[] data, int width, int height) { + long start = System.currentTimeMillis(); + Result rawResult = null; + PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height); + if (source != null) { + BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); + try { + rawResult = multiFormatReader.decodeWithState(bitmap); + } catch (ReaderException re) { + // continue + } finally { + multiFormatReader.reset(); + } + } + + Handler handler = activity.getHandler(); + if (rawResult != null) { + // Don't log the barcode contents for security. + long end = System.currentTimeMillis(); + Log.d(TAG, "Found barcode in " + (end - start) + " ms"); + if (handler != null) { + Message message = Message.obtain(handler, R.id.decode_succeeded, rawResult); + Bundle bundle = new Bundle(); + bundleThumbnail(source, bundle); + message.setData(bundle); + message.sendToTarget(); + } + } else { + if (handler != null) { + Message message = Message.obtain(handler, R.id.decode_failed); + message.sendToTarget(); + } + } + } + + private static void bundleThumbnail(PlanarYUVLuminanceSource source, Bundle bundle) { + int[] pixels = source.renderThumbnail(); + int width = source.getThumbnailWidth(); + int height = source.getThumbnailHeight(); + Bitmap bitmap = Bitmap.createBitmap(pixels, 0, width, width, height, Bitmap.Config.ARGB_8888); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, 50, out); + bundle.putByteArray(DecodeThread.BARCODE_BITMAP, out.toByteArray()); + bundle.putFloat(DecodeThread.BARCODE_SCALED_FACTOR, (float) width / source.getWidth()); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/DecodeHintManager.java b/app/src/main/java/com/google/zxing/client/android/DecodeHintManager.java new file mode 100644 index 0000000..39305fe --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/DecodeHintManager.java @@ -0,0 +1,236 @@ +/* + * Copyright (C) 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import java.util.EnumMap; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Pattern; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.util.Log; + +import com.google.zxing.DecodeHintType; + +/** + * @author Lachezar Dobrev + */ +final class DecodeHintManager { + + private static final String TAG = DecodeHintManager.class.getSimpleName(); + + // This pattern is used in decoding integer arrays. + private static final Pattern COMMA = Pattern.compile(","); + + private DecodeHintManager() {} + + /** + *

Split a query string into a list of name-value pairs.

+ * + *

This is an alternative to the {@link Uri#getQueryParameterNames()} and + * {@link Uri#getQueryParameters(String)}, which are quirky and not suitable + * for exist-only Uri parameters.

+ * + *

This method ignores multiple parameters with the same name and returns the + * first one only. This is technically incorrect, but should be acceptable due + * to the method of processing Hints: no multiple values for a hint.

+ * + * @param query query to split + * @return name-value pairs + */ + private static Map splitQuery(String query) { + Map map = new HashMap<>(); + int pos = 0; + while (pos < query.length()) { + if (query.charAt(pos) == '&') { + // Skip consecutive ampersand separators. + pos ++; + continue; + } + int amp = query.indexOf('&', pos); + int equ = query.indexOf('=', pos); + if (amp < 0) { + // This is the last element in the query, no more ampersand elements. + String name; + String text; + if (equ < 0) { + // No equal sign + name = query.substring(pos); + name = name.replace('+', ' '); // Preemptively decode + + name = Uri.decode(name); + text = ""; + } else { + // Split name and text. + name = query.substring(pos, equ); + name = name.replace('+', ' '); // Preemptively decode + + name = Uri.decode(name); + text = query.substring(equ + 1); + text = text.replace('+', ' '); // Preemptively decode + + text = Uri.decode(text); + } + if (!map.containsKey(name)) { + map.put(name, text); + } + break; + } + if (equ < 0 || equ > amp) { + // No equal sign until the &: this is a simple parameter with no value. + String name = query.substring(pos, amp); + name = name.replace('+', ' '); // Preemptively decode + + name = Uri.decode(name); + if (!map.containsKey(name)) { + map.put(name, ""); + } + pos = amp + 1; + continue; + } + String name = query.substring(pos, equ); + name = name.replace('+', ' '); // Preemptively decode + + name = Uri.decode(name); + String text = query.substring(equ+1, amp); + text = text.replace('+', ' '); // Preemptively decode + + text = Uri.decode(text); + if (!map.containsKey(name)) { + map.put(name, text); + } + pos = amp + 1; + } + return map; + } + + static Map parseDecodeHints(Uri inputUri) { + String query = inputUri.getEncodedQuery(); + if (query == null || query.isEmpty()) { + return null; + } + + // Extract parameters + Map parameters = splitQuery(query); + + Map hints = new EnumMap<>(DecodeHintType.class); + + for (DecodeHintType hintType: DecodeHintType.values()) { + + if (hintType == DecodeHintType.CHARACTER_SET || + hintType == DecodeHintType.NEED_RESULT_POINT_CALLBACK || + hintType == DecodeHintType.POSSIBLE_FORMATS) { + continue; // This hint is specified in another way + } + + String parameterName = hintType.name(); + String parameterText = parameters.get(parameterName); + if (parameterText == null) { + continue; + } + if (hintType.getValueType().equals(Object.class)) { + // This is an unspecified type of hint content. Use the value as is. + // TODO: Can we make a different assumption on this? + hints.put(hintType, parameterText); + continue; + } + if (hintType.getValueType().equals(Void.class)) { + // Void hints are just flags: use the constant specified by DecodeHintType + hints.put(hintType, Boolean.TRUE); + continue; + } + if (hintType.getValueType().equals(String.class)) { + // A string hint: use the decoded value. + hints.put(hintType, parameterText); + continue; + } + if (hintType.getValueType().equals(Boolean.class)) { + // A boolean hint: a few values for false, everything else is true. + // An empty parameter is simply a flag-style parameter, assuming true + if (parameterText.isEmpty()) { + hints.put(hintType, Boolean.TRUE); + } else if ("0".equals(parameterText) || + "false".equalsIgnoreCase(parameterText) || + "no".equalsIgnoreCase(parameterText)) { + hints.put(hintType, Boolean.FALSE); + } else { + hints.put(hintType, Boolean.TRUE); + } + + continue; + } + if (hintType.getValueType().equals(int[].class)) { + // An integer array. Used to specify valid lengths. + // Strip a trailing comma as in Java style array initialisers. + if (!parameterText.isEmpty() && parameterText.charAt(parameterText.length() - 1) == ',') { + parameterText = parameterText.substring(0, parameterText.length() - 1); + } + String[] values = COMMA.split(parameterText); + int[] array = new int[values.length]; + for (int i = 0; i < values.length; i++) { + try { + array[i] = Integer.parseInt(values[i]); + } catch (NumberFormatException ignored) { + Log.w(TAG, "Skipping array of integers hint " + hintType + " due to invalid numeric value: '" + values[i] + '\''); + array = null; + break; + } + } + if (array != null) { + hints.put(hintType, array); + } + continue; + } + Log.w(TAG, "Unsupported hint type '" + hintType + "' of type " + hintType.getValueType()); + } + + Log.i(TAG, "Hints from the URI: " + hints); + return hints; + } + + static Map parseDecodeHints(Intent intent) { + Bundle extras = intent.getExtras(); + if (extras == null || extras.isEmpty()) { + return null; + } + Map hints = new EnumMap<>(DecodeHintType.class); + + for (DecodeHintType hintType: DecodeHintType.values()) { + + if (hintType == DecodeHintType.CHARACTER_SET || + hintType == DecodeHintType.NEED_RESULT_POINT_CALLBACK || + hintType == DecodeHintType.POSSIBLE_FORMATS) { + continue; // This hint is specified in another way + } + + String hintName = hintType.name(); + if (extras.containsKey(hintName)) { + if (hintType.getValueType().equals(Void.class)) { + // Void hints are just flags: use the constant specified by the DecodeHintType + hints.put(hintType, Boolean.TRUE); + } else { + Object hintData = extras.get(hintName); + if (hintType.getValueType().isInstance(hintData)) { + hints.put(hintType, hintData); + } else { + Log.w(TAG, "Ignoring hint " + hintType + " because it is not assignable from " + hintData); + } + } + } + } + + Log.i(TAG, "Hints from the Intent: " + hints); + return hints; + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/DecodeThread.java b/app/src/main/java/com/google/zxing/client/android/DecodeThread.java new file mode 100644 index 0000000..fab4039 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/DecodeThread.java @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.DecodeHintType; +import com.google.zxing.ResultPointCallback; + +import android.content.SharedPreferences; +import android.os.Handler; +import android.os.Looper; +import android.preference.PreferenceManager; +import android.util.Log; + +import java.util.Collection; +import java.util.EnumMap; +import java.util.EnumSet; +import java.util.Map; +import java.util.concurrent.CountDownLatch; + +/** + * This thread does all the heavy lifting of decoding the images. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +final class DecodeThread extends Thread { + + public static final String BARCODE_BITMAP = "barcode_bitmap"; + public static final String BARCODE_SCALED_FACTOR = "barcode_scaled_factor"; + + private final CaptureActivity activity; + private final Map hints; + private Handler handler; + private final CountDownLatch handlerInitLatch; + + DecodeThread(CaptureActivity activity, + Collection decodeFormats, + Map baseHints, + String characterSet, + ResultPointCallback resultPointCallback) { + + this.activity = activity; + handlerInitLatch = new CountDownLatch(1); + + hints = new EnumMap<>(DecodeHintType.class); + if (baseHints != null) { + hints.putAll(baseHints); + } + + // The prefs can't change while the thread is running, so pick them up once here. + if (decodeFormats == null || decodeFormats.isEmpty()) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); + decodeFormats = EnumSet.noneOf(BarcodeFormat.class); + if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_1D_PRODUCT, true)) { + decodeFormats.addAll(DecodeFormatManager.PRODUCT_FORMATS); + } + if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_1D_INDUSTRIAL, true)) { + decodeFormats.addAll(DecodeFormatManager.INDUSTRIAL_FORMATS); + } + if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_QR, true)) { + decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS); + } + if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_DATA_MATRIX, true)) { + decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS); + } + if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_AZTEC, false)) { + decodeFormats.addAll(DecodeFormatManager.AZTEC_FORMATS); + } + if (prefs.getBoolean(PreferencesActivity.KEY_DECODE_PDF417, false)) { + decodeFormats.addAll(DecodeFormatManager.PDF417_FORMATS); + } + } + hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats); + + if (characterSet != null) { + hints.put(DecodeHintType.CHARACTER_SET, characterSet); + } + hints.put(DecodeHintType.NEED_RESULT_POINT_CALLBACK, resultPointCallback); + Log.i("DecodeThread", "Hints: " + hints); + } + + Handler getHandler() { + try { + handlerInitLatch.await(); + } catch (InterruptedException ie) { + // continue? + } + return handler; + } + + @Override + public void run() { + Looper.prepare(); + handler = new DecodeHandler(activity, hints); + handlerInitLatch.countDown(); + Looper.loop(); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/FinishListener.java b/app/src/main/java/com/google/zxing/client/android/FinishListener.java new file mode 100644 index 0000000..5d59886 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/FinishListener.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import android.app.Activity; +import android.content.DialogInterface; + +/** + * Simple listener used to exit the app in a few cases. + * + * @author Sean Owen + */ +public final class FinishListener implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener { + + private final Activity activityToFinish; + + public FinishListener(Activity activityToFinish) { + this.activityToFinish = activityToFinish; + } + + @Override + public void onCancel(DialogInterface dialogInterface) { + run(); + } + + @Override + public void onClick(DialogInterface dialogInterface, int i) { + run(); + } + + private void run() { + activityToFinish.finish(); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/HelpActivity.java b/app/src/main/java/com/google/zxing/client/android/HelpActivity.java new file mode 100644 index 0000000..1f964bd --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/HelpActivity.java @@ -0,0 +1,66 @@ +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import android.app.Activity; +import android.os.Bundle; +import android.view.KeyEvent; +import android.webkit.WebView; + +import net.foucry.pilldroid.R; + +/** + * An HTML-based help screen. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class HelpActivity extends Activity { + + private static final String BASE_URL = + "file:///android_asset/html-" + LocaleManager.getTranslatedAssetLanguage() + '/'; + + private WebView webView; + + @Override + protected void onCreate(Bundle icicle) { + super.onCreate(icicle); + setContentView(R.layout.help); + + webView = (WebView) findViewById(R.id.help_contents); + + if (icicle == null) { + webView.loadUrl(BASE_URL + "index.html"); + } else { + webView.restoreState(icicle); + } + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) { + webView.goBack(); + return true; + } + return super.onKeyDown(keyCode, event); + } + + @Override + protected void onSaveInstanceState(Bundle icicle) { + super.onSaveInstanceState(icicle); + webView.saveState(icicle); + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/HttpHelper.java b/app/src/main/java/com/google/zxing/client/android/HttpHelper.java new file mode 100644 index 0000000..5a1543d --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/HttpHelper.java @@ -0,0 +1,228 @@ +/* + * Copyright 2011 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import android.util.Log; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.HttpURLConnection; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLConnection; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; + +/** + * Utility methods for retrieving content over HTTP using the more-supported {@code java.net} classes + * in Android. + */ +public final class HttpHelper { + + private static final String TAG = HttpHelper.class.getSimpleName(); + + private static final Collection REDIRECTOR_DOMAINS = new HashSet<>(Arrays.asList( + "amzn.to", "bit.ly", "bitly.com", "fb.me", "goo.gl", "is.gd", "j.mp", "lnkd.in", "ow.ly", + "R.BEETAGG.COM", "r.beetagg.com", "SCN.BY", "su.pr", "t.co", "tinyurl.com", "tr.im" + )); + + private HttpHelper() { + } + + public enum ContentType { + /** HTML-like content type, including HTML, XHTML, etc. */ + HTML, + /** JSON content */ + JSON, + /** XML */ + XML, + /** Plain text content */ + TEXT, + } + + /** + * Downloads the entire resource instead of part. + * + * @param uri URI to retrieve + * @param type expected text-like MIME type of that content + * @return content as a {@code String} + * @throws IOException if the content can't be retrieved because of a bad URI, network problem, etc. + * @see #downloadViaHttp(String, HttpHelper.ContentType, int) + */ + public static CharSequence downloadViaHttp(String uri, ContentType type) throws IOException { + return downloadViaHttp(uri, type, Integer.MAX_VALUE); + } + + /** + * @param uri URI to retrieve + * @param type expected text-like MIME type of that content + * @param maxChars approximate maximum characters to read from the source + * @return content as a {@code String} + * @throws IOException if the content can't be retrieved because of a bad URI, network problem, etc. + */ + public static CharSequence downloadViaHttp(String uri, ContentType type, int maxChars) throws IOException { + String contentTypes; + switch (type) { + case HTML: + contentTypes = "application/xhtml+xml,text/html,text/*,*/*"; + break; + case JSON: + contentTypes = "application/json,text/*,*/*"; + break; + case XML: + contentTypes = "application/xml,text/*,*/*"; + break; + case TEXT: + default: + contentTypes = "text/*,*/*"; + } + return downloadViaHttp(uri, contentTypes, maxChars); + } + + private static CharSequence downloadViaHttp(String uri, String contentTypes, int maxChars) throws IOException { + int redirects = 0; + while (redirects < 5) { + URL url = new URL(uri); + HttpURLConnection connection = safelyOpenConnection(url); + connection.setInstanceFollowRedirects(true); // Won't work HTTP -> HTTPS or vice versa + connection.setRequestProperty("Accept", contentTypes); + connection.setRequestProperty("Accept-Charset", "utf-8,*"); + connection.setRequestProperty("User-Agent", "ZXing (Android)"); + try { + int responseCode = safelyConnect(connection); + switch (responseCode) { + case HttpURLConnection.HTTP_OK: + return consume(connection, maxChars); + case HttpURLConnection.HTTP_MOVED_TEMP: + String location = connection.getHeaderField("Location"); + if (location != null) { + uri = location; + redirects++; + continue; + } + throw new IOException("No Location"); + default: + throw new IOException("Bad HTTP response: " + responseCode); + } + } finally { + connection.disconnect(); + } + } + throw new IOException("Too many redirects"); + } + + private static String getEncoding(URLConnection connection) { + String contentTypeHeader = connection.getHeaderField("Content-Type"); + if (contentTypeHeader != null) { + int charsetStart = contentTypeHeader.indexOf("charset="); + if (charsetStart >= 0) { + return contentTypeHeader.substring(charsetStart + "charset=".length()); + } + } + return "UTF-8"; + } + + private static CharSequence consume(URLConnection connection, int maxChars) throws IOException { + String encoding = getEncoding(connection); + StringBuilder out = new StringBuilder(); + Reader in = null; + try { + in = new InputStreamReader(connection.getInputStream(), encoding); + char[] buffer = new char[1024]; + int charsRead; + while (out.length() < maxChars && (charsRead = in.read(buffer)) > 0) { + out.append(buffer, 0, charsRead); + } + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException | NullPointerException ioe) { + // continue + } + } + } + return out; + } + + public static URI unredirect(URI uri) throws IOException { + if (!REDIRECTOR_DOMAINS.contains(uri.getHost())) { + return uri; + } + URL url = uri.toURL(); + HttpURLConnection connection = safelyOpenConnection(url); + connection.setInstanceFollowRedirects(false); + connection.setDoInput(false); + connection.setRequestMethod("HEAD"); + connection.setRequestProperty("User-Agent", "ZXing (Android)"); + try { + int responseCode = safelyConnect(connection); + switch (responseCode) { + case HttpURLConnection.HTTP_MULT_CHOICE: + case HttpURLConnection.HTTP_MOVED_PERM: + case HttpURLConnection.HTTP_MOVED_TEMP: + case HttpURLConnection.HTTP_SEE_OTHER: + case 307: // No constant for 307 Temporary Redirect ? + String location = connection.getHeaderField("Location"); + if (location != null) { + try { + return new URI(location); + } catch (URISyntaxException e) { + // nevermind + } + } + } + return uri; + } finally { + connection.disconnect(); + } + } + + private static HttpURLConnection safelyOpenConnection(URL url) throws IOException { + URLConnection conn; + try { + conn = url.openConnection(); + } catch (NullPointerException npe) { + // Another strange bug in Android? + Log.w(TAG, "Bad URI? " + url); + throw new IOException(npe); + } + if (!(conn instanceof HttpURLConnection)) { + throw new IOException(); + } + return (HttpURLConnection) conn; + } + + private static int safelyConnect(HttpURLConnection connection) throws IOException { + try { + connection.connect(); + } catch (NullPointerException | IllegalArgumentException | IndexOutOfBoundsException | SecurityException e) { + // this is an Android bug: http://code.google.com/p/android/issues/detail?id=16895 + throw new IOException(e); + } + try { + return connection.getResponseCode(); + } catch (NullPointerException | StringIndexOutOfBoundsException | IllegalArgumentException e) { + // this is maybe this Android bug: http://code.google.com/p/android/issues/detail?id=15554 + throw new IOException(e); + } + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/InactivityTimer.java b/app/src/main/java/com/google/zxing/client/android/InactivityTimer.java new file mode 100644 index 0000000..5e33d90 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/InactivityTimer.java @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import android.app.Activity; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.AsyncTask; +import android.os.BatteryManager; +import android.util.Log; + +/** + * Finishes an activity after a period of inactivity if the device is on battery power. + */ +final class InactivityTimer { + + private static final String TAG = InactivityTimer.class.getSimpleName(); + + private static final long INACTIVITY_DELAY_MS = 5 * 60 * 1000L; + + private final Activity activity; + private final BroadcastReceiver powerStatusReceiver; + private boolean registered; + private AsyncTask inactivityTask; + + InactivityTimer(Activity activity) { + this.activity = activity; + powerStatusReceiver = new PowerStatusReceiver(); + registered = false; + onActivity(); + } + + synchronized void onActivity() { + cancel(); + inactivityTask = new InactivityAsyncTask(); + inactivityTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + + public synchronized void onPause() { + cancel(); + if (registered) { + activity.unregisterReceiver(powerStatusReceiver); + registered = false; + } else { + Log.w(TAG, "PowerStatusReceiver was never registered?"); + } + } + + public synchronized void onResume() { + if (registered) { + Log.w(TAG, "PowerStatusReceiver was already registered?"); + } else { + activity.registerReceiver(powerStatusReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + registered = true; + } + onActivity(); + } + + private synchronized void cancel() { + AsyncTask task = inactivityTask; + if (task != null) { + task.cancel(true); + inactivityTask = null; + } + } + + void shutdown() { + cancel(); + } + + private final class PowerStatusReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent){ + if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) { + // 0 indicates that we're on battery + boolean onBatteryNow = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) <= 0; + if (onBatteryNow) { + InactivityTimer.this.onActivity(); + } else { + InactivityTimer.this.cancel(); + } + } + } + } + + private final class InactivityAsyncTask extends AsyncTask { + @Override + protected Object doInBackground(Object... objects) { + try { + Thread.sleep(INACTIVITY_DELAY_MS); + Log.i(TAG, "Finishing activity due to inactivity"); + activity.finish(); + } catch (InterruptedException e) { + // continue without killing + } + return null; + } + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/IntentSource.java b/app/src/main/java/com/google/zxing/client/android/IntentSource.java new file mode 100644 index 0000000..3222db6 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/IntentSource.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2011 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +enum IntentSource { + + NATIVE_APP_INTENT, + PRODUCT_SEARCH_LINK, + ZXING_LINK, + NONE + +} diff --git a/app/src/main/java/com/google/zxing/client/android/Intents.java b/app/src/main/java/com/google/zxing/client/android/Intents.java new file mode 100644 index 0000000..6e59e80 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/Intents.java @@ -0,0 +1,278 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +/** + * This class provides the constants to use when sending an Intent to Barcode Scanner. + * These strings are effectively API and cannot be changed. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class Intents { + private Intents() { + } + + public static final class Scan { + /** + * Send this intent to open the Barcodes app in scanning mode, find a barcode, and return + * the results. + */ + public static final String ACTION = "com.google.zxing.client.android.SCAN"; + + /** + * By default, sending this will decode all barcodes that we understand. However it + * may be useful to limit scanning to certain formats. Use + * {@link android.content.Intent#putExtra(String, String)} with one of the values below. + * + * Setting this is effectively shorthand for setting explicit formats with {@link #FORMATS}. + * It is overridden by that setting. + */ + public static final String MODE = "SCAN_MODE"; + + /** + * Decode only UPC and EAN barcodes. This is the right choice for shopping apps which get + * prices, reviews, etc. for products. + */ + public static final String PRODUCT_MODE = "PRODUCT_MODE"; + + /** + * Decode only 1D barcodes. + */ + public static final String ONE_D_MODE = "ONE_D_MODE"; + + /** + * Decode only QR codes. + */ + public static final String QR_CODE_MODE = "QR_CODE_MODE"; + + /** + * Decode only Data Matrix codes. + */ + public static final String DATA_MATRIX_MODE = "DATA_MATRIX_MODE"; + + /** + * Decode only Aztec. + */ + public static final String AZTEC_MODE = "AZTEC_MODE"; + + /** + * Decode only PDF417. + */ + public static final String PDF417_MODE = "PDF417_MODE"; + + /** + * Comma-separated list of formats to scan for. The values must match the names of + * {@link com.google.zxing.BarcodeFormat}s, e.g. {@link com.google.zxing.BarcodeFormat#EAN_13}. + * Example: "EAN_13,EAN_8,QR_CODE". This overrides {@link #MODE}. + */ + public static final String FORMATS = "SCAN_FORMATS"; + + /** + * Optional parameter to specify the id of the camera from which to recognize barcodes. + * Overrides the default camera that would otherwise would have been selected. + * If provided, should be an int. + */ + public static final String CAMERA_ID = "SCAN_CAMERA_ID"; + + /** + * @see com.google.zxing.DecodeHintType#CHARACTER_SET + */ + public static final String CHARACTER_SET = "CHARACTER_SET"; + + /** + * Optional parameters to specify the width and height of the scanning rectangle in pixels. + * The app will try to honor these, but will clamp them to the size of the preview frame. + * You should specify both or neither, and pass the size as an int. + */ + public static final String WIDTH = "SCAN_WIDTH"; + public static final String HEIGHT = "SCAN_HEIGHT"; + + /** + * Desired duration in milliseconds for which to pause after a successful scan before + * returning to the calling intent. Specified as a long, not an integer! + * For example: 1000L, not 1000. + */ + public static final String RESULT_DISPLAY_DURATION_MS = "RESULT_DISPLAY_DURATION_MS"; + + /** + * Prompt to show on-screen when scanning by intent. Specified as a {@link String}. + */ + public static final String PROMPT_MESSAGE = "PROMPT_MESSAGE"; + + /** + * If a barcode is found, Barcodes returns {@link android.app.Activity#RESULT_OK} to + * {@link android.app.Activity#onActivityResult(int, int, android.content.Intent)} + * of the app which requested the scan via + * {@link android.app.Activity#startActivityForResult(android.content.Intent, int)} + * The barcodes contents can be retrieved with + * {@link android.content.Intent#getStringExtra(String)}. + * If the user presses Back, the result code will be {@link android.app.Activity#RESULT_CANCELED}. + */ + public static final String RESULT = "SCAN_RESULT"; + + /** + * Call {@link android.content.Intent#getStringExtra(String)} with {@link #RESULT_FORMAT} + * to determine which barcode format was found. + * See {@link com.google.zxing.BarcodeFormat} for possible values. + */ + public static final String RESULT_FORMAT = "SCAN_RESULT_FORMAT"; + + /** + * Call {@link android.content.Intent#getStringExtra(String)} with {@link #RESULT_UPC_EAN_EXTENSION} + * to return the content of any UPC extension barcode that was also found. Only applicable + * to {@link com.google.zxing.BarcodeFormat#UPC_A} and {@link com.google.zxing.BarcodeFormat#EAN_13} + * formats. + */ + public static final String RESULT_UPC_EAN_EXTENSION = "SCAN_RESULT_UPC_EAN_EXTENSION"; + + /** + * Call {@link android.content.Intent#getByteArrayExtra(String)} with {@link #RESULT_BYTES} + * to get a {@code byte[]} of raw bytes in the barcode, if available. + */ + public static final String RESULT_BYTES = "SCAN_RESULT_BYTES"; + + /** + * Key for the value of {@link com.google.zxing.ResultMetadataType#ORIENTATION}, if available. + * Call {@link android.content.Intent#getIntArrayExtra(String)} with {@link #RESULT_ORIENTATION}. + */ + public static final String RESULT_ORIENTATION = "SCAN_RESULT_ORIENTATION"; + + /** + * Key for the value of {@link com.google.zxing.ResultMetadataType#ERROR_CORRECTION_LEVEL}, if available. + * Call {@link android.content.Intent#getStringExtra(String)} with {@link #RESULT_ERROR_CORRECTION_LEVEL}. + */ + public static final String RESULT_ERROR_CORRECTION_LEVEL = "SCAN_RESULT_ERROR_CORRECTION_LEVEL"; + + /** + * Prefix for keys that map to the values of {@link com.google.zxing.ResultMetadataType#BYTE_SEGMENTS}, + * if available. The actual values will be set under a series of keys formed by adding 0, 1, 2, ... + * to this prefix. So the first byte segment is under key "SCAN_RESULT_BYTE_SEGMENTS_0" for example. + * Call {@link android.content.Intent#getByteArrayExtra(String)} with these keys. + */ + public static final String RESULT_BYTE_SEGMENTS_PREFIX = "SCAN_RESULT_BYTE_SEGMENTS_"; + + /** + * Setting this to false will not save scanned codes in the history. Specified as a {@code boolean}. + */ + public static final String SAVE_HISTORY = "SAVE_HISTORY"; + + private Scan() { + } + } + + public static final class History { + + public static final String ITEM_NUMBER = "ITEM_NUMBER"; + + private History() { + } + } + + public static final class Encode { + /** + * Send this intent to encode a piece of data as a QR code and display it full screen, so + * that another person can scan the barcode from your screen. + */ + public static final String ACTION = "com.google.zxing.client.android.ENCODE"; + + /** + * The data to encode. Use {@link android.content.Intent#putExtra(String, String)} or + * {@link android.content.Intent#putExtra(String, android.os.Bundle)}, + * depending on the type and format specified. Non-QR Code formats should + * just use a String here. For QR Code, see Contents for details. + */ + public static final String DATA = "ENCODE_DATA"; + + /** + * The type of data being supplied if the format is QR Code. Use + * {@link android.content.Intent#putExtra(String, String)} with one of {@link Contents.Type}. + */ + public static final String TYPE = "ENCODE_TYPE"; + + /** + * The barcode format to be displayed. If this isn't specified or is blank, + * it defaults to QR Code. Use {@link android.content.Intent#putExtra(String, String)}, where + * format is one of {@link com.google.zxing.BarcodeFormat}. + */ + public static final String FORMAT = "ENCODE_FORMAT"; + + /** + * Normally the contents of the barcode are displayed to the user in a TextView. Setting this + * boolean to false will hide that TextView, showing only the encode barcode. + */ + public static final String SHOW_CONTENTS = "ENCODE_SHOW_CONTENTS"; + + private Encode() { + } + } + + public static final class SearchBookContents { + /** + * Use Google Book Search to search the contents of the book provided. + */ + public static final String ACTION = "com.google.zxing.client.android.SEARCH_BOOK_CONTENTS"; + + /** + * The book to search, identified by ISBN number. + */ + public static final String ISBN = "ISBN"; + + /** + * An optional field which is the text to search for. + */ + public static final String QUERY = "QUERY"; + + private SearchBookContents() { + } + } + + public static final class WifiConnect { + /** + * Internal intent used to trigger connection to a wi-fi network. + */ + public static final String ACTION = "com.google.zxing.client.android.WIFI_CONNECT"; + + /** + * The network to connect to, all the configuration provided here. + */ + public static final String SSID = "SSID"; + + /** + * The network to connect to, all the configuration provided here. + */ + public static final String TYPE = "TYPE"; + + /** + * The network to connect to, all the configuration provided here. + */ + public static final String PASSWORD = "PASSWORD"; + + private WifiConnect() { + } + } + + public static final class Share { + /** + * Give the user a choice of items to encode as a barcode, then render it as a QR Code and + * display onscreen for a friend to scan with their phone. + */ + public static final String ACTION = "com.google.zxing.client.android.SHARE"; + + private Share() { + } + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/LocaleManager.java b/app/src/main/java/com/google/zxing/client/android/LocaleManager.java new file mode 100644 index 0000000..e74f51d --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/LocaleManager.java @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Locale; +import java.util.Map; +import java.util.HashMap; + +/** + * Handles any locale-specific logic for the client. + * + * @author Sean Owen + */ +public final class LocaleManager { + + private static final String DEFAULT_TLD = "com"; + private static final String DEFAULT_COUNTRY = "US"; + private static final String DEFAULT_LANGUAGE = "en"; + + /** + * Locales (well, countries) where Google web search is available. + * These should be kept in sync with our translations. + */ + private static final Map GOOGLE_COUNTRY_TLD; + static { + GOOGLE_COUNTRY_TLD = new HashMap<>(); + GOOGLE_COUNTRY_TLD.put("AR", "com.ar"); // ARGENTINA + GOOGLE_COUNTRY_TLD.put("AU", "com.au"); // AUSTRALIA + GOOGLE_COUNTRY_TLD.put("BR", "com.br"); // BRAZIL + GOOGLE_COUNTRY_TLD.put("BG", "bg"); // BULGARIA + GOOGLE_COUNTRY_TLD.put(Locale.CANADA.getCountry(), "ca"); + GOOGLE_COUNTRY_TLD.put(Locale.CHINA.getCountry(), "cn"); + GOOGLE_COUNTRY_TLD.put("CZ", "cz"); // CZECH REPUBLIC + GOOGLE_COUNTRY_TLD.put("DK", "dk"); // DENMARK + GOOGLE_COUNTRY_TLD.put("FI", "fi"); // FINLAND + GOOGLE_COUNTRY_TLD.put(Locale.FRANCE.getCountry(), "fr"); + GOOGLE_COUNTRY_TLD.put(Locale.GERMANY.getCountry(), "de"); + GOOGLE_COUNTRY_TLD.put("GR", "gr"); // GREECE + GOOGLE_COUNTRY_TLD.put("HU", "hu"); // HUNGARY + GOOGLE_COUNTRY_TLD.put("ID", "co.id"); // INDONESIA + GOOGLE_COUNTRY_TLD.put("IL", "co.il"); // ISRAEL + GOOGLE_COUNTRY_TLD.put(Locale.ITALY.getCountry(), "it"); + GOOGLE_COUNTRY_TLD.put(Locale.JAPAN.getCountry(), "co.jp"); + GOOGLE_COUNTRY_TLD.put(Locale.KOREA.getCountry(), "co.kr"); + GOOGLE_COUNTRY_TLD.put("NL", "nl"); // NETHERLANDS + GOOGLE_COUNTRY_TLD.put("PL", "pl"); // POLAND + GOOGLE_COUNTRY_TLD.put("PT", "pt"); // PORTUGAL + GOOGLE_COUNTRY_TLD.put("RO", "ro"); // ROMANIA + GOOGLE_COUNTRY_TLD.put("RU", "ru"); // RUSSIA + GOOGLE_COUNTRY_TLD.put("SK", "sk"); // SLOVAK REPUBLIC + GOOGLE_COUNTRY_TLD.put("SI", "si"); // SLOVENIA + GOOGLE_COUNTRY_TLD.put("ES", "es"); // SPAIN + GOOGLE_COUNTRY_TLD.put("SE", "se"); // SWEDEN + GOOGLE_COUNTRY_TLD.put("CH", "ch"); // SWITZERLAND + GOOGLE_COUNTRY_TLD.put(Locale.TAIWAN.getCountry(), "tw"); + GOOGLE_COUNTRY_TLD.put("TR", "com.tr"); // TURKEY + GOOGLE_COUNTRY_TLD.put("UA", "com.ua"); // UKRAINE + GOOGLE_COUNTRY_TLD.put(Locale.UK.getCountry(), "co.uk"); + GOOGLE_COUNTRY_TLD.put(Locale.US.getCountry(), "com"); + } + + /** + * Google Product Search for mobile is available in fewer countries than web search. See here: + * http://support.google.com/merchants/bin/answer.py?hl=en-GB&answer=160619 + */ + private static final Map GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD; + static { + GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD = new HashMap<>(); + GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put("AU", "com.au"); // AUSTRALIA + //GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.CHINA.getCountry(), "cn"); + GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.FRANCE.getCountry(), "fr"); + GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.GERMANY.getCountry(), "de"); + GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.ITALY.getCountry(), "it"); + GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.JAPAN.getCountry(), "co.jp"); + GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put("NL", "nl"); // NETHERLANDS + GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put("ES", "es"); // SPAIN + GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put("CH", "ch"); // SWITZERLAND + GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.UK.getCountry(), "co.uk"); + GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD.put(Locale.US.getCountry(), "com"); + } + + /** + * Book search is offered everywhere that web search is available. + */ + private static final Map GOOGLE_BOOK_SEARCH_COUNTRY_TLD = GOOGLE_COUNTRY_TLD; + + private static final Collection TRANSLATED_HELP_ASSET_LANGUAGES = + Arrays.asList("de", "en", "es", "fr", "it", "ja", "ko", "nl", "pt", "ru", "uk", "zh-rCN", "zh-rTW", "zh-rHK"); + + private LocaleManager() {} + + /** + * @param context application's {@link Context} + * @return country-specific TLD suffix appropriate for the current default locale + * (e.g. "co.uk" for the United Kingdom) + */ + public static String getCountryTLD(Context context) { + return doGetTLD(GOOGLE_COUNTRY_TLD, context); + } + + /** + * The same as above, but specifically for Google Product Search. + * + * @param context application's {@link Context} + * @return The top-level domain to use. + */ + public static String getProductSearchCountryTLD(Context context) { + return doGetTLD(GOOGLE_PRODUCT_SEARCH_COUNTRY_TLD, context); + } + + /** + * The same as above, but specifically for Google Book Search. + * + * @param context application's {@link Context} + * @return The top-level domain to use. + */ + public static String getBookSearchCountryTLD(Context context) { + return doGetTLD(GOOGLE_BOOK_SEARCH_COUNTRY_TLD, context); + } + + /** + * Does a given URL point to Google Book Search, regardless of domain. + * + * @param url The address to check. + * @return True if this is a Book Search URL. + */ + public static boolean isBookSearchUrl(String url) { + return url.startsWith("http://google.com/books") || url.startsWith("http://books.google."); + } + + private static String getSystemCountry() { + Locale locale = Locale.getDefault(); + return locale == null ? DEFAULT_COUNTRY : locale.getCountry(); + } + + private static String getSystemLanguage() { + Locale locale = Locale.getDefault(); + if (locale == null) { + return DEFAULT_LANGUAGE; + } + String language = locale.getLanguage(); + // Special case Chinese + if (Locale.SIMPLIFIED_CHINESE.getLanguage().equals(language)) { + return language + "-r" + getSystemCountry(); + } + return language; + } + + public static String getTranslatedAssetLanguage() { + String language = getSystemLanguage(); + return TRANSLATED_HELP_ASSET_LANGUAGES.contains(language) ? language : DEFAULT_LANGUAGE; + } + + private static String doGetTLD(Map map, Context context) { + String tld = map.get(getCountry(context)); + return tld == null ? DEFAULT_TLD : tld; + } + + public static String getCountry(Context context) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + String countryOverride = prefs.getString(PreferencesActivity.KEY_SEARCH_COUNTRY, "-"); + if (countryOverride != null && !countryOverride.isEmpty() && !"-".equals(countryOverride)) { + return countryOverride; + } + return getSystemCountry(); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/PreferencesActivity.java b/app/src/main/java/com/google/zxing/client/android/PreferencesActivity.java new file mode 100644 index 0000000..8d0dc64 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/PreferencesActivity.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import android.app.Activity; +import android.os.Bundle; + +/** + * The main settings activity. + * + * @author dswitkin@google.com (Daniel Switkin) + * @author Sean Owen + */ +public final class PreferencesActivity extends Activity { + + public static final String KEY_DECODE_1D_PRODUCT = "preferences_decode_1D_product"; + public static final String KEY_DECODE_1D_INDUSTRIAL = "preferences_decode_1D_industrial"; + public static final String KEY_DECODE_QR = "preferences_decode_QR"; + public static final String KEY_DECODE_DATA_MATRIX = "preferences_decode_Data_Matrix"; + public static final String KEY_DECODE_AZTEC = "preferences_decode_Aztec"; + public static final String KEY_DECODE_PDF417 = "preferences_decode_PDF417"; + + public static final String KEY_CUSTOM_PRODUCT_SEARCH = "preferences_custom_product_search"; + + public static final String KEY_PLAY_BEEP = "preferences_play_beep"; + public static final String KEY_VIBRATE = "preferences_vibrate"; + public static final String KEY_COPY_TO_CLIPBOARD = "preferences_copy_to_clipboard"; + public static final String KEY_FRONT_LIGHT_MODE = "preferences_front_light_mode"; + public static final String KEY_BULK_MODE = "preferences_bulk_mode"; + public static final String KEY_REMEMBER_DUPLICATES = "preferences_remember_duplicates"; + public static final String KEY_ENABLE_HISTORY = "preferences_history"; + public static final String KEY_SUPPLEMENTAL = "preferences_supplemental"; + public static final String KEY_AUTO_FOCUS = "preferences_auto_focus"; + public static final String KEY_INVERT_SCAN = "preferences_invert_scan"; + public static final String KEY_SEARCH_COUNTRY = "preferences_search_country"; + public static final String KEY_DISABLE_AUTO_ORIENTATION = "preferences_orientation"; + + public static final String KEY_DISABLE_CONTINUOUS_FOCUS = "preferences_disable_continuous_focus"; + public static final String KEY_DISABLE_EXPOSURE = "preferences_disable_exposure"; + public static final String KEY_DISABLE_METERING = "preferences_disable_metering"; + public static final String KEY_DISABLE_BARCODE_SCENE_MODE = "preferences_disable_barcode_scene_mode"; + public static final String KEY_AUTO_OPEN_WEB = "preferences_auto_open_web"; + + @Override + protected void onCreate(Bundle icicle) { + super.onCreate(icicle); + getFragmentManager().beginTransaction().replace(android.R.id.content, new PreferencesFragment()).commit(); + } + + // Apparently this will be necessary when targeting API 19+: + /* + @Override + protected boolean isValidFragment(String fragmentName) { + return true; + } + */ + +} diff --git a/app/src/main/java/com/google/zxing/client/android/PreferencesFragment.java b/app/src/main/java/com/google/zxing/client/android/PreferencesFragment.java new file mode 100644 index 0000000..6d90ef7 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/PreferencesFragment.java @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import android.app.AlertDialog; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.EditTextPreference; +import android.preference.Preference; +import android.preference.PreferenceFragment; +import android.preference.PreferenceScreen; + +import net.foucry.pilldroid.R; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Collection; + +public final class PreferencesFragment + extends PreferenceFragment + implements SharedPreferences.OnSharedPreferenceChangeListener { + + private CheckBoxPreference[] checkBoxPrefs; + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + addPreferencesFromResource(R.xml.preferences); + + PreferenceScreen preferences = getPreferenceScreen(); + preferences.getSharedPreferences().registerOnSharedPreferenceChangeListener(this); + checkBoxPrefs = findDecodePrefs(preferences, + PreferencesActivity.KEY_DECODE_1D_PRODUCT, + PreferencesActivity.KEY_DECODE_1D_INDUSTRIAL, + PreferencesActivity.KEY_DECODE_QR, + PreferencesActivity.KEY_DECODE_DATA_MATRIX, + PreferencesActivity.KEY_DECODE_AZTEC, + PreferencesActivity.KEY_DECODE_PDF417); + disableLastCheckedPref(); + + EditTextPreference customProductSearch = (EditTextPreference) + preferences.findPreference(PreferencesActivity.KEY_CUSTOM_PRODUCT_SEARCH); + customProductSearch.setOnPreferenceChangeListener(new CustomSearchURLValidator()); + } + + private static CheckBoxPreference[] findDecodePrefs(PreferenceScreen preferences, String... keys) { + CheckBoxPreference[] prefs = new CheckBoxPreference[keys.length]; + for (int i = 0; i < keys.length; i++) { + prefs[i] = (CheckBoxPreference) preferences.findPreference(keys[i]); + } + return prefs; + } + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + disableLastCheckedPref(); + } + + private void disableLastCheckedPref() { + Collection checked = new ArrayList<>(checkBoxPrefs.length); + for (CheckBoxPreference pref : checkBoxPrefs) { + if (pref.isChecked()) { + checked.add(pref); + } + } + boolean disable = checked.size() <= 1; + for (CheckBoxPreference pref : checkBoxPrefs) { + pref.setEnabled(!(disable && checked.contains(pref))); + } + } + + private class CustomSearchURLValidator implements Preference.OnPreferenceChangeListener { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (!isValid(newValue)) { + AlertDialog.Builder builder = + new AlertDialog.Builder(PreferencesFragment.this.getActivity()); + builder.setTitle(R.string.msg_error); + builder.setMessage(R.string.msg_invalid_value); + builder.setCancelable(true); + builder.show(); + return false; + } + return true; + } + + private boolean isValid(Object newValue) { + // Allow empty/null value + if (newValue == null) { + return true; + } + String valueString = newValue.toString(); + if (valueString.isEmpty()) { + return true; + } + // Before validating, remove custom placeholders, which will not + // be considered valid parts of the URL in some locations: + // Blank %t and %s: + valueString = valueString.replaceAll("%[st]", ""); + // Blank %f but not if followed by digit or a-f as it may be a hex sequence + valueString = valueString.replaceAll("%f(?![0-9a-f])", ""); + // Require a scheme otherwise: + try { + URI uri = new URI(valueString); + return uri.getScheme() != null; + } catch (URISyntaxException use) { + return false; + } + } + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/ScanFromWebPageManager.java b/app/src/main/java/com/google/zxing/client/android/ScanFromWebPageManager.java new file mode 100644 index 0000000..15170b0 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/ScanFromWebPageManager.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import android.net.Uri; +import com.google.zxing.Result; +import com.google.zxing.client.android.result.ResultHandler; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +/** + * Manages functionality related to responding to requests to scan from an HTTP link in a web page. + * See
ScanningFromWebPages. + * + * @author Sean Owen + */ +final class ScanFromWebPageManager { + + private static final CharSequence CODE_PLACEHOLDER = "{CODE}"; + private static final CharSequence RAW_CODE_PLACEHOLDER = "{RAWCODE}"; + private static final CharSequence META_PLACEHOLDER = "{META}"; + private static final CharSequence FORMAT_PLACEHOLDER = "{FORMAT}"; + private static final CharSequence TYPE_PLACEHOLDER = "{TYPE}"; + + private static final String RETURN_URL_PARAM = "ret"; + private static final String RAW_PARAM = "raw"; + + private final String returnUrlTemplate; + private final boolean returnRaw; + + ScanFromWebPageManager(Uri inputUri) { + returnUrlTemplate = inputUri.getQueryParameter(RETURN_URL_PARAM); + returnRaw = inputUri.getQueryParameter(RAW_PARAM) != null; + } + + boolean isScanFromWebPage() { + return returnUrlTemplate != null; + } + + String buildReplyURL(Result rawResult, ResultHandler resultHandler) { + String result = returnUrlTemplate; + result = replace(CODE_PLACEHOLDER, + returnRaw ? rawResult.getText() : resultHandler.getDisplayContents(), result); + result = replace(RAW_CODE_PLACEHOLDER, rawResult.getText(), result); + result = replace(FORMAT_PLACEHOLDER, rawResult.getBarcodeFormat().toString(), result); + result = replace(TYPE_PLACEHOLDER, resultHandler.getType().toString(), result); + result = replace(META_PLACEHOLDER, String.valueOf(rawResult.getResultMetadata()), result); + return result; + } + + private static String replace(CharSequence placeholder, CharSequence with, String pattern) { + CharSequence escapedWith = with == null ? "" : with; + try { + escapedWith = URLEncoder.encode(escapedWith.toString(), "UTF-8"); + } catch (UnsupportedEncodingException e) { + // can't happen; UTF-8 is always supported. Continue, I guess, without encoding + } + return pattern.replace(placeholder, escapedWith); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/ViewfinderResultPointCallback.java b/app/src/main/java/com/google/zxing/client/android/ViewfinderResultPointCallback.java new file mode 100644 index 0000000..48009a9 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/ViewfinderResultPointCallback.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import com.google.zxing.ResultPoint; +import com.google.zxing.ResultPointCallback; + +final class ViewfinderResultPointCallback implements ResultPointCallback { + + private final ViewfinderView viewfinderView; + + ViewfinderResultPointCallback(ViewfinderView viewfinderView) { + this.viewfinderView = viewfinderView; + } + + @Override + public void foundPossibleResultPoint(ResultPoint point) { + viewfinderView.addPossibleResultPoint(point); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/ViewfinderView.java b/app/src/main/java/com/google/zxing/client/android/ViewfinderView.java new file mode 100644 index 0000000..4aa499d --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/ViewfinderView.java @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.view.View; + +import com.google.zxing.ResultPoint; +import com.google.zxing.client.android.camera.CameraManager; + +import net.foucry.pilldroid.R; + +import java.util.ArrayList; +import java.util.List; + +/** + * This view is overlaid on top of the camera preview. It adds the viewfinder rectangle and partial + * transparency outside it, as well as the laser scanner animation and result points. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class ViewfinderView extends View { + + private static final int[] SCANNER_ALPHA = {0, 64, 128, 192, 255, 192, 128, 64}; + private static final long ANIMATION_DELAY = 80L; + private static final int CURRENT_POINT_OPACITY = 0xA0; + private static final int MAX_RESULT_POINTS = 20; + private static final int POINT_SIZE = 6; + + private CameraManager cameraManager; + private final Paint paint; + private Bitmap resultBitmap; + private final int maskColor; + private final int resultColor; + private final int laserColor; + private final int resultPointColor; + private int scannerAlpha; + private List possibleResultPoints; + private List lastPossibleResultPoints; + + // This constructor is used when the class is built from an XML resource. + public ViewfinderView(Context context, AttributeSet attrs) { + super(context, attrs); + + // Initialize these once for performance rather than calling them every time in onDraw(). + paint = new Paint(Paint.ANTI_ALIAS_FLAG); + Resources resources = getResources(); + maskColor = resources.getColor(R.color.viewfinder_mask); + resultColor = resources.getColor(R.color.result_view); + laserColor = resources.getColor(R.color.viewfinder_laser); + resultPointColor = resources.getColor(R.color.possible_result_points); + scannerAlpha = 0; + possibleResultPoints = new ArrayList<>(5); + lastPossibleResultPoints = null; + } + + public void setCameraManager(CameraManager cameraManager) { + this.cameraManager = cameraManager; + } + + @SuppressLint("DrawAllocation") + @Override + public void onDraw(Canvas canvas) { + if (cameraManager == null) { + return; // not ready yet, early draw before done configuring + } + Rect frame = cameraManager.getFramingRect(); + Rect previewFrame = cameraManager.getFramingRectInPreview(); + if (frame == null || previewFrame == null) { + return; + } + int width = canvas.getWidth(); + int height = canvas.getHeight(); + + // Draw the exterior (i.e. outside the framing rect) darkened + paint.setColor(resultBitmap != null ? resultColor : maskColor); + canvas.drawRect(0, 0, width, frame.top, paint); + canvas.drawRect(0, frame.top, frame.left, frame.bottom + 1, paint); + canvas.drawRect(frame.right + 1, frame.top, width, frame.bottom + 1, paint); + canvas.drawRect(0, frame.bottom + 1, width, height, paint); + + if (resultBitmap != null) { + // Draw the opaque result bitmap over the scanning rectangle + paint.setAlpha(CURRENT_POINT_OPACITY); + canvas.drawBitmap(resultBitmap, null, frame, paint); + } else { + + // Draw a red "laser scanner" line through the middle to show decoding is active + paint.setColor(laserColor); + paint.setAlpha(SCANNER_ALPHA[scannerAlpha]); + scannerAlpha = (scannerAlpha + 1) % SCANNER_ALPHA.length; + int middle = frame.height() / 2 + frame.top; + canvas.drawRect(frame.left + 2, middle - 1, frame.right - 1, middle + 2, paint); + + float scaleX = frame.width() / (float) previewFrame.width(); + float scaleY = frame.height() / (float) previewFrame.height(); + + List currentPossible = possibleResultPoints; + List currentLast = lastPossibleResultPoints; + int frameLeft = frame.left; + int frameTop = frame.top; + if (currentPossible.isEmpty()) { + lastPossibleResultPoints = null; + } else { + possibleResultPoints = new ArrayList<>(5); + lastPossibleResultPoints = currentPossible; + paint.setAlpha(CURRENT_POINT_OPACITY); + paint.setColor(resultPointColor); + synchronized (currentPossible) { + for (ResultPoint point : currentPossible) { + canvas.drawCircle(frameLeft + (int) (point.getX() * scaleX), + frameTop + (int) (point.getY() * scaleY), + POINT_SIZE, paint); + } + } + } + if (currentLast != null) { + paint.setAlpha(CURRENT_POINT_OPACITY / 2); + paint.setColor(resultPointColor); + synchronized (currentLast) { + float radius = POINT_SIZE / 2.0f; + for (ResultPoint point : currentLast) { + canvas.drawCircle(frameLeft + (int) (point.getX() * scaleX), + frameTop + (int) (point.getY() * scaleY), + radius, paint); + } + } + } + + // Request another update at the animation interval, but only repaint the laser line, + // not the entire viewfinder mask. + postInvalidateDelayed(ANIMATION_DELAY, + frame.left - POINT_SIZE, + frame.top - POINT_SIZE, + frame.right + POINT_SIZE, + frame.bottom + POINT_SIZE); + } + } + + public void drawViewfinder() { + Bitmap resultBitmap = this.resultBitmap; + this.resultBitmap = null; + if (resultBitmap != null) { + resultBitmap.recycle(); + } + invalidate(); + } + + /** + * Draw a bitmap with the result points highlighted instead of the live scanning display. + * + * @param barcode An image of the decoded barcode. + */ + public void drawResultBitmap(Bitmap barcode) { + resultBitmap = barcode; + invalidate(); + } + + public void addPossibleResultPoint(ResultPoint point) { + List points = possibleResultPoints; + synchronized (points) { + points.add(point); + int size = points.size(); + if (size > MAX_RESULT_POINTS) { + // trim it + points.subList(0, size - MAX_RESULT_POINTS / 2).clear(); + } + } + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/book/BrowseBookListener.java b/app/src/main/java/com/google/zxing/client/android/book/BrowseBookListener.java new file mode 100644 index 0000000..c00bd6e --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/book/BrowseBookListener.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.book; + +import android.content.Intent; +import android.net.Uri; +import android.view.View; +import android.widget.AdapterView; +import com.google.zxing.client.android.LocaleManager; + +import java.util.List; + +final class BrowseBookListener implements AdapterView.OnItemClickListener { + + private final SearchBookContentsActivity activity; + private final List items; + + BrowseBookListener(SearchBookContentsActivity activity, List items) { + this.activity = activity; + this.items = items; + } + + @Override + public void onItemClick(AdapterView parent, View v, int position, long id) { + if (position < 1) { + // Clicked header, ignore it + return; + } + int itemOffset = position - 1; + if (itemOffset >= items.size()) { + return; + } + String pageId = items.get(itemOffset).getPageId(); + String query = SearchBookContentsResult.getQuery(); + if (LocaleManager.isBookSearchUrl(activity.getISBN()) && !pageId.isEmpty()) { + String uri = activity.getISBN(); + int equals = uri.indexOf('='); + String volumeId = uri.substring(equals + 1); + String readBookURI = "http://books.google." + + LocaleManager.getBookSearchCountryTLD(activity) + + "/books?id=" + volumeId + "&pg=" + pageId + "&vq=" + query; + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(readBookURI)); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + activity.startActivity(intent); + } + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/book/SearchBookContentsActivity.java b/app/src/main/java/com/google/zxing/client/android/book/SearchBookContentsActivity.java new file mode 100644 index 0000000..9c14cfb --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/book/SearchBookContentsActivity.java @@ -0,0 +1,274 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.book; + +import android.app.Activity; +import android.content.Intent; +import android.os.AsyncTask; +import android.os.Bundle; +import android.util.Log; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.webkit.CookieManager; +import android.webkit.CookieSyncManager; +import android.widget.EditText; +import android.widget.ListView; +import android.widget.TextView; + +import com.google.zxing.client.android.HttpHelper; +import com.google.zxing.client.android.Intents; +import com.google.zxing.client.android.LocaleManager; + +import net.foucry.pilldroid.R; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; +/** + * Uses Google Book Search to find a word or phrase in the requested book. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class SearchBookContentsActivity extends Activity { + + private static final String TAG = SearchBookContentsActivity.class.getSimpleName(); + + private static final Pattern TAG_PATTERN = Pattern.compile("\\<.*?\\>"); + private static final Pattern LT_ENTITY_PATTERN = Pattern.compile("<"); + private static final Pattern GT_ENTITY_PATTERN = Pattern.compile(">"); + private static final Pattern QUOTE_ENTITY_PATTERN = Pattern.compile("'"); + private static final Pattern QUOT_ENTITY_PATTERN = Pattern.compile("""); + + private String isbn; + private EditText queryTextView; + private View queryButton; + private ListView resultListView; + private TextView headerView; + private AsyncTask networkTask; + + private final View.OnClickListener buttonListener = new View.OnClickListener() { + @Override + public void onClick(View view) { + launchSearch(); + } + }; + + private final View.OnKeyListener keyListener = new View.OnKeyListener() { + @Override + public boolean onKey(View view, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) { + launchSearch(); + return true; + } + return false; + } + }; + + String getISBN() { + return isbn; + } + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + // Make sure that expired cookies are removed on launch. + CookieSyncManager.createInstance(this); + CookieManager.getInstance().removeExpiredCookie(); + + Intent intent = getIntent(); + if (intent == null || !Intents.SearchBookContents.ACTION.equals(intent.getAction())) { + finish(); + return; + } + + isbn = intent.getStringExtra(Intents.SearchBookContents.ISBN); + if (LocaleManager.isBookSearchUrl(isbn)) { + setTitle(getString(R.string.sbc_name)); + } else { + setTitle(getString(R.string.sbc_name) + ": ISBN " + isbn); + } + + setContentView(R.layout.search_book_contents); + queryTextView = (EditText) findViewById(R.id.query_text_view); + + String initialQuery = intent.getStringExtra(Intents.SearchBookContents.QUERY); + if (initialQuery != null && !initialQuery.isEmpty()) { + // Populate the search box but don't trigger the search + queryTextView.setText(initialQuery); + } + queryTextView.setOnKeyListener(keyListener); + + queryButton = findViewById(R.id.query_button); + queryButton.setOnClickListener(buttonListener); + + resultListView = (ListView) findViewById(R.id.result_list_view); + LayoutInflater factory = LayoutInflater.from(this); + headerView = (TextView) factory.inflate(R.layout.search_book_contents_header, + resultListView, false); + resultListView.addHeaderView(headerView); + } + + @Override + protected void onResume() { + super.onResume(); + queryTextView.selectAll(); + } + + @Override + protected void onPause() { + AsyncTask oldTask = networkTask; + if (oldTask != null) { + oldTask.cancel(true); + networkTask = null; + } + super.onPause(); + } + + private void launchSearch() { + String query = queryTextView.getText().toString(); + if (query != null && !query.isEmpty()) { + AsyncTask oldTask = networkTask; + if (oldTask != null) { + oldTask.cancel(true); + } + networkTask = new NetworkTask(); + networkTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, query, isbn); + headerView.setText(R.string.msg_sbc_searching_book); + resultListView.setAdapter(null); + queryTextView.setEnabled(false); + queryButton.setEnabled(false); + } + } + + private final class NetworkTask extends AsyncTask { + + @Override + protected JSONObject doInBackground(String... args) { + try { + // These return a JSON result which describes if and where the query was found. This API may + // break or disappear at any time in the future. Since this is an API call rather than a + // website, we don't use LocaleManager to change the TLD. + String theQuery = args[0]; + String theIsbn = args[1]; + String uri; + if (LocaleManager.isBookSearchUrl(theIsbn)) { + int equals = theIsbn.indexOf('='); + String volumeId = theIsbn.substring(equals + 1); + uri = "http://www.google.com/books?id=" + volumeId + "&jscmd=SearchWithinVolume2&q=" + theQuery; + } else { + uri = "http://www.google.com/books?vid=isbn" + theIsbn + "&jscmd=SearchWithinVolume2&q=" + theQuery; + } + CharSequence content = HttpHelper.downloadViaHttp(uri, HttpHelper.ContentType.JSON); + return new JSONObject(content.toString()); + } catch (IOException ioe) { + Log.w(TAG, "Error accessing book search", ioe); + return null; + } catch (JSONException je) { + Log.w(TAG, "Error accessing book search", je); + return null; + } + } + + @Override + protected void onPostExecute(JSONObject result) { + if (result == null) { + headerView.setText(R.string.msg_sbc_failed); + } else { + handleSearchResults(result); + } + queryTextView.setEnabled(true); + queryTextView.selectAll(); + queryButton.setEnabled(true); + } + + // Currently there is no way to distinguish between a query which had no results and a book + // which is not searchable - both return zero results. + private void handleSearchResults(JSONObject json) { + try { + int count = json.getInt("number_of_results"); + headerView.setText(getString(R.string.msg_sbc_results) + " : " + count); + if (count > 0) { + JSONArray results = json.getJSONArray("search_results"); + SearchBookContentsResult.setQuery(queryTextView.getText().toString()); + List items = new ArrayList<>(count); + for (int x = 0; x < count; x++) { + items.add(parseResult(results.getJSONObject(x))); + } + resultListView.setOnItemClickListener(new BrowseBookListener(SearchBookContentsActivity.this, items)); + resultListView.setAdapter(new SearchBookContentsAdapter(SearchBookContentsActivity.this, items)); + } else { + String searchable = json.optString("searchable"); + if ("false".equals(searchable)) { + headerView.setText(R.string.msg_sbc_book_not_searchable); + } + resultListView.setAdapter(null); + } + } catch (JSONException e) { + Log.w(TAG, "Bad JSON from book search", e); + resultListView.setAdapter(null); + headerView.setText(R.string.msg_sbc_failed); + } + } + + // Available fields: page_id, page_number, snippet_text + private SearchBookContentsResult parseResult(JSONObject json) { + + String pageId; + String pageNumber; + String snippet; + try { + pageId = json.getString("page_id"); + pageNumber = json.optString("page_number"); + snippet = json.optString("snippet_text"); + } catch (JSONException e) { + Log.w(TAG, e); + // Never seen in the wild, just being complete. + return new SearchBookContentsResult(getString(R.string.msg_sbc_no_page_returned), "", "", false); + } + + if (pageNumber == null || pageNumber.isEmpty()) { + // This can happen for text on the jacket, and possibly other reasons. + pageNumber = ""; + } else { + pageNumber = getString(R.string.msg_sbc_page) + ' ' + pageNumber; + } + + boolean valid = snippet != null && !snippet.isEmpty(); + if (valid) { + // Remove all HTML tags and encoded characters. + snippet = TAG_PATTERN.matcher(snippet).replaceAll(""); + snippet = LT_ENTITY_PATTERN.matcher(snippet).replaceAll("<"); + snippet = GT_ENTITY_PATTERN.matcher(snippet).replaceAll(">"); + snippet = QUOTE_ENTITY_PATTERN.matcher(snippet).replaceAll("'"); + snippet = QUOT_ENTITY_PATTERN.matcher(snippet).replaceAll("\""); + } else { + snippet = '(' + getString(R.string.msg_sbc_snippet_unavailable) + ')'; + } + + return new SearchBookContentsResult(pageId, pageNumber, snippet, valid); + } + + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/book/SearchBookContentsAdapter.java b/app/src/main/java/com/google/zxing/client/android/book/SearchBookContentsAdapter.java new file mode 100644 index 0000000..84f5889 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/book/SearchBookContentsAdapter.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.book; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; + +import net.foucry.pilldroid.R; + +import java.util.List; +/** + * Manufactures list items which represent SBC results. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +final class SearchBookContentsAdapter extends ArrayAdapter { + + SearchBookContentsAdapter(Context context, List items) { + super(context, R.layout.search_book_contents_list_item, 0, items); + } + + @Override + public View getView(int position, View view, ViewGroup viewGroup) { + SearchBookContentsListItem listItem; + + if (view == null) { + LayoutInflater factory = LayoutInflater.from(getContext()); + listItem = (SearchBookContentsListItem) factory.inflate( + R.layout.search_book_contents_list_item, viewGroup, false); + } else { + if (view instanceof SearchBookContentsListItem) { + listItem = (SearchBookContentsListItem) view; + } else { + return view; + } + } + + SearchBookContentsResult result = getItem(position); + listItem.set(result); + return listItem; + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/book/SearchBookContentsListItem.java b/app/src/main/java/com/google/zxing/client/android/book/SearchBookContentsListItem.java new file mode 100644 index 0000000..5ef5d58 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/book/SearchBookContentsListItem.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.book; + +import android.content.Context; +import android.graphics.Typeface; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.style.StyleSpan; +import android.util.AttributeSet; +import android.widget.LinearLayout; +import android.widget.TextView; + +import net.foucry.pilldroid.R; + +import java.util.Locale; + +/** + * A list item which displays the page number and snippet of this search result. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class SearchBookContentsListItem extends LinearLayout { + private TextView pageNumberView; + private TextView snippetView; + + SearchBookContentsListItem(Context context) { + super(context); + } + + public SearchBookContentsListItem(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + pageNumberView = (TextView) findViewById(R.id.page_number_view); + snippetView = (TextView) findViewById(R.id.snippet_view); + } + + public void set(SearchBookContentsResult result) { + pageNumberView.setText(result.getPageNumber()); + String snippet = result.getSnippet(); + if (snippet.isEmpty()) { + snippetView.setText(""); + } else { + if (result.getValidSnippet()) { + String lowerQuery = SearchBookContentsResult.getQuery().toLowerCase(Locale.getDefault()); + String lowerSnippet = snippet.toLowerCase(Locale.getDefault()); + Spannable styledSnippet = new SpannableString(snippet); + StyleSpan boldSpan = new StyleSpan(Typeface.BOLD); + int queryLength = lowerQuery.length(); + int offset = 0; + while (true) { + int pos = lowerSnippet.indexOf(lowerQuery, offset); + if (pos < 0) { + break; + } + styledSnippet.setSpan(boldSpan, pos, pos + queryLength, 0); + offset = pos + queryLength; + } + snippetView.setText(styledSnippet); + } else { + // This may be an error message, so don't try to bold the query terms within it + snippetView.setText(snippet); + } + } + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/book/SearchBookContentsResult.java b/app/src/main/java/com/google/zxing/client/android/book/SearchBookContentsResult.java new file mode 100644 index 0000000..ffaafb3 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/book/SearchBookContentsResult.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.book; + +/** + * The underlying data for a SBC result. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +final class SearchBookContentsResult { + + private static String query = null; + + private final String pageId; + private final String pageNumber; + private final String snippet; + private final boolean validSnippet; + + SearchBookContentsResult(String pageId, + String pageNumber, + String snippet, + boolean validSnippet) { + this.pageId = pageId; + this.pageNumber = pageNumber; + this.snippet = snippet; + this.validSnippet = validSnippet; + } + + public static void setQuery(String query) { + SearchBookContentsResult.query = query; + } + + public String getPageId() { + return pageId; + } + + public String getPageNumber() { + return pageNumber; + } + + public String getSnippet() { + return snippet; + } + + public boolean getValidSnippet() { + return validSnippet; + } + + public static String getQuery() { + return query; + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/camera/AutoFocusManager.java b/app/src/main/java/com/google/zxing/client/android/camera/AutoFocusManager.java new file mode 100644 index 0000000..05aee0a --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/camera/AutoFocusManager.java @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.camera; + +import android.content.Context; +import android.content.SharedPreferences; +import android.hardware.Camera; +import android.os.AsyncTask; +import android.preference.PreferenceManager; +import android.util.Log; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.concurrent.RejectedExecutionException; + +import com.google.zxing.client.android.PreferencesActivity; + +final class AutoFocusManager implements Camera.AutoFocusCallback { + + private static final String TAG = AutoFocusManager.class.getSimpleName(); + + private static final long AUTO_FOCUS_INTERVAL_MS = 2000L; + private static final Collection FOCUS_MODES_CALLING_AF; + static { + FOCUS_MODES_CALLING_AF = new ArrayList<>(2); + FOCUS_MODES_CALLING_AF.add(Camera.Parameters.FOCUS_MODE_AUTO); + FOCUS_MODES_CALLING_AF.add(Camera.Parameters.FOCUS_MODE_MACRO); + } + + private boolean stopped; + private boolean focusing; + private final boolean useAutoFocus; + private final Camera camera; + private AsyncTask outstandingTask; + + AutoFocusManager(Context context, Camera camera) { + this.camera = camera; + SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); + String currentFocusMode = camera.getParameters().getFocusMode(); + useAutoFocus = + sharedPrefs.getBoolean(PreferencesActivity.KEY_AUTO_FOCUS, true) && + FOCUS_MODES_CALLING_AF.contains(currentFocusMode); + Log.i(TAG, "Current focus mode '" + currentFocusMode + "'; use auto focus? " + useAutoFocus); + start(); + } + + @Override + public synchronized void onAutoFocus(boolean success, Camera theCamera) { + focusing = false; + autoFocusAgainLater(); + } + + private synchronized void autoFocusAgainLater() { + if (!stopped && outstandingTask == null) { + AutoFocusTask newTask = new AutoFocusTask(); + try { + newTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + outstandingTask = newTask; + } catch (RejectedExecutionException ree) { + Log.w(TAG, "Could not request auto focus", ree); + } + } + } + + synchronized void start() { + if (useAutoFocus) { + outstandingTask = null; + if (!stopped && !focusing) { + try { + camera.autoFocus(this); + focusing = true; + } catch (RuntimeException re) { + // Have heard RuntimeException reported in Android 4.0.x+; continue? + Log.w(TAG, "Unexpected exception while focusing", re); + // Try again later to keep cycle going + autoFocusAgainLater(); + } + } + } + } + + private synchronized void cancelOutstandingTask() { + if (outstandingTask != null) { + if (outstandingTask.getStatus() != AsyncTask.Status.FINISHED) { + outstandingTask.cancel(true); + } + outstandingTask = null; + } + } + + synchronized void stop() { + stopped = true; + if (useAutoFocus) { + cancelOutstandingTask(); + // Doesn't hurt to call this even if not focusing + try { + camera.cancelAutoFocus(); + } catch (RuntimeException re) { + // Have heard RuntimeException reported in Android 4.0.x+; continue? + Log.w(TAG, "Unexpected exception while cancelling focusing", re); + } + } + } + + private final class AutoFocusTask extends AsyncTask { + @Override + protected Object doInBackground(Object... voids) { + try { + Thread.sleep(AUTO_FOCUS_INTERVAL_MS); + } catch (InterruptedException e) { + // continue + } + start(); + return null; + } + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationManager.java b/app/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationManager.java new file mode 100644 index 0000000..a18e37e --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationManager.java @@ -0,0 +1,251 @@ +/* + * Copyright (C) 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.camera; + +import android.content.Context; +import android.content.SharedPreferences; +import android.graphics.Point; +import android.hardware.Camera; +import android.preference.PreferenceManager; +import android.util.Log; +import android.view.Display; +import android.view.Surface; +import android.view.WindowManager; + +import com.google.zxing.client.android.PreferencesActivity; +import com.google.zxing.client.android.camera.open.CameraFacing; +import com.google.zxing.client.android.camera.open.OpenCamera; + +/** + * A class which deals with reading, parsing, and setting the camera parameters which are used to + * configure the camera hardware. + */ +final class CameraConfigurationManager { + + private static final String TAG = "CameraConfiguration"; + + private final Context context; + private int cwNeededRotation; + private int cwRotationFromDisplayToCamera; + private Point screenResolution; + private Point cameraResolution; + private Point bestPreviewSize; + private Point previewSizeOnScreen; + + CameraConfigurationManager(Context context) { + this.context = context; + } + + /** + * Reads, one time, values from the camera that are needed by the app. + */ + void initFromCameraParameters(OpenCamera camera) { + Camera.Parameters parameters = camera.getCamera().getParameters(); + WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + Display display = manager.getDefaultDisplay(); + + int displayRotation = display.getRotation(); + int cwRotationFromNaturalToDisplay; + switch (displayRotation) { + case Surface.ROTATION_0: + cwRotationFromNaturalToDisplay = 0; + break; + case Surface.ROTATION_90: + cwRotationFromNaturalToDisplay = 90; + break; + case Surface.ROTATION_180: + cwRotationFromNaturalToDisplay = 180; + break; + case Surface.ROTATION_270: + cwRotationFromNaturalToDisplay = 270; + break; + default: + // Have seen this return incorrect values like -90 + if (displayRotation % 90 == 0) { + cwRotationFromNaturalToDisplay = (360 + displayRotation) % 360; + } else { + throw new IllegalArgumentException("Bad rotation: " + displayRotation); + } + } + Log.i(TAG, "Display at: " + cwRotationFromNaturalToDisplay); + + int cwRotationFromNaturalToCamera = camera.getOrientation(); + Log.i(TAG, "Camera at: " + cwRotationFromNaturalToCamera); + + // Still not 100% sure about this. But acts like we need to flip this: + if (camera.getFacing() == CameraFacing.FRONT) { + cwRotationFromNaturalToCamera = (360 - cwRotationFromNaturalToCamera) % 360; + Log.i(TAG, "Front camera overriden to: " + cwRotationFromNaturalToCamera); + } + + /* + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + String overrideRotationString; + if (camera.getFacing() == CameraFacing.FRONT) { + overrideRotationString = prefs.getString(PreferencesActivity.KEY_FORCE_CAMERA_ORIENTATION_FRONT, null); + } else { + overrideRotationString = prefs.getString(PreferencesActivity.KEY_FORCE_CAMERA_ORIENTATION, null); + } + if (overrideRotationString != null && !"-".equals(overrideRotationString)) { + Log.i(TAG, "Overriding camera manually to " + overrideRotationString); + cwRotationFromNaturalToCamera = Integer.parseInt(overrideRotationString); + } + */ + + cwRotationFromDisplayToCamera = + (360 + cwRotationFromNaturalToCamera - cwRotationFromNaturalToDisplay) % 360; + Log.i(TAG, "Final display orientation: " + cwRotationFromDisplayToCamera); + if (camera.getFacing() == CameraFacing.FRONT) { + Log.i(TAG, "Compensating rotation for front camera"); + cwNeededRotation = (360 - cwRotationFromDisplayToCamera) % 360; + } else { + cwNeededRotation = cwRotationFromDisplayToCamera; + } + Log.i(TAG, "Clockwise rotation from display to camera: " + cwNeededRotation); + + Point theScreenResolution = new Point(); + display.getSize(theScreenResolution); + screenResolution = theScreenResolution; + Log.i(TAG, "Screen resolution in current orientation: " + screenResolution); + cameraResolution = CameraConfigurationUtils.findBestPreviewSizeValue(parameters, screenResolution); + Log.i(TAG, "Camera resolution: " + cameraResolution); + bestPreviewSize = CameraConfigurationUtils.findBestPreviewSizeValue(parameters, screenResolution); + Log.i(TAG, "Best available preview size: " + bestPreviewSize); + + boolean isScreenPortrait = screenResolution.x < screenResolution.y; + boolean isPreviewSizePortrait = bestPreviewSize.x < bestPreviewSize.y; + + if (isScreenPortrait == isPreviewSizePortrait) { + previewSizeOnScreen = bestPreviewSize; + } else { + previewSizeOnScreen = new Point(bestPreviewSize.y, bestPreviewSize.x); + } + Log.i(TAG, "Preview size on screen: " + previewSizeOnScreen); + } + + void setDesiredCameraParameters(OpenCamera camera, boolean safeMode) { + + Camera theCamera = camera.getCamera(); + Camera.Parameters parameters = theCamera.getParameters(); + + if (parameters == null) { + Log.w(TAG, "Device error: no camera parameters are available. Proceeding without configuration."); + return; + } + + Log.i(TAG, "Initial camera parameters: " + parameters.flatten()); + + if (safeMode) { + Log.w(TAG, "In camera config safe mode -- most settings will not be honored"); + } + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + initializeTorch(parameters, prefs, safeMode); + + CameraConfigurationUtils.setFocus( + parameters, + prefs.getBoolean(PreferencesActivity.KEY_AUTO_FOCUS, true), + prefs.getBoolean(PreferencesActivity.KEY_DISABLE_CONTINUOUS_FOCUS, true), + safeMode); + + if (!safeMode) { + if (prefs.getBoolean(PreferencesActivity.KEY_INVERT_SCAN, false)) { + CameraConfigurationUtils.setInvertColor(parameters); + } + + if (!prefs.getBoolean(PreferencesActivity.KEY_DISABLE_BARCODE_SCENE_MODE, true)) { + CameraConfigurationUtils.setBarcodeSceneMode(parameters); + } + + if (!prefs.getBoolean(PreferencesActivity.KEY_DISABLE_METERING, true)) { + CameraConfigurationUtils.setVideoStabilization(parameters); + CameraConfigurationUtils.setFocusArea(parameters); + CameraConfigurationUtils.setMetering(parameters); + } + + } + + parameters.setPreviewSize(bestPreviewSize.x, bestPreviewSize.y); + + theCamera.setParameters(parameters); + + theCamera.setDisplayOrientation(cwRotationFromDisplayToCamera); + + Camera.Parameters afterParameters = theCamera.getParameters(); + Camera.Size afterSize = afterParameters.getPreviewSize(); + if (afterSize != null && (bestPreviewSize.x != afterSize.width || bestPreviewSize.y != afterSize.height)) { + Log.w(TAG, "Camera said it supported preview size " + bestPreviewSize.x + 'x' + bestPreviewSize.y + + ", but after setting it, preview size is " + afterSize.width + 'x' + afterSize.height); + bestPreviewSize.x = afterSize.width; + bestPreviewSize.y = afterSize.height; + } + } + + Point getBestPreviewSize() { + return bestPreviewSize; + } + + Point getPreviewSizeOnScreen() { + return previewSizeOnScreen; + } + + Point getCameraResolution() { + return cameraResolution; + } + + Point getScreenResolution() { + return screenResolution; + } + + int getCWNeededRotation() { + return cwNeededRotation; + } + + boolean getTorchState(Camera camera) { + if (camera != null) { + Camera.Parameters parameters = camera.getParameters(); + if (parameters != null) { + String flashMode = camera.getParameters().getFlashMode(); + return flashMode != null && + (Camera.Parameters.FLASH_MODE_ON.equals(flashMode) || + Camera.Parameters.FLASH_MODE_TORCH.equals(flashMode)); + } + } + return false; + } + + void setTorch(Camera camera, boolean newSetting) { + Camera.Parameters parameters = camera.getParameters(); + doSetTorch(parameters, newSetting, false); + camera.setParameters(parameters); + } + + private void initializeTorch(Camera.Parameters parameters, SharedPreferences prefs, boolean safeMode) { + boolean currentSetting = FrontLightMode.readPref(prefs) == FrontLightMode.ON; + doSetTorch(parameters, currentSetting, safeMode); + } + + private void doSetTorch(Camera.Parameters parameters, boolean newSetting, boolean safeMode) { + CameraConfigurationUtils.setTorch(parameters, newSetting); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + if (!safeMode && !prefs.getBoolean(PreferencesActivity.KEY_DISABLE_EXPOSURE, true)) { + CameraConfigurationUtils.setBestExposure(parameters, newSetting); + } + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/camera/CameraManager.java b/app/src/main/java/com/google/zxing/client/android/camera/CameraManager.java new file mode 100644 index 0000000..9e5478f --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/camera/CameraManager.java @@ -0,0 +1,332 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.camera; + +import android.content.Context; +import android.graphics.Point; +import android.graphics.Rect; +import android.hardware.Camera; +import android.os.Handler; +import android.util.Log; +import android.view.SurfaceHolder; +import com.google.zxing.PlanarYUVLuminanceSource; +import com.google.zxing.client.android.camera.open.OpenCamera; +import com.google.zxing.client.android.camera.open.OpenCameraInterface; + +import java.io.IOException; + +/** + * This object wraps the Camera service object and expects to be the only one talking to it. The + * implementation encapsulates the steps needed to take preview-sized images, which are used for + * both preview and decoding. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class CameraManager { + + private static final String TAG = CameraManager.class.getSimpleName(); + + private static final int MIN_FRAME_WIDTH = 240; + private static final int MIN_FRAME_HEIGHT = 240; + private static final int MAX_FRAME_WIDTH = 1200; // = 5/8 * 1920 + private static final int MAX_FRAME_HEIGHT = 675; // = 5/8 * 1080 + + private final Context context; + private final CameraConfigurationManager configManager; + private OpenCamera camera; + private AutoFocusManager autoFocusManager; + private Rect framingRect; + private Rect framingRectInPreview; + private boolean initialized; + private boolean previewing; + private int requestedCameraId = OpenCameraInterface.NO_REQUESTED_CAMERA; + private int requestedFramingRectWidth; + private int requestedFramingRectHeight; + /** + * Preview frames are delivered here, which we pass on to the registered handler. Make sure to + * clear the handler so it will only receive one message. + */ + private final PreviewCallback previewCallback; + + public CameraManager(Context context) { + this.context = context; + this.configManager = new CameraConfigurationManager(context); + previewCallback = new PreviewCallback(configManager); + } + + /** + * Opens the camera driver and initializes the hardware parameters. + * + * @param holder The surface object which the camera will draw preview frames into. + * @throws IOException Indicates the camera driver failed to open. + */ + public synchronized void openDriver(SurfaceHolder holder) throws IOException { + OpenCamera theCamera = camera; + if (theCamera == null) { + theCamera = OpenCameraInterface.open(requestedCameraId); + if (theCamera == null) { + throw new IOException("Camera.open() failed to return object from driver"); + } + camera = theCamera; + } + + if (!initialized) { + initialized = true; + configManager.initFromCameraParameters(theCamera); + if (requestedFramingRectWidth > 0 && requestedFramingRectHeight > 0) { + setManualFramingRect(requestedFramingRectWidth, requestedFramingRectHeight); + requestedFramingRectWidth = 0; + requestedFramingRectHeight = 0; + } + } + + Camera cameraObject = theCamera.getCamera(); + Camera.Parameters parameters = cameraObject.getParameters(); + String parametersFlattened = parameters == null ? null : parameters.flatten(); // Save these, temporarily + try { + configManager.setDesiredCameraParameters(theCamera, false); + } catch (RuntimeException re) { + // Driver failed + Log.w(TAG, "Camera rejected parameters. Setting only minimal safe-mode parameters"); + Log.i(TAG, "Resetting to saved camera params: " + parametersFlattened); + // Reset: + if (parametersFlattened != null) { + parameters = cameraObject.getParameters(); + parameters.unflatten(parametersFlattened); + try { + cameraObject.setParameters(parameters); + configManager.setDesiredCameraParameters(theCamera, true); + } catch (RuntimeException re2) { + // Well, darn. Give up + Log.w(TAG, "Camera rejected even safe-mode parameters! No configuration"); + } + } + } + cameraObject.setPreviewDisplay(holder); + + } + + public synchronized boolean isOpen() { + return camera != null; + } + + /** + * Closes the camera driver if still in use. + */ + public synchronized void closeDriver() { + if (camera != null) { + camera.getCamera().release(); + camera = null; + // Make sure to clear these each time we close the camera, so that any scanning rect + // requested by intent is forgotten. + framingRect = null; + framingRectInPreview = null; + } + } + + /** + * Asks the camera hardware to begin drawing preview frames to the screen. + */ + public synchronized void startPreview() { + OpenCamera theCamera = camera; + if (theCamera != null && !previewing) { + theCamera.getCamera().startPreview(); + previewing = true; + autoFocusManager = new AutoFocusManager(context, theCamera.getCamera()); + } + } + + /** + * Tells the camera to stop drawing preview frames. + */ + public synchronized void stopPreview() { + if (autoFocusManager != null) { + autoFocusManager.stop(); + autoFocusManager = null; + } + if (camera != null && previewing) { + camera.getCamera().stopPreview(); + previewCallback.setHandler(null, 0); + previewing = false; + } + } + + /** + * Convenience method for {@link com.google.zxing.client.android.CaptureActivity} + * + * @param newSetting if {@code true}, light should be turned on if currently off. And vice versa. + */ + public synchronized void setTorch(boolean newSetting) { + OpenCamera theCamera = camera; + if (theCamera != null) { + if (newSetting != configManager.getTorchState(theCamera.getCamera())) { + boolean wasAutoFocusManager = autoFocusManager != null; + if (wasAutoFocusManager) { + autoFocusManager.stop(); + autoFocusManager = null; + } + configManager.setTorch(theCamera.getCamera(), newSetting); + if (wasAutoFocusManager) { + autoFocusManager = new AutoFocusManager(context, theCamera.getCamera()); + autoFocusManager.start(); + } + } + } + } + + /** + * A single preview frame will be returned to the handler supplied. The data will arrive as byte[] + * in the message.obj field, with width and height encoded as message.arg1 and message.arg2, + * respectively. + * + * @param handler The handler to send the message to. + * @param message The what field of the message to be sent. + */ + public synchronized void requestPreviewFrame(Handler handler, int message) { + OpenCamera theCamera = camera; + if (theCamera != null && previewing) { + previewCallback.setHandler(handler, message); + theCamera.getCamera().setOneShotPreviewCallback(previewCallback); + } + } + + /** + * Calculates the framing rect which the UI should draw to show the user where to place the + * barcode. This target helps with alignment as well as forces the user to hold the device + * far enough away to ensure the image will be in focus. + * + * @return The rectangle to draw on screen in window coordinates. + */ + public synchronized Rect getFramingRect() { + if (framingRect == null) { + if (camera == null) { + return null; + } + Point screenResolution = configManager.getScreenResolution(); + if (screenResolution == null) { + // Called early, before init even finished + return null; + } + + int width = findDesiredDimensionInRange(screenResolution.x, MIN_FRAME_WIDTH, MAX_FRAME_WIDTH); + int height = findDesiredDimensionInRange(screenResolution.y, MIN_FRAME_HEIGHT, MAX_FRAME_HEIGHT); + + int leftOffset = (screenResolution.x - width) / 2; + int topOffset = (screenResolution.y - height) / 2; + framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height); + Log.d(TAG, "Calculated framing rect: " + framingRect); + } + return framingRect; + } + + private static int findDesiredDimensionInRange(int resolution, int hardMin, int hardMax) { + int dim = 5 * resolution / 8; // Target 5/8 of each dimension + if (dim < hardMin) { + return hardMin; + } + if (dim > hardMax) { + return hardMax; + } + return dim; + } + + /** + * Like {@link #getFramingRect} but coordinates are in terms of the preview frame, + * not UI / screen. + * + * @return {@link Rect} expressing barcode scan area in terms of the preview size + */ + public synchronized Rect getFramingRectInPreview() { + if (framingRectInPreview == null) { + Rect framingRect = getFramingRect(); + if (framingRect == null) { + return null; + } + Rect rect = new Rect(framingRect); + Point cameraResolution = configManager.getCameraResolution(); + Point screenResolution = configManager.getScreenResolution(); + if (cameraResolution == null || screenResolution == null) { + // Called early, before init even finished + return null; + } + rect.left = rect.left * cameraResolution.x / screenResolution.x; + rect.right = rect.right * cameraResolution.x / screenResolution.x; + rect.top = rect.top * cameraResolution.y / screenResolution.y; + rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y; + framingRectInPreview = rect; + } + return framingRectInPreview; + } + + + /** + * Allows third party apps to specify the camera ID, rather than determine + * it automatically based on available cameras and their orientation. + * + * @param cameraId camera ID of the camera to use. A negative value means "no preference". + */ + public synchronized void setManualCameraId(int cameraId) { + requestedCameraId = cameraId; + } + + /** + * Allows third party apps to specify the scanning rectangle dimensions, rather than determine + * them automatically based on screen resolution. + * + * @param width The width in pixels to scan. + * @param height The height in pixels to scan. + */ + public synchronized void setManualFramingRect(int width, int height) { + if (initialized) { + Point screenResolution = configManager.getScreenResolution(); + if (width > screenResolution.x) { + width = screenResolution.x; + } + if (height > screenResolution.y) { + height = screenResolution.y; + } + int leftOffset = (screenResolution.x - width) / 2; + int topOffset = (screenResolution.y - height) / 2; + framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height); + Log.d(TAG, "Calculated manual framing rect: " + framingRect); + framingRectInPreview = null; + } else { + requestedFramingRectWidth = width; + requestedFramingRectHeight = height; + } + } + + /** + * A factory method to build the appropriate LuminanceSource object based on the format + * of the preview buffers, as described by Camera.Parameters. + * + * @param data A preview frame. + * @param width The width of the image. + * @param height The height of the image. + * @return A PlanarYUVLuminanceSource instance. + */ + public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int width, int height) { + Rect rect = getFramingRectInPreview(); + if (rect == null) { + return null; + } + // Go ahead and assume it's YUV rather than die. + return new PlanarYUVLuminanceSource(data, width, height, rect.left, rect.top, + rect.width(), rect.height(), false); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/camera/FrontLightMode.java b/app/src/main/java/com/google/zxing/client/android/camera/FrontLightMode.java new file mode 100644 index 0000000..3fbbb59 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/camera/FrontLightMode.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.camera; + +import android.content.SharedPreferences; +import com.google.zxing.client.android.PreferencesActivity; + +/** + * Enumerates settings of the preference controlling the front light. + */ +public enum FrontLightMode { + + /** Always on. */ + ON, + /** On only when ambient light is low. */ + AUTO, + /** Always off. */ + OFF; + + private static FrontLightMode parse(String modeString) { + return modeString == null ? OFF : valueOf(modeString); + } + + public static FrontLightMode readPref(SharedPreferences sharedPrefs) { + return parse(sharedPrefs.getString(PreferencesActivity.KEY_FRONT_LIGHT_MODE, OFF.toString())); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/camera/PreviewCallback.java b/app/src/main/java/com/google/zxing/client/android/camera/PreviewCallback.java new file mode 100644 index 0000000..7dc7035 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/camera/PreviewCallback.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.camera; + +import android.graphics.Point; +import android.hardware.Camera; +import android.os.Handler; +import android.os.Message; +import android.util.Log; + +final class PreviewCallback implements Camera.PreviewCallback { + + private static final String TAG = PreviewCallback.class.getSimpleName(); + + private final CameraConfigurationManager configManager; + private Handler previewHandler; + private int previewMessage; + + PreviewCallback(CameraConfigurationManager configManager) { + this.configManager = configManager; + } + + void setHandler(Handler previewHandler, int previewMessage) { + this.previewHandler = previewHandler; + this.previewMessage = previewMessage; + } + + @Override + public void onPreviewFrame(byte[] data, Camera camera) { + Point cameraResolution = configManager.getCameraResolution(); + Handler thePreviewHandler = previewHandler; + if (cameraResolution != null && thePreviewHandler != null) { + Message message = thePreviewHandler.obtainMessage(previewMessage, cameraResolution.x, + cameraResolution.y, data); + message.sendToTarget(); + previewHandler = null; + } else { + Log.d(TAG, "Got preview callback, but no handler or resolution available"); + } + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/camera/open/CameraFacing.java b/app/src/main/java/com/google/zxing/client/android/camera/open/CameraFacing.java new file mode 100644 index 0000000..20fd4e3 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/camera/open/CameraFacing.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2015 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.camera.open; + +public enum CameraFacing { + + BACK, // must be value 0! + FRONT, // must be value 1! + +} diff --git a/app/src/main/java/com/google/zxing/client/android/camera/open/OpenCamera.java b/app/src/main/java/com/google/zxing/client/android/camera/open/OpenCamera.java new file mode 100644 index 0000000..ddac734 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/camera/open/OpenCamera.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2015 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.camera.open; + +import android.hardware.Camera; + +public final class OpenCamera { + + private final int index; + private final Camera camera; + private final CameraFacing facing; + private final int orientation; + + public OpenCamera(int index, Camera camera, CameraFacing facing, int orientation) { + this.index = index; + this.camera = camera; + this.facing = facing; + this.orientation = orientation; + } + + public Camera getCamera() { + return camera; + } + + public CameraFacing getFacing() { + return facing; + } + + public int getOrientation() { + return orientation; + } + + @Override + public String toString() { + return "Camera #" + index + " : " + facing + ',' + orientation; + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/camera/open/OpenCameraInterface.java b/app/src/main/java/com/google/zxing/client/android/camera/open/OpenCameraInterface.java new file mode 100644 index 0000000..24e0f13 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/camera/open/OpenCameraInterface.java @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.camera.open; + +import android.hardware.Camera; +import android.util.Log; + +public final class OpenCameraInterface { + + private static final String TAG = OpenCameraInterface.class.getName(); + + private OpenCameraInterface() { + } + + /** For {@link #open(int)}, means no preference for which camera to open. */ + public static final int NO_REQUESTED_CAMERA = -1; + + /** + * Opens the requested camera with {@link Camera#open(int)}, if one exists. + * + * @param cameraId camera ID of the camera to use. A negative value + * or {@link #NO_REQUESTED_CAMERA} means "no preference", in which case a rear-facing + * camera is returned if possible or else any camera + * @return handle to {@link OpenCamera} that was opened + */ + public static OpenCamera open(int cameraId) { + + int numCameras = Camera.getNumberOfCameras(); + if (numCameras == 0) { + Log.w(TAG, "No cameras!"); + return null; + } + + boolean explicitRequest = cameraId >= 0; + + Camera.CameraInfo selectedCameraInfo = null; + int index; + if (explicitRequest) { + index = cameraId; + selectedCameraInfo = new Camera.CameraInfo(); + Camera.getCameraInfo(index, selectedCameraInfo); + } else { + index = 0; + while (index < numCameras) { + Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); + Camera.getCameraInfo(index, cameraInfo); + CameraFacing reportedFacing = CameraFacing.values()[cameraInfo.facing]; + if (reportedFacing == CameraFacing.BACK) { + selectedCameraInfo = cameraInfo; + break; + } + index++; + } + } + + Camera camera; + if (index < numCameras) { + Log.i(TAG, "Opening camera #" + index); + camera = Camera.open(index); + } else { + if (explicitRequest) { + Log.w(TAG, "Requested camera does not exist: " + cameraId); + camera = null; + } else { + Log.i(TAG, "No camera facing " + CameraFacing.BACK + "; returning camera #0"); + camera = Camera.open(0); + selectedCameraInfo = new Camera.CameraInfo(); + Camera.getCameraInfo(0, selectedCameraInfo); + } + } + + if (camera == null) { + return null; + } + return new OpenCamera(index, + camera, + CameraFacing.values()[selectedCameraInfo.facing], + selectedCameraInfo.orientation); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/clipboard/ClipboardInterface.java b/app/src/main/java/com/google/zxing/client/android/clipboard/ClipboardInterface.java new file mode 100644 index 0000000..3ba0603 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/clipboard/ClipboardInterface.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.clipboard; + +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.util.Log; + +public final class ClipboardInterface { + + private static final String TAG = ClipboardInterface.class.getSimpleName(); + + private ClipboardInterface() { + } + + public static CharSequence getText(Context context) { + ClipboardManager clipboard = getManager(context); + ClipData clip = clipboard.getPrimaryClip(); + return hasText(context) ? clip.getItemAt(0).coerceToText(context) : null; + } + + public static void setText(CharSequence text, Context context) { + if (text != null) { + try { + getManager(context).setPrimaryClip(ClipData.newPlainText(null, text)); + } catch (NullPointerException | IllegalStateException e) { + // Have seen this in the wild, bizarrely + Log.w(TAG, "Clipboard bug", e); + } + } + } + + public static boolean hasText(Context context) { + ClipboardManager clipboard = getManager(context); + ClipData clip = clipboard.getPrimaryClip(); + return clip != null && clip.getItemCount() > 0; + } + + private static ClipboardManager getManager(Context context) { + return (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/encode/ContactEncoder.java b/app/src/main/java/com/google/zxing/client/android/encode/ContactEncoder.java new file mode 100644 index 0000000..41639a9 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/encode/ContactEncoder.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2011 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.encode; + +import java.util.Collection; +import java.util.HashSet; +import java.util.List; + +/** + * Implementations encode according to some scheme for encoding contact information, like VCard or + * MECARD. + * + * @author Sean Owen + */ +abstract class ContactEncoder { + + /** + * @return first, the best effort encoding of all data in the appropriate format; second, a + * display-appropriate version of the contact information + */ + abstract String[] encode(List names, + String organization, + List addresses, + List phones, + List phoneTypes, + List emails, + List urls, + String note); + + /** + * @return null if s is null or empty, or result of s.trim() otherwise + */ + static String trim(String s) { + if (s == null) { + return null; + } + String result = s.trim(); + return result.isEmpty() ? null : result; + } + + static void append(StringBuilder newContents, + StringBuilder newDisplayContents, + String prefix, + String value, + Formatter fieldFormatter, + char terminator) { + String trimmed = trim(value); + if (trimmed != null) { + newContents.append(prefix).append(fieldFormatter.format(trimmed, 0)).append(terminator); + newDisplayContents.append(trimmed).append('\n'); + } + } + + static void appendUpToUnique(StringBuilder newContents, + StringBuilder newDisplayContents, + String prefix, + List values, + int max, + Formatter displayFormatter, + Formatter fieldFormatter, + char terminator) { + if (values == null) { + return; + } + int count = 0; + Collection uniques = new HashSet<>(2); + for (int i = 0; i < values.size(); i++) { + String value = values.get(i); + String trimmed = trim(value); + if (trimmed != null && !trimmed.isEmpty() && !uniques.contains(trimmed)) { + newContents.append(prefix).append(fieldFormatter.format(trimmed, i)).append(terminator); + CharSequence display = displayFormatter == null ? trimmed : displayFormatter.format(trimmed, i); + newDisplayContents.append(display).append('\n'); + if (++count == max) { + break; + } + uniques.add(trimmed); + } + } + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/encode/EncodeActivity.java b/app/src/main/java/com/google/zxing/client/android/encode/EncodeActivity.java new file mode 100644 index 0000000..1165c52 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/encode/EncodeActivity.java @@ -0,0 +1,243 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.encode; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.Point; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.util.Log; +import android.view.Display; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.WindowManager; +import android.widget.ImageView; +import android.widget.TextView; + +import com.google.zxing.WriterException; +import com.google.zxing.client.android.Contents; +import com.google.zxing.client.android.FinishListener; +import com.google.zxing.client.android.Intents; + +import net.foucry.pilldroid.R; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.regex.Pattern; + +/** + * This class encodes data from an Intent into a QR code, and then displays it full screen so that + * another person can scan it with their device. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class EncodeActivity extends Activity { + + private static final String TAG = EncodeActivity.class.getSimpleName(); + + private static final int MAX_BARCODE_FILENAME_LENGTH = 24; + private static final Pattern NOT_ALPHANUMERIC = Pattern.compile("[^A-Za-z0-9]"); + private static final String USE_VCARD_KEY = "USE_VCARD"; + + private QRCodeEncoder qrCodeEncoder; + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + Intent intent = getIntent(); + if (intent == null) { + finish(); + } else { + String action = intent.getAction(); + if (Intents.Encode.ACTION.equals(action) || Intent.ACTION_SEND.equals(action)) { + setContentView(R.layout.encode); + } else { + finish(); + } + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater menuInflater = getMenuInflater(); + menuInflater.inflate(R.menu.encode, menu); + boolean useVcard = qrCodeEncoder != null && qrCodeEncoder.isUseVCard(); + int encodeNameResource = useVcard ? R.string.menu_encode_mecard : R.string.menu_encode_vcard; + MenuItem encodeItem = menu.findItem(R.id.menu_encode); + encodeItem.setTitle(encodeNameResource); + Intent intent = getIntent(); + if (intent != null) { + String type = intent.getStringExtra(Intents.Encode.TYPE); + encodeItem.setVisible(Contents.Type.CONTACT.equals(type)); + } + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_share: + share(); + return true; + case R.id.menu_encode: + Intent intent = getIntent(); + if (intent == null) { + return false; + } + intent.putExtra(USE_VCARD_KEY, !qrCodeEncoder.isUseVCard()); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + finish(); + return true; + default: + return false; + } + } + + private void share() { + QRCodeEncoder encoder = qrCodeEncoder; + if (encoder == null) { // Odd + Log.w(TAG, "No existing barcode to send?"); + return; + } + + String contents = encoder.getContents(); + if (contents == null) { + Log.w(TAG, "No existing barcode to send?"); + return; + } + + Bitmap bitmap; + try { + bitmap = encoder.encodeAsBitmap(); + } catch (WriterException we) { + Log.w(TAG, we); + return; + } + if (bitmap == null) { + return; + } + + File bsRoot = new File(Environment.getExternalStorageDirectory(), "BarcodeScanner"); + File barcodesRoot = new File(bsRoot, "Barcodes"); + if (!barcodesRoot.exists() && !barcodesRoot.mkdirs()) { + Log.w(TAG, "Couldn't make dir " + barcodesRoot); + showErrorMessage(R.string.msg_unmount_usb); + return; + } + File barcodeFile = new File(barcodesRoot, makeBarcodeFileName(contents) + ".png"); + if (!barcodeFile.delete()) { + Log.w(TAG, "Could not delete " + barcodeFile); + // continue anyway + } + FileOutputStream fos = null; + try { + fos = new FileOutputStream(barcodeFile); + bitmap.compress(Bitmap.CompressFormat.PNG, 0, fos); + } catch (FileNotFoundException fnfe) { + Log.w(TAG, "Couldn't access file " + barcodeFile + " due to " + fnfe); + showErrorMessage(R.string.msg_unmount_usb); + return; + } finally { + if (fos != null) { + try { + fos.close(); + } catch (IOException ioe) { + // do nothing + } + } + } + + Intent intent = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:")); + intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.app_name) + " - " + encoder.getTitle()); + intent.putExtra(Intent.EXTRA_TEXT, contents); + intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + barcodeFile.getAbsolutePath())); + intent.setType("image/png"); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + startActivity(Intent.createChooser(intent, null)); + } + + private static CharSequence makeBarcodeFileName(CharSequence contents) { + String fileName = NOT_ALPHANUMERIC.matcher(contents).replaceAll("_"); + if (fileName.length() > MAX_BARCODE_FILENAME_LENGTH) { + fileName = fileName.substring(0, MAX_BARCODE_FILENAME_LENGTH); + } + return fileName; + } + + @Override + protected void onResume() { + super.onResume(); + // This assumes the view is full screen, which is a good assumption + WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE); + Display display = manager.getDefaultDisplay(); + Point displaySize = new Point(); + display.getSize(displaySize); + int width = displaySize.x; + int height = displaySize.y; + int smallerDimension = width < height ? width : height; + smallerDimension = smallerDimension * 7 / 8; + + Intent intent = getIntent(); + if (intent == null) { + return; + } + + try { + boolean useVCard = intent.getBooleanExtra(USE_VCARD_KEY, false); + qrCodeEncoder = new QRCodeEncoder(this, intent, smallerDimension, useVCard); + Bitmap bitmap = qrCodeEncoder.encodeAsBitmap(); + if (bitmap == null) { + Log.w(TAG, "Could not encode barcode"); + showErrorMessage(R.string.msg_encode_contents_failed); + qrCodeEncoder = null; + return; + } + + ImageView view = (ImageView) findViewById(R.id.image_view); + view.setImageBitmap(bitmap); + + TextView contents = (TextView) findViewById(R.id.contents_text_view); + if (intent.getBooleanExtra(Intents.Encode.SHOW_CONTENTS, true)) { + contents.setText(qrCodeEncoder.getDisplayContents()); + setTitle(qrCodeEncoder.getTitle()); + } else { + contents.setText(""); + setTitle(""); + } + } catch (WriterException e) { + Log.w(TAG, "Could not encode barcode", e); + showErrorMessage(R.string.msg_encode_contents_failed); + qrCodeEncoder = null; + } + } + + private void showErrorMessage(int message) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage(message); + builder.setPositiveButton(R.string.button_ok, new FinishListener(this)); + builder.setOnCancelListener(new FinishListener(this)); + builder.show(); + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/encode/Formatter.java b/app/src/main/java/com/google/zxing/client/android/encode/Formatter.java new file mode 100644 index 0000000..9e0ae85 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/encode/Formatter.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2011 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.encode; + +/** + * Encapsulates some simple formatting logic, to aid refactoring in {@link ContactEncoder}. + * + * @author Sean Owen + */ +interface Formatter { + + /** + * @param value value to format + * @param index index of value in a list of values to be formatted + * @return formatted value + */ + CharSequence format(CharSequence value, int index); + +} diff --git a/app/src/main/java/com/google/zxing/client/android/encode/MECARDContactEncoder.java b/app/src/main/java/com/google/zxing/client/android/encode/MECARDContactEncoder.java new file mode 100644 index 0000000..f41d854 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/encode/MECARDContactEncoder.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2011 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.encode; + +import android.telephony.PhoneNumberUtils; + +import java.util.List; +import java.util.regex.Pattern; + +/** + * Encodes contact information according to the MECARD format. + * + * @author Sean Owen + */ +final class MECARDContactEncoder extends ContactEncoder { + + private static final char TERMINATOR = ';'; + + @Override + public String[] encode(List names, + String organization, + List addresses, + List phones, + List phoneTypes, + List emails, + List urls, + String note) { + StringBuilder newContents = new StringBuilder(100); + newContents.append("MECARD:"); + + StringBuilder newDisplayContents = new StringBuilder(100); + + Formatter fieldFormatter = new MECARDFieldFormatter(); + + appendUpToUnique(newContents, newDisplayContents, "N", names, 1, new + MECARDNameDisplayFormatter(), fieldFormatter, TERMINATOR); + + append(newContents, newDisplayContents, "ORG", organization, fieldFormatter, TERMINATOR); + + appendUpToUnique(newContents, newDisplayContents, "ADR", addresses, 1, null, fieldFormatter, TERMINATOR); + + appendUpToUnique(newContents, newDisplayContents, "TEL", phones, Integer.MAX_VALUE, + new MECARDTelDisplayFormatter(), fieldFormatter, TERMINATOR); + + appendUpToUnique(newContents, newDisplayContents, "EMAIL", emails, Integer.MAX_VALUE, null, + fieldFormatter, TERMINATOR); + + appendUpToUnique(newContents, newDisplayContents, "URL", urls, Integer.MAX_VALUE, null, + fieldFormatter, TERMINATOR); + + append(newContents, newDisplayContents, "NOTE", note, fieldFormatter, TERMINATOR); + + newContents.append(';'); + + return new String[] { newContents.toString(), newDisplayContents.toString() }; + } + + private static class MECARDFieldFormatter implements Formatter { + private static final Pattern RESERVED_MECARD_CHARS = Pattern.compile("([\\\\:;])"); + private static final Pattern NEWLINE = Pattern.compile("\\n"); + @Override + public CharSequence format(CharSequence value, int index) { + return ':' + NEWLINE.matcher(RESERVED_MECARD_CHARS.matcher(value).replaceAll("\\\\$1")).replaceAll(""); + } + } + + private static class MECARDTelDisplayFormatter implements Formatter { + private static final Pattern NOT_DIGITS = Pattern.compile("[^0-9]+"); + @Override + public CharSequence format(CharSequence value, int index) { + return NOT_DIGITS.matcher(PhoneNumberUtils.formatNumber(value.toString())).replaceAll(""); + } + } + + private static class MECARDNameDisplayFormatter implements Formatter { + private static final Pattern COMMA = Pattern.compile(","); + @Override + public CharSequence format(CharSequence value, int index) { + return COMMA.matcher(value).replaceAll(""); + } + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/encode/QRCodeEncoder.java b/app/src/main/java/com/google/zxing/client/android/encode/QRCodeEncoder.java new file mode 100644 index 0000000..3bc98db --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/encode/QRCodeEncoder.java @@ -0,0 +1,390 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.encode; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Bundle; +import android.provider.ContactsContract; +import android.telephony.PhoneNumberUtils; +import android.util.Log; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.Result; +import com.google.zxing.WriterException; +import com.google.zxing.client.android.Contents; +import com.google.zxing.client.android.Intents; +import com.google.zxing.client.result.AddressBookParsedResult; +import com.google.zxing.client.result.ParsedResult; +import com.google.zxing.client.result.ResultParser; +import com.google.zxing.common.BitMatrix; + +import net.foucry.pilldroid.R; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; + +/** + * This class does the work of decoding the user's request and extracting all the data + * to be encoded in a barcode. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +final class QRCodeEncoder { + + private static final String TAG = QRCodeEncoder.class.getSimpleName(); + + private static final int WHITE = 0xFFFFFFFF; + private static final int BLACK = 0xFF000000; + + private final Context activity; + private String contents; + private String displayContents; + private String title; + private BarcodeFormat format; + private final int dimension; + private final boolean useVCard; + + QRCodeEncoder(Context activity, Intent intent, int dimension, boolean useVCard) throws WriterException { + this.activity = activity; + this.dimension = dimension; + this.useVCard = useVCard; + String action = intent.getAction(); + if (Intents.Encode.ACTION.equals(action)) { + encodeContentsFromZXingIntent(intent); + } else if (Intent.ACTION_SEND.equals(action)) { + encodeContentsFromShareIntent(intent); + } + } + + String getContents() { + return contents; + } + + String getDisplayContents() { + return displayContents; + } + + String getTitle() { + return title; + } + + boolean isUseVCard() { + return useVCard; + } + + // It would be nice if the string encoding lived in the core ZXing library, + // but we use platform specific code like PhoneNumberUtils, so it can't. + private boolean encodeContentsFromZXingIntent(Intent intent) { + // Default to QR_CODE if no format given. + String formatString = intent.getStringExtra(Intents.Encode.FORMAT); + format = null; + if (formatString != null) { + try { + format = BarcodeFormat.valueOf(formatString); + } catch (IllegalArgumentException iae) { + // Ignore it then + } + } + if (format == null || format == BarcodeFormat.QR_CODE) { + String type = intent.getStringExtra(Intents.Encode.TYPE); + if (type == null || type.isEmpty()) { + return false; + } + this.format = BarcodeFormat.QR_CODE; + encodeQRCodeContents(intent, type); + } else { + String data = intent.getStringExtra(Intents.Encode.DATA); + if (data != null && !data.isEmpty()) { + contents = data; + displayContents = data; + title = activity.getString(R.string.contents_text); + } + } + return contents != null && !contents.isEmpty(); + } + + // Handles send intents from multitude of Android applications + private void encodeContentsFromShareIntent(Intent intent) throws WriterException { + // Check if this is a plain text encoding, or contact + if (intent.hasExtra(Intent.EXTRA_STREAM)) { + encodeFromStreamExtra(intent); + } else { + encodeFromTextExtras(intent); + } + } + + private void encodeFromTextExtras(Intent intent) throws WriterException { + // Notice: Google Maps shares both URL and details in one text, bummer! + String theContents = ContactEncoder.trim(intent.getStringExtra(Intent.EXTRA_TEXT)); + if (theContents == null) { + theContents = ContactEncoder.trim(intent.getStringExtra("android.intent.extra.HTML_TEXT")); + // Intent.EXTRA_HTML_TEXT + if (theContents == null) { + theContents = ContactEncoder.trim(intent.getStringExtra(Intent.EXTRA_SUBJECT)); + if (theContents == null) { + String[] emails = intent.getStringArrayExtra(Intent.EXTRA_EMAIL); + if (emails != null) { + theContents = ContactEncoder.trim(emails[0]); + } else { + theContents = "?"; + } + } + } + } + + // Trim text to avoid URL breaking. + if (theContents == null || theContents.isEmpty()) { + throw new WriterException("Empty EXTRA_TEXT"); + } + contents = theContents; + // We only do QR code. + format = BarcodeFormat.QR_CODE; + if (intent.hasExtra(Intent.EXTRA_SUBJECT)) { + displayContents = intent.getStringExtra(Intent.EXTRA_SUBJECT); + } else if (intent.hasExtra(Intent.EXTRA_TITLE)) { + displayContents = intent.getStringExtra(Intent.EXTRA_TITLE); + } else { + displayContents = contents; + } + title = activity.getString(R.string.contents_text); + } + + // Handles send intents from the Contacts app, retrieving a contact as a VCARD. + private void encodeFromStreamExtra(Intent intent) throws WriterException { + format = BarcodeFormat.QR_CODE; + Bundle bundle = intent.getExtras(); + if (bundle == null) { + throw new WriterException("No extras"); + } + Uri uri = bundle.getParcelable(Intent.EXTRA_STREAM); + if (uri == null) { + throw new WriterException("No EXTRA_STREAM"); + } + byte[] vcard; + String vcardString; + InputStream stream = null; + try { + stream = activity.getContentResolver().openInputStream(uri); + if (stream == null) { + throw new WriterException("Can't open stream for " + uri); + } + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] buffer = new byte[2048]; + int bytesRead; + while ((bytesRead = stream.read(buffer)) > 0) { + baos.write(buffer, 0, bytesRead); + } + vcard = baos.toByteArray(); + vcardString = new String(vcard, 0, vcard.length, "UTF-8"); + } catch (IOException ioe) { + throw new WriterException(ioe); + } finally { + if (stream != null) { + try { + stream.close(); + } catch (IOException e) { + // continue + } + } + } + Log.d(TAG, "Encoding share intent content:"); + Log.d(TAG, vcardString); + Result result = new Result(vcardString, vcard, null, BarcodeFormat.QR_CODE); + ParsedResult parsedResult = ResultParser.parseResult(result); + if (!(parsedResult instanceof AddressBookParsedResult)) { + throw new WriterException("Result was not an address"); + } + encodeQRCodeContents((AddressBookParsedResult) parsedResult); + if (contents == null || contents.isEmpty()) { + throw new WriterException("No content to encode"); + } + } + + private void encodeQRCodeContents(Intent intent, String type) { + switch (type) { + case Contents.Type.TEXT: + String textData = intent.getStringExtra(Intents.Encode.DATA); + if (textData != null && !textData.isEmpty()) { + contents = textData; + displayContents = textData; + title = activity.getString(R.string.contents_text); + } + break; + + case Contents.Type.EMAIL: + String emailData = ContactEncoder.trim(intent.getStringExtra(Intents.Encode.DATA)); + if (emailData != null) { + contents = "mailto:" + emailData; + displayContents = emailData; + title = activity.getString(R.string.contents_email); + } + break; + + case Contents.Type.PHONE: + String phoneData = ContactEncoder.trim(intent.getStringExtra(Intents.Encode.DATA)); + if (phoneData != null) { + contents = "tel:" + phoneData; + displayContents = PhoneNumberUtils.formatNumber(phoneData); + title = activity.getString(R.string.contents_phone); + } + break; + + case Contents.Type.SMS: + String smsData = ContactEncoder.trim(intent.getStringExtra(Intents.Encode.DATA)); + if (smsData != null) { + contents = "sms:" + smsData; + displayContents = PhoneNumberUtils.formatNumber(smsData); + title = activity.getString(R.string.contents_sms); + } + break; + + case Contents.Type.CONTACT: + Bundle contactBundle = intent.getBundleExtra(Intents.Encode.DATA); + if (contactBundle != null) { + + String name = contactBundle.getString(ContactsContract.Intents.Insert.NAME); + String organization = contactBundle.getString(ContactsContract.Intents.Insert.COMPANY); + String address = contactBundle.getString(ContactsContract.Intents.Insert.POSTAL); + List phones = getAllBundleValues(contactBundle, Contents.PHONE_KEYS); + List phoneTypes = getAllBundleValues(contactBundle, Contents.PHONE_TYPE_KEYS); + List emails = getAllBundleValues(contactBundle, Contents.EMAIL_KEYS); + String url = contactBundle.getString(Contents.URL_KEY); + List urls = url == null ? null : Collections.singletonList(url); + String note = contactBundle.getString(Contents.NOTE_KEY); + + ContactEncoder encoder = useVCard ? new VCardContactEncoder() : new MECARDContactEncoder(); + String[] encoded = encoder.encode(Collections.singletonList(name), + organization, + Collections.singletonList(address), + phones, + phoneTypes, + emails, + urls, + note); + // Make sure we've encoded at least one field. + if (!encoded[1].isEmpty()) { + contents = encoded[0]; + displayContents = encoded[1]; + title = activity.getString(R.string.contents_contact); + } + + } + break; + + case Contents.Type.LOCATION: + Bundle locationBundle = intent.getBundleExtra(Intents.Encode.DATA); + if (locationBundle != null) { + // These must use Bundle.getFloat(), not getDouble(), it's part of the API. + float latitude = locationBundle.getFloat("LAT", Float.MAX_VALUE); + float longitude = locationBundle.getFloat("LONG", Float.MAX_VALUE); + if (latitude != Float.MAX_VALUE && longitude != Float.MAX_VALUE) { + contents = "geo:" + latitude + ',' + longitude; + displayContents = latitude + "," + longitude; + title = activity.getString(R.string.contents_location); + } + } + break; + } + } + + private static List getAllBundleValues(Bundle bundle, String[] keys) { + List values = new ArrayList<>(keys.length); + for (String key : keys) { + Object value = bundle.get(key); + values.add(value == null ? null : value.toString()); + } + return values; + } + + private void encodeQRCodeContents(AddressBookParsedResult contact) { + ContactEncoder encoder = useVCard ? new VCardContactEncoder() : new MECARDContactEncoder(); + String[] encoded = encoder.encode(toList(contact.getNames()), + contact.getOrg(), + toList(contact.getAddresses()), + toList(contact.getPhoneNumbers()), + null, + toList(contact.getEmails()), + toList(contact.getURLs()), + null); + // Make sure we've encoded at least one field. + if (!encoded[1].isEmpty()) { + contents = encoded[0]; + displayContents = encoded[1]; + title = activity.getString(R.string.contents_contact); + } + } + + private static List toList(String[] values) { + return values == null ? null : Arrays.asList(values); + } + + Bitmap encodeAsBitmap() throws WriterException { + String contentsToEncode = contents; + if (contentsToEncode == null) { + return null; + } + Map hints = null; + String encoding = guessAppropriateEncoding(contentsToEncode); + if (encoding != null) { + hints = new EnumMap<>(EncodeHintType.class); + hints.put(EncodeHintType.CHARACTER_SET, encoding); + } + BitMatrix result; + try { + result = new MultiFormatWriter().encode(contentsToEncode, format, dimension, dimension, hints); + } catch (IllegalArgumentException iae) { + // Unsupported format + return null; + } + int width = result.getWidth(); + int height = result.getHeight(); + int[] pixels = new int[width * height]; + for (int y = 0; y < height; y++) { + int offset = y * width; + for (int x = 0; x < width; x++) { + pixels[offset + x] = result.get(x, y) ? BLACK : WHITE; + } + } + + Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + bitmap.setPixels(pixels, 0, width, 0, 0, width, height); + return bitmap; + } + + private static String guessAppropriateEncoding(CharSequence contents) { + // Very crude at the moment + for (int i = 0; i < contents.length(); i++) { + if (contents.charAt(i) > 0xFF) { + return "UTF-8"; + } + } + return null; + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/encode/VCardContactEncoder.java b/app/src/main/java/com/google/zxing/client/android/encode/VCardContactEncoder.java new file mode 100644 index 0000000..56ced33 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/encode/VCardContactEncoder.java @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2011 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.encode; + +import android.provider.ContactsContract; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Encodes contact information according to the vCard format. + * + * @author Sean Owen + */ +final class VCardContactEncoder extends ContactEncoder { + + private static final char TERMINATOR = '\n'; + + @Override + public String[] encode(List names, + String organization, + List addresses, + List phones, + List phoneTypes, + List emails, + List urls, + String note) { + StringBuilder newContents = new StringBuilder(100); + newContents.append("BEGIN:VCARD").append(TERMINATOR); + newContents.append("VERSION:3.0").append(TERMINATOR); + + StringBuilder newDisplayContents = new StringBuilder(100); + + Formatter fieldFormatter = new VCardFieldFormatter(); + + appendUpToUnique(newContents, newDisplayContents, "N", names, 1, null, fieldFormatter, TERMINATOR); + + append(newContents, newDisplayContents, "ORG", organization, fieldFormatter, TERMINATOR); + + appendUpToUnique(newContents, newDisplayContents, "ADR", addresses, 1, null, fieldFormatter, TERMINATOR); + + List>> phoneMetadata = buildPhoneMetadata(phones, phoneTypes); + appendUpToUnique(newContents, newDisplayContents, "TEL", phones, Integer.MAX_VALUE, + new VCardTelDisplayFormatter(phoneMetadata), + new VCardFieldFormatter(phoneMetadata), TERMINATOR); + + appendUpToUnique(newContents, newDisplayContents, "EMAIL", emails, Integer.MAX_VALUE, null, + fieldFormatter, TERMINATOR); + + appendUpToUnique(newContents, newDisplayContents, "URL", urls, Integer.MAX_VALUE, null, + fieldFormatter, TERMINATOR); + + append(newContents, newDisplayContents, "NOTE", note, fieldFormatter, TERMINATOR); + + newContents.append("END:VCARD").append(TERMINATOR); + + return new String[] { newContents.toString(), newDisplayContents.toString() }; + } + + static List>> buildPhoneMetadata(Collection phones, List phoneTypes) { + if (phoneTypes == null || phoneTypes.isEmpty()) { + return null; + } + List>> metadataForIndex = new ArrayList<>(); + for (int i = 0; i < phones.size(); i++) { + if (phoneTypes.size() <= i) { + metadataForIndex.add(null); + } else { + Map> metadata = new HashMap<>(); + metadataForIndex.add(metadata); + Set typeTokens = new HashSet<>(); + metadata.put("TYPE", typeTokens); + String typeString = phoneTypes.get(i); + Integer androidType = maybeIntValue(typeString); + if (androidType == null) { + typeTokens.add(typeString); + } else { + String purpose = vCardPurposeLabelForAndroidType(androidType); + String context = vCardContextLabelForAndroidType(androidType); + if (purpose != null) { + typeTokens.add(purpose); + } + if (context != null) { + typeTokens.add(context); + } + } + } + } + return metadataForIndex; + } + + private static Integer maybeIntValue(String value) { + try { + return Integer.valueOf(value); + } catch (NumberFormatException nfe) { + return null; + } + } + + private static String vCardPurposeLabelForAndroidType(int androidType) { + switch (androidType) { + case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME: + case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK: + case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER_FAX: + return "fax"; + case ContactsContract.CommonDataKinds.Phone.TYPE_PAGER: + case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER: + return "pager"; + case ContactsContract.CommonDataKinds.Phone.TYPE_TTY_TDD: + return "textphone"; + case ContactsContract.CommonDataKinds.Phone.TYPE_MMS: + return "text"; + default: + return null; + } + } + + private static String vCardContextLabelForAndroidType(int androidType) { + switch (androidType) { + case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: + case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE: + case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME: + case ContactsContract.CommonDataKinds.Phone.TYPE_PAGER: + return "home"; + case ContactsContract.CommonDataKinds.Phone.TYPE_COMPANY_MAIN: + case ContactsContract.CommonDataKinds.Phone.TYPE_WORK: + case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE: + case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK: + case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_PAGER: + return "work"; + default: + return null; + } + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/encode/VCardFieldFormatter.java b/app/src/main/java/com/google/zxing/client/android/encode/VCardFieldFormatter.java new file mode 100644 index 0000000..070a4cd --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/encode/VCardFieldFormatter.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.encode; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Pattern; + +/** + * @author Sean Owen + */ +final class VCardFieldFormatter implements Formatter { + + private static final Pattern RESERVED_VCARD_CHARS = Pattern.compile("([\\\\,;])"); + private static final Pattern NEWLINE = Pattern.compile("\\n"); + + private final List>> metadataForIndex; + + VCardFieldFormatter() { + this(null); + } + + VCardFieldFormatter(List>> metadataForIndex) { + this.metadataForIndex = metadataForIndex; + } + + @Override + public CharSequence format(CharSequence value, int index) { + value = RESERVED_VCARD_CHARS.matcher(value).replaceAll("\\\\$1"); + value = NEWLINE.matcher(value).replaceAll(""); + Map> metadata = + metadataForIndex == null || metadataForIndex.size() <= index ? null : metadataForIndex.get(index); + value = formatMetadata(value, metadata); + return value; + } + + private static CharSequence formatMetadata(CharSequence value, Map> metadata) { + StringBuilder withMetadata = new StringBuilder(); + if (metadata != null) { + for (Map.Entry> metadatum : metadata.entrySet()) { + Set values = metadatum.getValue(); + if (values == null || values.isEmpty()) { + continue; + } + withMetadata.append(';').append(metadatum.getKey()).append('='); + if (values.size() > 1) { + withMetadata.append('"'); + } + Iterator valuesIt = values.iterator(); + withMetadata.append(valuesIt.next()); + while (valuesIt.hasNext()) { + withMetadata.append(',').append(valuesIt.next()); + } + if (values.size() > 1) { + withMetadata.append('"'); + } + } + } + withMetadata.append(':').append(value); + return withMetadata; + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/encode/VCardTelDisplayFormatter.java b/app/src/main/java/com/google/zxing/client/android/encode/VCardTelDisplayFormatter.java new file mode 100644 index 0000000..f5eec9b --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/encode/VCardTelDisplayFormatter.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.encode; + +import android.telephony.PhoneNumberUtils; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * @author Sean Owen + */ +final class VCardTelDisplayFormatter implements Formatter { + + private final List>> metadataForIndex; + + VCardTelDisplayFormatter() { + this(null); + } + + VCardTelDisplayFormatter(List>> metadataForIndex) { + this.metadataForIndex = metadataForIndex; + } + + @Override + public CharSequence format(CharSequence value, int index) { + value = PhoneNumberUtils.formatNumber(value.toString()); + Map> metadata = + metadataForIndex == null || metadataForIndex.size() <= index ? null : metadataForIndex.get(index); + value = formatMetadata(value, metadata); + return value; + } + + private static CharSequence formatMetadata(CharSequence value, Map> metadata) { + if (metadata == null || metadata.isEmpty()) { + return value; + } + StringBuilder withMetadata = new StringBuilder(); + for (Map.Entry> metadatum : metadata.entrySet()) { + Set values = metadatum.getValue(); + if (values == null || values.isEmpty()) { + continue; + } + Iterator valuesIt = values.iterator(); + withMetadata.append(valuesIt.next()); + while (valuesIt.hasNext()) { + withMetadata.append(',').append(valuesIt.next()); + } + } + if (withMetadata.length() > 0) { + withMetadata.append(' '); + } + withMetadata.append(value); + return withMetadata; + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/history/DBHelper.java b/app/src/main/java/com/google/zxing/client/android/history/DBHelper.java new file mode 100644 index 0000000..41c40a5 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/history/DBHelper.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.history; + +import android.database.sqlite.SQLiteOpenHelper; +import android.database.sqlite.SQLiteDatabase; +import android.content.Context; + +/** + * @author Sean Owen + */ +final class DBHelper extends SQLiteOpenHelper { + + private static final int DB_VERSION = 5; + private static final String DB_NAME = "barcode_scanner_history.db"; + static final String TABLE_NAME = "history"; + static final String ID_COL = "id"; + static final String TEXT_COL = "text"; + static final String FORMAT_COL = "format"; + static final String DISPLAY_COL = "display"; + static final String TIMESTAMP_COL = "timestamp"; + static final String DETAILS_COL = "details"; + + DBHelper(Context context) { + super(context, DB_NAME, null, DB_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase sqLiteDatabase) { + sqLiteDatabase.execSQL( + "CREATE TABLE " + TABLE_NAME + " (" + + ID_COL + " INTEGER PRIMARY KEY, " + + TEXT_COL + " TEXT, " + + FORMAT_COL + " TEXT, " + + DISPLAY_COL + " TEXT, " + + TIMESTAMP_COL + " INTEGER, " + + DETAILS_COL + " TEXT);"); + } + + @Override + public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { + sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); + onCreate(sqLiteDatabase); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/history/HistoryActivity.java b/app/src/main/java/com/google/zxing/client/android/history/HistoryActivity.java new file mode 100644 index 0000000..080af97 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/history/HistoryActivity.java @@ -0,0 +1,163 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.history; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.ListActivity; +import android.content.ActivityNotFoundException; +import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.os.Parcelable; +import android.util.Log; +import android.view.ContextMenu; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import com.google.zxing.client.android.CaptureActivity; +import com.google.zxing.client.android.Intents; + +import net.foucry.pilldroid.R; + +public final class HistoryActivity extends ListActivity { + + private static final String TAG = HistoryActivity.class.getSimpleName(); + + private HistoryManager historyManager; + private ArrayAdapter adapter; + private CharSequence originalTitle; + + @Override + protected void onCreate(Bundle icicle) { + super.onCreate(icicle); + this.historyManager = new HistoryManager(this); + adapter = new HistoryItemAdapter(this); + setListAdapter(adapter); + View listview = getListView(); + registerForContextMenu(listview); + originalTitle = getTitle(); + } + + @Override + protected void onResume() { + super.onResume(); + reloadHistoryItems(); + } + + private void reloadHistoryItems() { + Iterable items = historyManager.buildHistoryItems(); + adapter.clear(); + for (HistoryItem item : items) { + adapter.add(item); + } + setTitle(originalTitle + " (" + adapter.getCount() + ')'); + if (adapter.isEmpty()) { + adapter.add(new HistoryItem(null, null, null)); + } + } + + @Override + protected void onListItemClick(ListView l, View v, int position, long id) { + if (adapter.getItem(position).getResult() != null) { + Intent intent = new Intent(this, CaptureActivity.class); + intent.putExtra(Intents.History.ITEM_NUMBER, position); + setResult(Activity.RESULT_OK, intent); + finish(); + } + } + + @Override + public void onCreateContextMenu(ContextMenu menu, + View v, + ContextMenu.ContextMenuInfo menuInfo) { + int position = ((AdapterView.AdapterContextMenuInfo) menuInfo).position; + if (position >= adapter.getCount() || adapter.getItem(position).getResult() != null) { + menu.add(Menu.NONE, position, position, R.string.history_clear_one_history_text); + } // else it's just that dummy "Empty" message + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + int position = item.getItemId(); + historyManager.deleteHistoryItem(position); + reloadHistoryItems(); + return true; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + if (historyManager.hasHistoryItems()) { + MenuInflater menuInflater = getMenuInflater(); + menuInflater.inflate(R.menu.history, menu); + } + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_history_send: + CharSequence history = historyManager.buildHistory(); + Parcelable historyFile = HistoryManager.saveHistory(history.toString()); + if (historyFile == null) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage(R.string.msg_unmount_usb); + builder.setPositiveButton(R.string.button_ok, null); + builder.show(); + } else { + Intent intent = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:")); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + String subject = getResources().getString(R.string.history_email_title); + intent.putExtra(Intent.EXTRA_SUBJECT, subject); + intent.putExtra(Intent.EXTRA_TEXT, subject); + intent.putExtra(Intent.EXTRA_STREAM, historyFile); + intent.setType("text/csv"); + try { + startActivity(intent); + } catch (ActivityNotFoundException anfe) { + Log.w(TAG, anfe.toString()); + } + } + break; + case R.id.menu_history_clear_text: + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage(R.string.msg_sure); + builder.setCancelable(true); + builder.setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int i2) { + historyManager.clearHistory(); + dialog.dismiss(); + finish(); + } + }); + builder.setNegativeButton(R.string.button_cancel, null); + builder.show(); + break; + default: + return super.onOptionsItemSelected(item); + } + return true; + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/history/HistoryItem.java b/app/src/main/java/com/google/zxing/client/android/history/HistoryItem.java new file mode 100644 index 0000000..45da8bd --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/history/HistoryItem.java @@ -0,0 +1,50 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.history; + +import com.google.zxing.Result; + +public final class HistoryItem { + + private final Result result; + private final String display; + private final String details; + + HistoryItem(Result result, String display, String details) { + this.result = result; + this.display = display; + this.details = details; + } + + public Result getResult() { + return result; + } + + public String getDisplayAndDetails() { + StringBuilder displayResult = new StringBuilder(); + if (display == null || display.isEmpty()) { + displayResult.append(result.getText()); + } else { + displayResult.append(display); + } + if (details != null && !details.isEmpty()) { + displayResult.append(" : ").append(details); + } + return displayResult.toString(); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/history/HistoryItemAdapter.java b/app/src/main/java/com/google/zxing/client/android/history/HistoryItemAdapter.java new file mode 100644 index 0000000..762ba2d --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/history/HistoryItemAdapter.java @@ -0,0 +1,71 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.history; + +import android.content.Context; +import android.content.res.Resources; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.LinearLayout; +import android.widget.TextView; +import com.google.zxing.Result; +import net.foucry.pilldroid.R; + +import java.util.ArrayList; + +final class HistoryItemAdapter extends ArrayAdapter { + + private final Context activity; + + HistoryItemAdapter(Context activity) { + super(activity, R.layout.history_list_item, new ArrayList()); + this.activity = activity; + } + + @Override + public View getView(int position, View view, ViewGroup viewGroup) { + View layout; + if (view instanceof LinearLayout) { + layout = view; + } else { + LayoutInflater factory = LayoutInflater.from(activity); + layout = factory.inflate(R.layout.history_list_item, viewGroup, false); + } + + HistoryItem item = getItem(position); + Result result = item.getResult(); + + CharSequence title; + CharSequence detail; + if (result != null) { + title = result.getText(); + detail = item.getDisplayAndDetails(); + } else { + Resources resources = getContext().getResources(); + title = resources.getString(R.string.history_empty); + detail = resources.getString(R.string.history_empty_detail); + } + + ((TextView) layout.findViewById(R.id.history_title)).setText(title); + ((TextView) layout.findViewById(R.id.history_detail)).setText(detail); + + return layout; + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/history/HistoryManager.java b/app/src/main/java/com/google/zxing/client/android/history/HistoryManager.java new file mode 100644 index 0000000..dbb7934 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/history/HistoryManager.java @@ -0,0 +1,366 @@ +/* + * Copyright (C) 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.history; + +import android.database.sqlite.SQLiteException; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.Result; +import com.google.zxing.client.android.Intents; +import com.google.zxing.client.android.PreferencesActivity; +import com.google.zxing.client.android.result.ResultHandler; + +import android.app.Activity; +import android.content.ContentValues; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.net.Uri; +import android.os.Environment; +import android.preference.PreferenceManager; +import android.util.Log; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.nio.charset.Charset; +import java.text.DateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + *

Manages functionality related to scan history.

+ * + * @author Sean Owen + */ +public final class HistoryManager { + + private static final String TAG = HistoryManager.class.getSimpleName(); + + private static final int MAX_ITEMS = 2000; + + private static final String[] COLUMNS = { + DBHelper.TEXT_COL, + DBHelper.DISPLAY_COL, + DBHelper.FORMAT_COL, + DBHelper.TIMESTAMP_COL, + DBHelper.DETAILS_COL, + }; + + private static final String[] COUNT_COLUMN = { "COUNT(1)" }; + + private static final String[] ID_COL_PROJECTION = { DBHelper.ID_COL }; + private static final String[] ID_DETAIL_COL_PROJECTION = { DBHelper.ID_COL, DBHelper.DETAILS_COL }; + + private final Activity activity; + private final boolean enableHistory; + + public HistoryManager(Activity activity) { + this.activity = activity; + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); + enableHistory = prefs.getBoolean(PreferencesActivity.KEY_ENABLE_HISTORY, true); + } + + public boolean hasHistoryItems() { + SQLiteOpenHelper helper = new DBHelper(activity); + SQLiteDatabase db = null; + Cursor cursor = null; + try { + db = helper.getReadableDatabase(); + cursor = db.query(DBHelper.TABLE_NAME, COUNT_COLUMN, null, null, null, null, null); + cursor.moveToFirst(); + return cursor.getInt(0) > 0; + } finally { + close(cursor, db); + } + } + + public List buildHistoryItems() { + SQLiteOpenHelper helper = new DBHelper(activity); + List items = new ArrayList<>(); + SQLiteDatabase db = null; + Cursor cursor = null; + try { + db = helper.getReadableDatabase(); + cursor = db.query(DBHelper.TABLE_NAME, COLUMNS, null, null, null, null, DBHelper.TIMESTAMP_COL + " DESC"); + while (cursor.moveToNext()) { + String text = cursor.getString(0); + String display = cursor.getString(1); + String format = cursor.getString(2); + long timestamp = cursor.getLong(3); + String details = cursor.getString(4); + Result result = new Result(text, null, null, BarcodeFormat.valueOf(format), timestamp); + items.add(new HistoryItem(result, display, details)); + } + } finally { + close(cursor, db); + } + return items; + } + + public HistoryItem buildHistoryItem(int number) { + SQLiteOpenHelper helper = new DBHelper(activity); + SQLiteDatabase db = null; + Cursor cursor = null; + try { + db = helper.getReadableDatabase(); + cursor = db.query(DBHelper.TABLE_NAME, COLUMNS, null, null, null, null, DBHelper.TIMESTAMP_COL + " DESC"); + cursor.move(number + 1); + String text = cursor.getString(0); + String display = cursor.getString(1); + String format = cursor.getString(2); + long timestamp = cursor.getLong(3); + String details = cursor.getString(4); + Result result = new Result(text, null, null, BarcodeFormat.valueOf(format), timestamp); + return new HistoryItem(result, display, details); + } finally { + close(cursor, db); + } + } + + public void deleteHistoryItem(int number) { + SQLiteOpenHelper helper = new DBHelper(activity); + SQLiteDatabase db = null; + Cursor cursor = null; + try { + db = helper.getWritableDatabase(); + cursor = db.query(DBHelper.TABLE_NAME, + ID_COL_PROJECTION, + null, null, null, null, + DBHelper.TIMESTAMP_COL + " DESC"); + cursor.move(number + 1); + db.delete(DBHelper.TABLE_NAME, DBHelper.ID_COL + '=' + cursor.getString(0), null); + } finally { + close(cursor, db); + } + } + + public void addHistoryItem(Result result, ResultHandler handler) { + // Do not save this item to the history if the preference is turned off, or the contents are + // considered secure. + if (!activity.getIntent().getBooleanExtra(Intents.Scan.SAVE_HISTORY, true) || + handler.areContentsSecure() || !enableHistory) { + return; + } + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); + if (!prefs.getBoolean(PreferencesActivity.KEY_REMEMBER_DUPLICATES, false)) { + deletePrevious(result.getText()); + } + + ContentValues values = new ContentValues(); + values.put(DBHelper.TEXT_COL, result.getText()); + values.put(DBHelper.FORMAT_COL, result.getBarcodeFormat().toString()); + values.put(DBHelper.DISPLAY_COL, handler.getDisplayContents().toString()); + values.put(DBHelper.TIMESTAMP_COL, System.currentTimeMillis()); + + SQLiteOpenHelper helper = new DBHelper(activity); + SQLiteDatabase db = null; + try { + db = helper.getWritableDatabase(); + // Insert the new entry into the DB. + db.insert(DBHelper.TABLE_NAME, DBHelper.TIMESTAMP_COL, values); + } finally { + close(null, db); + } + } + + public void addHistoryItemDetails(String itemID, String itemDetails) { + // As we're going to do an update only we don't need need to worry + // about the preferences; if the item wasn't saved it won't be udpated + SQLiteOpenHelper helper = new DBHelper(activity); + SQLiteDatabase db = null; + Cursor cursor = null; + try { + db = helper.getWritableDatabase(); + cursor = db.query(DBHelper.TABLE_NAME, + ID_DETAIL_COL_PROJECTION, + DBHelper.TEXT_COL + "=?", + new String[] { itemID }, + null, + null, + DBHelper.TIMESTAMP_COL + " DESC", + "1"); + String oldID = null; + String oldDetails = null; + if (cursor.moveToNext()) { + oldID = cursor.getString(0); + oldDetails = cursor.getString(1); + } + + if (oldID != null) { + String newDetails; + if (oldDetails == null) { + newDetails = itemDetails; + } else if (oldDetails.contains(itemDetails)) { + newDetails = null; + } else { + newDetails = oldDetails + " : " + itemDetails; + } + if (newDetails != null) { + ContentValues values = new ContentValues(); + values.put(DBHelper.DETAILS_COL, newDetails); + db.update(DBHelper.TABLE_NAME, values, DBHelper.ID_COL + "=?", new String[] { oldID }); + } + } + + } finally { + close(cursor, db); + } + } + + private void deletePrevious(String text) { + SQLiteOpenHelper helper = new DBHelper(activity); + SQLiteDatabase db = null; + try { + db = helper.getWritableDatabase(); + db.delete(DBHelper.TABLE_NAME, DBHelper.TEXT_COL + "=?", new String[] { text }); + } finally { + close(null, db); + } + } + + public void trimHistory() { + SQLiteOpenHelper helper = new DBHelper(activity); + SQLiteDatabase db = null; + Cursor cursor = null; + try { + db = helper.getWritableDatabase(); + cursor = db.query(DBHelper.TABLE_NAME, + ID_COL_PROJECTION, + null, null, null, null, + DBHelper.TIMESTAMP_COL + " DESC"); + cursor.move(MAX_ITEMS); + while (cursor.moveToNext()) { + String id = cursor.getString(0); + Log.i(TAG, "Deleting scan history ID " + id); + db.delete(DBHelper.TABLE_NAME, DBHelper.ID_COL + '=' + id, null); + } + } catch (SQLiteException sqle) { + // We're seeing an error here when called in CaptureActivity.onCreate() in rare cases + // and don't understand it. First theory is that it's transient so can be safely ignored. + Log.w(TAG, sqle); + // continue + } finally { + close(cursor, db); + } + } + + /** + *

Builds a text representation of the scanning history. Each scan is encoded on one + * line, terminated by a line break (\r\n). The values in each line are comma-separated, + * and double-quoted. Double-quotes within values are escaped with a sequence of two + * double-quotes. The fields output are:

+ * + *
    + *
  1. Raw text
  2. + *
  3. Display text
  4. + *
  5. Format (e.g. QR_CODE)
  6. + *
  7. Unix timestamp (milliseconds since the epoch)
  8. + *
  9. Formatted version of timestamp
  10. + *
  11. Supplemental info (e.g. price info for a product barcode)
  12. + *
+ */ + CharSequence buildHistory() { + SQLiteOpenHelper helper = new DBHelper(activity); + SQLiteDatabase db = null; + Cursor cursor = null; + try { + db = helper.getWritableDatabase(); + cursor = db.query(DBHelper.TABLE_NAME, + COLUMNS, + null, null, null, null, + DBHelper.TIMESTAMP_COL + " DESC"); + + DateFormat format = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); + StringBuilder historyText = new StringBuilder(1000); + while (cursor.moveToNext()) { + + historyText.append('"').append(massageHistoryField(cursor.getString(0))).append("\","); + historyText.append('"').append(massageHistoryField(cursor.getString(1))).append("\","); + historyText.append('"').append(massageHistoryField(cursor.getString(2))).append("\","); + historyText.append('"').append(massageHistoryField(cursor.getString(3))).append("\","); + + // Add timestamp again, formatted + long timestamp = cursor.getLong(3); + historyText.append('"').append(massageHistoryField( + format.format(new Date(timestamp)))).append("\","); + + // Above we're preserving the old ordering of columns which had formatted data in position 5 + + historyText.append('"').append(massageHistoryField(cursor.getString(4))).append("\"\r\n"); + } + return historyText; + } finally { + close(cursor, db); + } + } + + void clearHistory() { + SQLiteOpenHelper helper = new DBHelper(activity); + SQLiteDatabase db = null; + try { + db = helper.getWritableDatabase(); + db.delete(DBHelper.TABLE_NAME, null, null); + } finally { + close(null, db); + } + } + + static Uri saveHistory(String history) { + File bsRoot = new File(Environment.getExternalStorageDirectory(), "BarcodeScanner"); + File historyRoot = new File(bsRoot, "History"); + if (!historyRoot.exists() && !historyRoot.mkdirs()) { + Log.w(TAG, "Couldn't make dir " + historyRoot); + return null; + } + File historyFile = new File(historyRoot, "history-" + System.currentTimeMillis() + ".csv"); + OutputStreamWriter out = null; + try { + out = new OutputStreamWriter(new FileOutputStream(historyFile), Charset.forName("UTF-8")); + out.write(history); + return Uri.parse("file://" + historyFile.getAbsolutePath()); + } catch (IOException ioe) { + Log.w(TAG, "Couldn't access file " + historyFile + " due to " + ioe); + return null; + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException ioe) { + // do nothing + } + } + } + } + + private static String massageHistoryField(String value) { + return value == null ? "" : value.replace("\"","\"\""); + } + + private static void close(Cursor cursor, SQLiteDatabase database) { + if (cursor != null) { + cursor.close(); + } + if (database != null) { + database.close(); + } + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/AddressBookResultHandler.java b/app/src/main/java/com/google/zxing/client/android/result/AddressBookResultHandler.java new file mode 100644 index 0000000..4c69e3a --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/AddressBookResultHandler.java @@ -0,0 +1,221 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result; + +import android.app.Activity; +import android.graphics.Typeface; +import android.telephony.PhoneNumberUtils; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.style.StyleSpan; + +import com.google.zxing.client.result.AddressBookParsedResult; +import com.google.zxing.client.result.ParsedResult; + +import net.foucry.pilldroid.R; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +/** + * Handles address book entries. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class AddressBookResultHandler extends ResultHandler { + + private static final DateFormat[] DATE_FORMATS = { + new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH), + new SimpleDateFormat("yyyyMMdd'T'HHmmss", Locale.ENGLISH), + new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH), + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH), + }; + static { + for (DateFormat format : DATE_FORMATS) { + format.setLenient(false); + } + } + + private static final int[] BUTTON_TEXTS = { + R.string.button_add_contact, + R.string.button_show_map, + R.string.button_dial, + R.string.button_email, + }; + + private final boolean[] fields; + private int buttonCount; + + // This takes all the work out of figuring out which buttons/actions should be in which + // positions, based on which fields are present in this barcode. + private int mapIndexToAction(int index) { + if (index < buttonCount) { + int count = -1; + for (int x = 0; x < MAX_BUTTON_COUNT; x++) { + if (fields[x]) { + count++; + } + if (count == index) { + return x; + } + } + } + return -1; + } + + public AddressBookResultHandler(Activity activity, ParsedResult result) { + super(activity, result); + AddressBookParsedResult addressResult = (AddressBookParsedResult) result; + String[] addresses = addressResult.getAddresses(); + boolean hasAddress = addresses != null && addresses.length > 0 && addresses[0] != null && !addresses[0].isEmpty(); + String[] phoneNumbers = addressResult.getPhoneNumbers(); + boolean hasPhoneNumber = phoneNumbers != null && phoneNumbers.length > 0; + String[] emails = addressResult.getEmails(); + boolean hasEmailAddress = emails != null && emails.length > 0; + + fields = new boolean[MAX_BUTTON_COUNT]; + fields[0] = true; // Add contact is always available + fields[1] = hasAddress; + fields[2] = hasPhoneNumber; + fields[3] = hasEmailAddress; + + buttonCount = 0; + for (int x = 0; x < MAX_BUTTON_COUNT; x++) { + if (fields[x]) { + buttonCount++; + } + } + } + + @Override + public int getButtonCount() { + return buttonCount; + } + + @Override + public int getButtonText(int index) { + return BUTTON_TEXTS[mapIndexToAction(index)]; + } + + @Override + public void handleButtonPress(int index) { + AddressBookParsedResult addressResult = (AddressBookParsedResult) getResult(); + String[] addresses = addressResult.getAddresses(); + String address1 = addresses == null || addresses.length < 1 ? null : addresses[0]; + String[] addressTypes = addressResult.getAddressTypes(); + String address1Type = addressTypes == null || addressTypes.length < 1 ? null : addressTypes[0]; + int action = mapIndexToAction(index); + switch (action) { + case 0: + addContact(addressResult.getNames(), + addressResult.getNicknames(), + addressResult.getPronunciation(), + addressResult.getPhoneNumbers(), + addressResult.getPhoneTypes(), + addressResult.getEmails(), + addressResult.getEmailTypes(), + addressResult.getNote(), + addressResult.getInstantMessenger(), + address1, + address1Type, + addressResult.getOrg(), + addressResult.getTitle(), + addressResult.getURLs(), + addressResult.getBirthday(), + addressResult.getGeo()); + break; + case 1: + searchMap(address1); + break; + case 2: + dialPhone(addressResult.getPhoneNumbers()[0]); + break; + case 3: + sendEmail(addressResult.getEmails(), null, null, null, null); + break; + default: + break; + } + } + + private static Date parseDate(String s) { + for (DateFormat currentFormat : DATE_FORMATS) { + try { + return currentFormat.parse(s); + } catch (ParseException e) { + // continue + } + } + return null; + } + + // Overriden so we can hyphenate phone numbers, format birthdays, and bold the name. + @Override + public CharSequence getDisplayContents() { + AddressBookParsedResult result = (AddressBookParsedResult) getResult(); + StringBuilder contents = new StringBuilder(100); + ParsedResult.maybeAppend(result.getNames(), contents); + int namesLength = contents.length(); + + String pronunciation = result.getPronunciation(); + if (pronunciation != null && !pronunciation.isEmpty()) { + contents.append("\n("); + contents.append(pronunciation); + contents.append(')'); + } + + ParsedResult.maybeAppend(result.getTitle(), contents); + ParsedResult.maybeAppend(result.getOrg(), contents); + ParsedResult.maybeAppend(result.getAddresses(), contents); + String[] numbers = result.getPhoneNumbers(); + if (numbers != null) { + for (String number : numbers) { + if (number != null) { + ParsedResult.maybeAppend(PhoneNumberUtils.formatNumber(number), contents); + } + } + } + ParsedResult.maybeAppend(result.getEmails(), contents); + ParsedResult.maybeAppend(result.getURLs(), contents); + + String birthday = result.getBirthday(); + if (birthday != null && !birthday.isEmpty()) { + Date date = parseDate(birthday); + if (date != null) { + ParsedResult.maybeAppend(DateFormat.getDateInstance(DateFormat.MEDIUM).format(date.getTime()), contents); + } + } + ParsedResult.maybeAppend(result.getNote(), contents); + + if (namesLength > 0) { + // Bold the full name to make it stand out a bit. + Spannable styled = new SpannableString(contents.toString()); + styled.setSpan(new StyleSpan(Typeface.BOLD), 0, namesLength, 0); + return styled; + } else { + return contents.toString(); + } + } + + @Override + public int getDisplayTitle() { + return R.string.result_address_book; + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/CalendarResultHandler.java b/app/src/main/java/com/google/zxing/client/android/result/CalendarResultHandler.java new file mode 100644 index 0000000..31438df --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/CalendarResultHandler.java @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result; + +import android.app.Activity; +import android.content.ActivityNotFoundException; +import android.content.Intent; +import android.util.Log; + +import com.google.zxing.client.result.CalendarParsedResult; +import com.google.zxing.client.result.ParsedResult; + +import net.foucry.pilldroid.R; + +import java.text.DateFormat; +import java.util.Date; + +/** + * Handles calendar entries encoded in QR Codes. + * + * @author dswitkin@google.com (Daniel Switkin) + * @author Sean Owen + */ +public final class CalendarResultHandler extends ResultHandler { + + private static final String TAG = CalendarResultHandler.class.getSimpleName(); + + private static final int[] buttons = { + R.string.button_add_calendar + }; + + public CalendarResultHandler(Activity activity, ParsedResult result) { + super(activity, result); + } + + @Override + public int getButtonCount() { + return buttons.length; + } + + @Override + public int getButtonText(int index) { + return buttons[index]; + } + + @Override + public void handleButtonPress(int index) { + if (index == 0) { + CalendarParsedResult calendarResult = (CalendarParsedResult) getResult(); + + String description = calendarResult.getDescription(); + String organizer = calendarResult.getOrganizer(); + if (organizer != null) { // No separate Intent key, put in description + if (description == null) { + description = organizer; + } else { + description = description + '\n' + organizer; + } + } + + addCalendarEvent(calendarResult.getSummary(), + calendarResult.getStart(), + calendarResult.isStartAllDay(), + calendarResult.getEnd(), + calendarResult.getLocation(), + description, + calendarResult.getAttendees()); + } + } + + /** + * Sends an intent to create a new calendar event by prepopulating the Add Event UI. Older + * versions of the system have a bug where the event title will not be filled out. + * + * @param summary A description of the event + * @param start The start time + * @param allDay if true, event is considered to be all day starting from start time + * @param end The end time (optional) + * @param location a text description of the event location + * @param description a text description of the event itself + * @param attendees attendees to invite + */ + private void addCalendarEvent(String summary, + Date start, + boolean allDay, + Date end, + String location, + String description, + String[] attendees) { + Intent intent = new Intent(Intent.ACTION_INSERT); + intent.setType("vnd.android.cursor.item/event"); + long startMilliseconds = start.getTime(); + intent.putExtra("beginTime", startMilliseconds); + if (allDay) { + intent.putExtra("allDay", true); + } + long endMilliseconds; + if (end == null) { + if (allDay) { + // + 1 day + endMilliseconds = startMilliseconds + 24 * 60 * 60 * 1000; + } else { + endMilliseconds = startMilliseconds; + } + } else { + endMilliseconds = end.getTime(); + } + intent.putExtra("endTime", endMilliseconds); + intent.putExtra("title", summary); + intent.putExtra("eventLocation", location); + intent.putExtra("description", description); + if (attendees != null) { + intent.putExtra(Intent.EXTRA_EMAIL, attendees); + // Documentation says this is either a String[] or comma-separated String, which is right? + } + + try { + // Do this manually at first + rawLaunchIntent(intent); + } catch (ActivityNotFoundException anfe) { + Log.w(TAG, "No calendar app available that responds to " + Intent.ACTION_INSERT); + // For calendar apps that don't like "INSERT": + intent.setAction(Intent.ACTION_EDIT); + launchIntent(intent); // Fail here for real if nothing can handle it + } + } + + + @Override + public CharSequence getDisplayContents() { + + CalendarParsedResult calResult = (CalendarParsedResult) getResult(); + StringBuilder result = new StringBuilder(100); + + ParsedResult.maybeAppend(calResult.getSummary(), result); + + Date start = calResult.getStart(); + ParsedResult.maybeAppend(format(calResult.isStartAllDay(), start), result); + + Date end = calResult.getEnd(); + if (end != null) { + if (calResult.isEndAllDay() && !start.equals(end)) { + // Show only year/month/day + // if it's all-day and this is the end date, it's exclusive, so show the user + // that it ends on the day before to make more intuitive sense. + // But don't do it if the event already (incorrectly?) specifies the same start/end + end = new Date(end.getTime() - 24 * 60 * 60 * 1000); + } + ParsedResult.maybeAppend(format(calResult.isEndAllDay(), end), result); + } + + ParsedResult.maybeAppend(calResult.getLocation(), result); + ParsedResult.maybeAppend(calResult.getOrganizer(), result); + ParsedResult.maybeAppend(calResult.getAttendees(), result); + ParsedResult.maybeAppend(calResult.getDescription(), result); + return result.toString(); + } + + private static String format(boolean allDay, Date date) { + if (date == null) { + return null; + } + DateFormat format = allDay + ? DateFormat.getDateInstance(DateFormat.MEDIUM) + : DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); + return format.format(date); + } + + @Override + public int getDisplayTitle() { + return R.string.result_calendar; + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/EmailAddressResultHandler.java b/app/src/main/java/com/google/zxing/client/android/result/EmailAddressResultHandler.java new file mode 100644 index 0000000..61631a3 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/EmailAddressResultHandler.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result; + +import android.app.Activity; + +import com.google.zxing.client.result.EmailAddressParsedResult; +import com.google.zxing.client.result.ParsedResult; + +import net.foucry.pilldroid.R; + +/** + * Handles email addresses. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class EmailAddressResultHandler extends ResultHandler { + private static final int[] buttons = { + R.string.button_email, + R.string.button_add_contact + }; + + public EmailAddressResultHandler(Activity activity, ParsedResult result) { + super(activity, result); + } + + @Override + public int getButtonCount() { + return buttons.length; + } + + @Override + public int getButtonText(int index) { + return buttons[index]; + } + + @Override + public void handleButtonPress(int index) { + EmailAddressParsedResult emailResult = (EmailAddressParsedResult) getResult(); + switch (index) { + case 0: + sendEmail(emailResult.getTos(), + emailResult.getCCs(), + emailResult.getBCCs(), + emailResult.getSubject(), + emailResult.getBody()); + break; + case 1: + addEmailOnlyContact(emailResult.getTos(), null); + break; + } + } + + @Override + public int getDisplayTitle() { + return R.string.result_email_address; + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/GeoResultHandler.java b/app/src/main/java/com/google/zxing/client/android/result/GeoResultHandler.java new file mode 100644 index 0000000..6d3d855 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/GeoResultHandler.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result; + +import android.app.Activity; + +import com.google.zxing.client.result.GeoParsedResult; +import com.google.zxing.client.result.ParsedResult; + +import net.foucry.pilldroid.R; + +/** + * Handles geographic coordinates (typically encoded as geo: URLs). + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class GeoResultHandler extends ResultHandler { + private static final int[] buttons = { + R.string.button_show_map, + R.string.button_get_directions + }; + + public GeoResultHandler(Activity activity, ParsedResult result) { + super(activity, result); + } + + @Override + public int getButtonCount() { + return buttons.length; + } + + @Override + public int getButtonText(int index) { + return buttons[index]; + } + + @Override + public void handleButtonPress(int index) { + GeoParsedResult geoResult = (GeoParsedResult) getResult(); + switch (index) { + case 0: + openMap(geoResult.getGeoURI()); + break; + case 1: + getDirections(geoResult.getLatitude(), geoResult.getLongitude()); + break; + } + } + + @Override + public int getDisplayTitle() { + return R.string.result_geo; + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/ISBNResultHandler.java b/app/src/main/java/com/google/zxing/client/android/result/ISBNResultHandler.java new file mode 100644 index 0000000..085cadb --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/ISBNResultHandler.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result; + +import android.app.Activity; + +import com.google.zxing.Result; +import com.google.zxing.client.result.ISBNParsedResult; +import com.google.zxing.client.result.ParsedResult; + +import net.foucry.pilldroid.R; + +/** + * Handles books encoded by their ISBN values. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class ISBNResultHandler extends ResultHandler { + private static final int[] buttons = { + R.string.button_product_search, + R.string.button_book_search, + R.string.button_search_book_contents, + R.string.button_custom_product_search + }; + + public ISBNResultHandler(Activity activity, ParsedResult result, Result rawResult) { + super(activity, result, rawResult); + } + + @Override + public int getButtonCount() { + return hasCustomProductSearch() ? buttons.length : buttons.length - 1; + } + + @Override + public int getButtonText(int index) { + return buttons[index]; + } + + @Override + public void handleButtonPress(int index) { + ISBNParsedResult isbnResult = (ISBNParsedResult) getResult(); + switch (index) { + case 0: + openProductSearch(isbnResult.getISBN()); + break; + case 1: + openBookSearch(isbnResult.getISBN()); + break; + case 2: + searchBookContents(isbnResult.getISBN()); + break; + case 3: + openURL(fillInCustomSearchURL(isbnResult.getISBN())); + break; + } + } + + @Override + public int getDisplayTitle() { + return R.string.result_isbn; + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/ProductResultHandler.java b/app/src/main/java/com/google/zxing/client/android/result/ProductResultHandler.java new file mode 100644 index 0000000..11772ab --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/ProductResultHandler.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result; + +import android.app.Activity; + +import com.google.zxing.Result; +import com.google.zxing.client.result.ExpandedProductParsedResult; +import com.google.zxing.client.result.ParsedResult; +import com.google.zxing.client.result.ProductParsedResult; + +import net.foucry.pilldroid.R; + +/** + * Handles generic products which are not books. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class ProductResultHandler extends ResultHandler { + private static final int[] buttons = { + R.string.button_product_search, + R.string.button_web_search, + R.string.button_custom_product_search + }; + + public ProductResultHandler(Activity activity, ParsedResult result, Result rawResult) { + super(activity, result, rawResult); + } + + @Override + public int getButtonCount() { + return hasCustomProductSearch() ? buttons.length : buttons.length - 1; + } + + @Override + public int getButtonText(int index) { + return buttons[index]; + } + + @Override + public void handleButtonPress(int index) { + String productID = getProductIDFromResult(getResult()); + switch (index) { + case 0: + openProductSearch(productID); + break; + case 1: + webSearch(productID); + break; + case 2: + openURL(fillInCustomSearchURL(productID)); + break; + } + } + + private static String getProductIDFromResult(ParsedResult rawResult) { + if (rawResult instanceof ProductParsedResult) { + return ((ProductParsedResult) rawResult).getNormalizedProductID(); + } + if (rawResult instanceof ExpandedProductParsedResult) { + return ((ExpandedProductParsedResult) rawResult).getRawText(); + } + throw new IllegalArgumentException(rawResult.getClass().toString()); + } + + @Override + public int getDisplayTitle() { + return R.string.result_product; + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/ResultButtonListener.java b/app/src/main/java/com/google/zxing/client/android/result/ResultButtonListener.java new file mode 100644 index 0000000..2e107c4 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/ResultButtonListener.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result; + +import android.view.View; + +/** + * Handles the result of barcode decoding in the context of the Android platform, by dispatching the + * proper intents to open other activities like GMail, Maps, etc. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class ResultButtonListener implements View.OnClickListener { + private final ResultHandler resultHandler; + private final int index; + + public ResultButtonListener(ResultHandler resultHandler, int index) { + this.resultHandler = resultHandler; + this.index = index; + } + + @Override + public void onClick(View view) { + resultHandler.handleButtonPress(index); + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/ResultHandler.java b/app/src/main/java/com/google/zxing/client/android/result/ResultHandler.java new file mode 100644 index 0000000..086e102 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/ResultHandler.java @@ -0,0 +1,516 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.ActivityNotFoundException; +import android.content.ContentValues; +import android.content.Intent; +import android.content.SharedPreferences; +import android.net.Uri; +import android.preference.PreferenceManager; +import android.provider.ContactsContract; +import android.util.Log; + +import com.google.zxing.Result; +import com.google.zxing.client.android.Contents; +import com.google.zxing.client.android.Intents; +import com.google.zxing.client.android.LocaleManager; +import com.google.zxing.client.android.PreferencesActivity; +import com.google.zxing.client.android.book.SearchBookContentsActivity; +import com.google.zxing.client.result.ParsedResult; +import com.google.zxing.client.result.ParsedResultType; +import com.google.zxing.client.result.ResultParser; + +import net.foucry.pilldroid.R; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Locale; + +//import com.google.zxing.client.android.R; + +/** + * A base class for the Android-specific barcode handlers. These allow the app to polymorphically + * suggest the appropriate actions for each data type. + * + * This class also contains a bunch of utility methods to take common actions like opening a URL. + * They could easily be moved into a helper object, but it can't be static because the Activity + * instance is needed to launch an intent. + * + * @author dswitkin@google.com (Daniel Switkin) + * @author Sean Owen + */ +public abstract class ResultHandler { + + private static final String TAG = ResultHandler.class.getSimpleName(); + + private static final String[] EMAIL_TYPE_STRINGS = {"home", "work", "mobile"}; + private static final String[] PHONE_TYPE_STRINGS = {"home", "work", "mobile", "fax", "pager", "main"}; + private static final String[] ADDRESS_TYPE_STRINGS = {"home", "work"}; + private static final int[] EMAIL_TYPE_VALUES = { + ContactsContract.CommonDataKinds.Email.TYPE_HOME, + ContactsContract.CommonDataKinds.Email.TYPE_WORK, + ContactsContract.CommonDataKinds.Email.TYPE_MOBILE, + }; + private static final int[] PHONE_TYPE_VALUES = { + ContactsContract.CommonDataKinds.Phone.TYPE_HOME, + ContactsContract.CommonDataKinds.Phone.TYPE_WORK, + ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE, + ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK, + ContactsContract.CommonDataKinds.Phone.TYPE_PAGER, + ContactsContract.CommonDataKinds.Phone.TYPE_MAIN, + }; + private static final int[] ADDRESS_TYPE_VALUES = { + ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME, + ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK, + }; + private static final int NO_TYPE = -1; + + public static final int MAX_BUTTON_COUNT = 4; + + private final ParsedResult result; + private final Activity activity; + private final Result rawResult; + private final String customProductSearch; + + ResultHandler(Activity activity, ParsedResult result) { + this(activity, result, null); + } + + ResultHandler(Activity activity, ParsedResult result, Result rawResult) { + this.result = result; + this.activity = activity; + this.rawResult = rawResult; + this.customProductSearch = parseCustomSearchURL(); + } + + public final ParsedResult getResult() { + return result; + } + + final boolean hasCustomProductSearch() { + return customProductSearch != null; + } + + final Activity getActivity() { + return activity; + } + + /** + * Indicates how many buttons the derived class wants shown. + * + * @return The integer button count. + */ + public abstract int getButtonCount(); + + /** + * The text of the nth action button. + * + * @param index From 0 to getButtonCount() - 1 + * @return The button text as a resource ID + */ + public abstract int getButtonText(int index); + + public Integer getDefaultButtonID() { + return null; + } + + /** + * Execute the action which corresponds to the nth button. + * + * @param index The button that was clicked. + */ + public abstract void handleButtonPress(int index); + + /** + * Some barcode contents are considered secure, and should not be saved to history, copied to + * the clipboard, or otherwise persisted. + * + * @return If true, do not create any permanent record of these contents. + */ + public boolean areContentsSecure() { + return false; + } + + /** + * Create a possibly styled string for the contents of the current barcode. + * + * @return The text to be displayed. + */ + public CharSequence getDisplayContents() { + String contents = result.getDisplayResult(); + return contents.replace("\r", ""); + } + + /** + * A string describing the kind of barcode that was found, e.g. "Found contact info". + * + * @return The resource ID of the string. + */ + public abstract int getDisplayTitle(); + + /** + * A convenience method to get the parsed type. Should not be overridden. + * + * @return The parsed type, e.g. URI or ISBN + */ + public final ParsedResultType getType() { + return result.getType(); + } + + final void addPhoneOnlyContact(String[] phoneNumbers,String[] phoneTypes) { + addContact(null, null, null, phoneNumbers, phoneTypes, null, null, null, null, null, null, null, null, null, null, null); + } + + final void addEmailOnlyContact(String[] emails, String[] emailTypes) { + addContact(null, null, null, null, null, emails, emailTypes, null, null, null, null, null, null, null, null, null); + } + + final void addContact(String[] names, + String[] nicknames, + String pronunciation, + String[] phoneNumbers, + String[] phoneTypes, + String[] emails, + String[] emailTypes, + String note, + String instantMessenger, + String address, + String addressType, + String org, + String title, + String[] urls, + String birthday, + String[] geo) { + + // Only use the first name in the array, if present. + Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT, ContactsContract.Contacts.CONTENT_URI); + intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE); + putExtra(intent, ContactsContract.Intents.Insert.NAME, names != null ? names[0] : null); + + putExtra(intent, ContactsContract.Intents.Insert.PHONETIC_NAME, pronunciation); + + int phoneCount = Math.min(phoneNumbers != null ? phoneNumbers.length : 0, Contents.PHONE_KEYS.length); + for (int x = 0; x < phoneCount; x++) { + putExtra(intent, Contents.PHONE_KEYS[x], phoneNumbers[x]); + if (phoneTypes != null && x < phoneTypes.length) { + int type = toPhoneContractType(phoneTypes[x]); + if (type >= 0) { + intent.putExtra(Contents.PHONE_TYPE_KEYS[x], type); + } + } + } + + int emailCount = Math.min(emails != null ? emails.length : 0, Contents.EMAIL_KEYS.length); + for (int x = 0; x < emailCount; x++) { + putExtra(intent, Contents.EMAIL_KEYS[x], emails[x]); + if (emailTypes != null && x < emailTypes.length) { + int type = toEmailContractType(emailTypes[x]); + if (type >= 0) { + intent.putExtra(Contents.EMAIL_TYPE_KEYS[x], type); + } + } + } + + ArrayList data = new ArrayList<>(); + if (urls != null) { + for (String url : urls) { + if (url != null && !url.isEmpty()) { + ContentValues row = new ContentValues(2); + row.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); + row.put(ContactsContract.CommonDataKinds.Website.URL, url); + data.add(row); + break; + } + } + } + + if (birthday != null) { + ContentValues row = new ContentValues(3); + row.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE); + row.put(ContactsContract.CommonDataKinds.Event.TYPE, ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY); + row.put(ContactsContract.CommonDataKinds.Event.START_DATE, birthday); + data.add(row); + } + + if (nicknames != null) { + for (String nickname : nicknames) { + if (nickname != null && !nickname.isEmpty()) { + ContentValues row = new ContentValues(3); + row.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE); + row.put(ContactsContract.CommonDataKinds.Nickname.TYPE, + ContactsContract.CommonDataKinds.Nickname.TYPE_DEFAULT); + row.put(ContactsContract.CommonDataKinds.Nickname.NAME, nickname); + data.add(row); + break; + } + } + } + + if (!data.isEmpty()) { + intent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, data); + } + + StringBuilder aggregatedNotes = new StringBuilder(); + if (note != null) { + aggregatedNotes.append('\n').append(note); + } + if (geo != null) { + aggregatedNotes.append('\n').append(geo[0]).append(',').append(geo[1]); + } + + if (aggregatedNotes.length() > 0) { + // Remove extra leading '\n' + putExtra(intent, ContactsContract.Intents.Insert.NOTES, aggregatedNotes.substring(1)); + } + + putExtra(intent, ContactsContract.Intents.Insert.IM_HANDLE, instantMessenger); + putExtra(intent, ContactsContract.Intents.Insert.POSTAL, address); + if (addressType != null) { + int type = toAddressContractType(addressType); + if (type >= 0) { + intent.putExtra(ContactsContract.Intents.Insert.POSTAL_TYPE, type); + } + } + putExtra(intent, ContactsContract.Intents.Insert.COMPANY, org); + putExtra(intent, ContactsContract.Intents.Insert.JOB_TITLE, title); + launchIntent(intent); + } + + private static int toEmailContractType(String typeString) { + return doToContractType(typeString, EMAIL_TYPE_STRINGS, EMAIL_TYPE_VALUES); + } + + private static int toPhoneContractType(String typeString) { + return doToContractType(typeString, PHONE_TYPE_STRINGS, PHONE_TYPE_VALUES); + } + + private static int toAddressContractType(String typeString) { + return doToContractType(typeString, ADDRESS_TYPE_STRINGS, ADDRESS_TYPE_VALUES); + } + + private static int doToContractType(String typeString, String[] types, int[] values) { + if (typeString == null) { + return NO_TYPE; + } + for (int i = 0; i < types.length; i++) { + String type = types[i]; + if (typeString.startsWith(type) || typeString.startsWith(type.toUpperCase(Locale.ENGLISH))) { + return values[i]; + } + } + return NO_TYPE; + } + + final void shareByEmail(String contents) { + sendEmail(null, null, null, null, contents); + } + + final void sendEmail(String[] to, + String[] cc, + String[] bcc, + String subject, + String body) { + Intent intent = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:")); + if (to != null && to.length != 0) { + intent.putExtra(Intent.EXTRA_EMAIL, to); + } + if (cc != null && cc.length != 0) { + intent.putExtra(Intent.EXTRA_CC, cc); + } + if (bcc != null && bcc.length != 0) { + intent.putExtra(Intent.EXTRA_BCC, bcc); + } + putExtra(intent, Intent.EXTRA_SUBJECT, subject); + putExtra(intent, Intent.EXTRA_TEXT, body); + intent.setType("text/plain"); + launchIntent(intent); + } + + final void shareBySMS(String contents) { + sendSMSFromUri("smsto:", contents); + } + + final void sendSMS(String phoneNumber, String body) { + sendSMSFromUri("smsto:" + phoneNumber, body); + } + + final void sendSMSFromUri(String uri, String body) { + Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uri)); + putExtra(intent, "sms_body", body); + // Exit the app once the SMS is sent + intent.putExtra("compose_mode", true); + launchIntent(intent); + } + + final void sendMMS(String phoneNumber, String subject, String body) { + sendMMSFromUri("mmsto:" + phoneNumber, subject, body); + } + + final void sendMMSFromUri(String uri, String subject, String body) { + Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uri)); + // The Messaging app needs to see a valid subject or else it will treat this an an SMS. + if (subject == null || subject.isEmpty()) { + putExtra(intent, "subject", activity.getString(R.string.msg_default_mms_subject)); + } else { + putExtra(intent, "subject", subject); + } + putExtra(intent, "sms_body", body); + intent.putExtra("compose_mode", true); + launchIntent(intent); + } + + final void dialPhone(String phoneNumber) { + launchIntent(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phoneNumber))); + } + + final void dialPhoneFromUri(String uri) { + launchIntent(new Intent(Intent.ACTION_DIAL, Uri.parse(uri))); + } + + final void openMap(String geoURI) { + launchIntent(new Intent(Intent.ACTION_VIEW, Uri.parse(geoURI))); + } + + /** + * Do a geo search using the address as the query. + * + * @param address The address to find + */ + final void searchMap(String address) { + launchIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("geo:0,0?q=" + Uri.encode(address)))); + } + + final void getDirections(double latitude, double longitude) { + launchIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("http://maps.google." + + LocaleManager.getCountryTLD(activity) + "/maps?f=d&daddr=" + latitude + ',' + longitude))); + } + + // Uses the mobile-specific version of Product Search, which is formatted for small screens. + final void openProductSearch(String upc) { + Uri uri = Uri.parse("http://www.google." + LocaleManager.getProductSearchCountryTLD(activity) + + "/m/products?q=" + upc + "&source=zxing"); + launchIntent(new Intent(Intent.ACTION_VIEW, uri)); + } + + final void openBookSearch(String isbn) { + Uri uri = Uri.parse("http://books.google." + LocaleManager.getBookSearchCountryTLD(activity) + + "/books?vid=isbn" + isbn); + launchIntent(new Intent(Intent.ACTION_VIEW, uri)); + } + + final void searchBookContents(String isbnOrUrl) { + Intent intent = new Intent(Intents.SearchBookContents.ACTION); + intent.setClassName(activity, SearchBookContentsActivity.class.getName()); + putExtra(intent, Intents.SearchBookContents.ISBN, isbnOrUrl); + launchIntent(intent); + } + + final void openURL(String url) { + // Strangely, some Android browsers don't seem to register to handle HTTP:// or HTTPS://. + // Lower-case these as it should always be OK to lower-case these schemes. + if (url.startsWith("HTTP://")) { + url = "http" + url.substring(4); + } else if (url.startsWith("HTTPS://")) { + url = "https" + url.substring(5); + } + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + try { + launchIntent(intent); + } catch (ActivityNotFoundException ignored) { + Log.w(TAG, "Nothing available to handle " + intent); + } + } + + final void webSearch(String query) { + Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); + intent.putExtra("query", query); + launchIntent(intent); + } + + /** + * Like {@link #launchIntent(Intent)} but will tell you if it is not handle-able + * via {@link ActivityNotFoundException}. + * + * @throws ActivityNotFoundException + */ + final void rawLaunchIntent(Intent intent) { + if (intent != null) { + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + Log.d(TAG, "Launching intent: " + intent + " with extras: " + intent.getExtras()); + activity.startActivity(intent); + } + } + + /** + * Like {@link #rawLaunchIntent(Intent)} but will show a user dialog if nothing is available to handle. + */ + final void launchIntent(Intent intent) { + try { + rawLaunchIntent(intent); + } catch (ActivityNotFoundException ignored) { + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle(R.string.app_name); + builder.setMessage(R.string.msg_intent_failed); + builder.setPositiveButton(R.string.button_ok, null); + builder.show(); + } + } + + private static void putExtra(Intent intent, String key, String value) { + if (value != null && !value.isEmpty()) { + intent.putExtra(key, value); + } + } + + private String parseCustomSearchURL() { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); + String customProductSearch = prefs.getString(PreferencesActivity.KEY_CUSTOM_PRODUCT_SEARCH, + null); + if (customProductSearch != null && customProductSearch.trim().isEmpty()) { + return null; + } + return customProductSearch; + } + + final String fillInCustomSearchURL(String text) { + if (customProductSearch == null) { + return text; // ? + } + try { + text = URLEncoder.encode(text, "UTF-8"); + } catch (UnsupportedEncodingException e) { + // can't happen; UTF-8 is always supported. Continue, I guess, without encoding + } + String url = customProductSearch; + if (rawResult != null) { + // Replace %f but only if it doesn't seem to be a hex escape sequence. This remains + // problematic but avoids the more surprising problem of breaking escapes + url = url.replaceFirst("%f(?![0-9a-f])", rawResult.getBarcodeFormat().toString()); + if (url.contains("%t")) { + ParsedResult parsedResultAgain = ResultParser.parseResult(rawResult); + url = url.replace("%t", parsedResultAgain.getType().toString()); + } + } + // Replace %s last as it might contain itself %f or %t + return url.replace("%s", text); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/ResultHandlerFactory.java b/app/src/main/java/com/google/zxing/client/android/result/ResultHandlerFactory.java new file mode 100644 index 0000000..a31d089 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/ResultHandlerFactory.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result; + +import com.google.zxing.Result; +import com.google.zxing.client.android.CaptureActivity; +import com.google.zxing.client.result.ParsedResult; +import com.google.zxing.client.result.ResultParser; + +/** + * Manufactures Android-specific handlers based on the barcode content's type. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class ResultHandlerFactory { + private ResultHandlerFactory() { + } + + public static ResultHandler makeResultHandler(CaptureActivity activity, Result rawResult) { + ParsedResult result = parseResult(rawResult); + switch (result.getType()) { + case ADDRESSBOOK: + return new AddressBookResultHandler(activity, result); + case EMAIL_ADDRESS: + return new EmailAddressResultHandler(activity, result); + case PRODUCT: + return new ProductResultHandler(activity, result, rawResult); + case URI: + return new URIResultHandler(activity, result); + case WIFI: + return new WifiResultHandler(activity, result); + case GEO: + return new GeoResultHandler(activity, result); + case TEL: + return new TelResultHandler(activity, result); + case SMS: + return new SMSResultHandler(activity, result); + case CALENDAR: + return new CalendarResultHandler(activity, result); + case ISBN: + return new ISBNResultHandler(activity, result, rawResult); + default: + return new TextResultHandler(activity, result, rawResult); + } + } + + private static ParsedResult parseResult(Result rawResult) { + return ResultParser.parseResult(rawResult); + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/SMSResultHandler.java b/app/src/main/java/com/google/zxing/client/android/result/SMSResultHandler.java new file mode 100644 index 0000000..f1c7a3c --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/SMSResultHandler.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result; + +import android.app.Activity; +import android.telephony.PhoneNumberUtils; + +import com.google.zxing.client.result.ParsedResult; +import com.google.zxing.client.result.SMSParsedResult; + +import net.foucry.pilldroid.R; + +/** + * Handles SMS addresses, offering a choice of composing a new SMS or MMS message. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class SMSResultHandler extends ResultHandler { + private static final int[] buttons = { + R.string.button_sms, + R.string.button_mms + }; + + public SMSResultHandler(Activity activity, ParsedResult result) { + super(activity, result); + } + + @Override + public int getButtonCount() { + return buttons.length; + } + + @Override + public int getButtonText(int index) { + return buttons[index]; + } + + @Override + public void handleButtonPress(int index) { + SMSParsedResult smsResult = (SMSParsedResult) getResult(); + String number = smsResult.getNumbers()[0]; + switch (index) { + case 0: + // Don't know of a way yet to express a SENDTO intent with multiple recipients + sendSMS(number, smsResult.getBody()); + break; + case 1: + sendMMS(number, smsResult.getSubject(), smsResult.getBody()); + break; + } + } + + @Override + public CharSequence getDisplayContents() { + SMSParsedResult smsResult = (SMSParsedResult) getResult(); + String[] rawNumbers = smsResult.getNumbers(); + String[] formattedNumbers = new String[rawNumbers.length]; + for (int i = 0; i < rawNumbers.length; i++) { + formattedNumbers[i] = PhoneNumberUtils.formatNumber(rawNumbers[i]); + } + StringBuilder contents = new StringBuilder(50); + ParsedResult.maybeAppend(formattedNumbers, contents); + ParsedResult.maybeAppend(smsResult.getSubject(), contents); + ParsedResult.maybeAppend(smsResult.getBody(), contents); + return contents.toString(); + } + + @Override + public int getDisplayTitle() { + return R.string.result_sms; + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/TelResultHandler.java b/app/src/main/java/com/google/zxing/client/android/result/TelResultHandler.java new file mode 100644 index 0000000..8816c2a --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/TelResultHandler.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result; + +import net.foucry.pilldroid.R; +import com.google.zxing.client.result.ParsedResult; +import com.google.zxing.client.result.TelParsedResult; + +import android.app.Activity; +import android.telephony.PhoneNumberUtils; + +/** + * Offers relevant actions for telephone numbers. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class TelResultHandler extends ResultHandler { + private static final int[] buttons = { + R.string.button_dial, + R.string.button_add_contact + }; + + public TelResultHandler(Activity activity, ParsedResult result) { + super(activity, result); + } + + @Override + public int getButtonCount() { + return buttons.length; + } + + @Override + public int getButtonText(int index) { + return buttons[index]; + } + + @Override + public void handleButtonPress(int index) { + TelParsedResult telResult = (TelParsedResult) getResult(); + switch (index) { + case 0: + dialPhoneFromUri(telResult.getTelURI()); + // When dialer comes up, it allows underlying display activity to continue or something, + // but app can't get camera in this state. Avoid issues by just quitting, only in the + // case of a phone number + getActivity().finish(); + break; + case 1: + String[] numbers = new String[1]; + numbers[0] = telResult.getNumber(); + addPhoneOnlyContact(numbers, null); + break; + } + } + + // Overriden so we can take advantage of Android's phone number hyphenation routines. + @Override + public CharSequence getDisplayContents() { + String contents = getResult().getDisplayResult(); + contents = contents.replace("\r", ""); + return PhoneNumberUtils.formatNumber(contents); + } + + @Override + public int getDisplayTitle() { + return R.string.result_tel; + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/TextResultHandler.java b/app/src/main/java/com/google/zxing/client/android/result/TextResultHandler.java new file mode 100644 index 0000000..a5a9242 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/TextResultHandler.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result; + +import android.app.Activity; + +import com.google.zxing.Result; +import com.google.zxing.client.result.ParsedResult; + +import net.foucry.pilldroid.R; + +/** + * This class handles TextParsedResult as well as unknown formats. It's the fallback handler. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class TextResultHandler extends ResultHandler { + + private static final int[] buttons = { + R.string.button_web_search, + R.string.button_share_by_email, + R.string.button_share_by_sms, + R.string.button_custom_product_search, + }; + + public TextResultHandler(Activity activity, ParsedResult result, Result rawResult) { + super(activity, result, rawResult); + } + + @Override + public int getButtonCount() { + return hasCustomProductSearch() ? buttons.length : buttons.length - 1; + } + + @Override + public int getButtonText(int index) { + return buttons[index]; + } + + @Override + public void handleButtonPress(int index) { + String text = getResult().getDisplayResult(); + switch (index) { + case 0: + webSearch(text); + break; + case 1: + shareByEmail(text); + break; + case 2: + shareBySMS(text); + break; + case 3: + openURL(fillInCustomSearchURL(text)); + break; + } + } + + @Override + public int getDisplayTitle() { + return R.string.result_text; + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/URIResultHandler.java b/app/src/main/java/com/google/zxing/client/android/result/URIResultHandler.java new file mode 100644 index 0000000..2547462 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/URIResultHandler.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result; + +import android.app.Activity; + +import com.google.zxing.client.android.LocaleManager; +import com.google.zxing.client.result.ParsedResult; +import com.google.zxing.client.result.URIParsedResult; + +import net.foucry.pilldroid.R; + +import java.util.Locale; + +/** + * Offers appropriate actions for URLS. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class URIResultHandler extends ResultHandler { + // URIs beginning with entries in this array will not be saved to history or copied to the + // clipboard for security. + private static final String[] SECURE_PROTOCOLS = { + "otpauth:" + }; + + private static final int[] buttons = { + R.string.button_open_browser, + R.string.button_share_by_email, + R.string.button_share_by_sms, + R.string.button_search_book_contents, + }; + + public URIResultHandler(Activity activity, ParsedResult result) { + super(activity, result); + } + + @Override + public int getButtonCount() { + if (LocaleManager.isBookSearchUrl(((URIParsedResult) getResult()).getURI())) { + return buttons.length; + } + return buttons.length - 1; + } + + @Override + public int getButtonText(int index) { + return buttons[index]; + } + + @Override + public Integer getDefaultButtonID() { + return 0; + } + + @Override + public void handleButtonPress(int index) { + URIParsedResult uriResult = (URIParsedResult) getResult(); + String uri = uriResult.getURI(); + switch (index) { + case 0: + openURL(uri); + break; + case 1: + shareByEmail(uri); + break; + case 2: + shareBySMS(uri); + break; + case 3: + searchBookContents(uri); + break; + } + } + + @Override + public int getDisplayTitle() { + return R.string.result_uri; + } + + @Override + public boolean areContentsSecure() { + URIParsedResult uriResult = (URIParsedResult) getResult(); + String uri = uriResult.getURI().toLowerCase(Locale.ENGLISH); + for (String secure : SECURE_PROTOCOLS) { + if (uri.startsWith(secure)) { + return true; + } + } + return false; + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/WifiResultHandler.java b/app/src/main/java/com/google/zxing/client/android/result/WifiResultHandler.java new file mode 100644 index 0000000..28cdce5 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/WifiResultHandler.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result; + +import android.app.Activity; +import android.content.Context; +import android.net.wifi.WifiManager; +import android.os.AsyncTask; +import android.util.Log; +import android.widget.Toast; + +import com.google.zxing.client.android.CaptureActivity; +import com.google.zxing.client.android.wifi.WifiConfigManager; +import com.google.zxing.client.result.ParsedResult; +import com.google.zxing.client.result.WifiParsedResult; + +import net.foucry.pilldroid.R; + +/** + * Handles wifi access information. + * + * @author Vikram Aggarwal + * @author Sean Owen + */ +public final class WifiResultHandler extends ResultHandler { + + private static final String TAG = WifiResultHandler.class.getSimpleName(); + + private final CaptureActivity parent; + + public WifiResultHandler(CaptureActivity activity, ParsedResult result) { + super(activity, result); + parent = activity; + } + + @Override + public int getButtonCount() { + // We just need one button, and that is to configure the wireless. This could change in the future. + return 1; + } + + @Override + public int getButtonText(int index) { + return R.string.button_wifi; + } + + @Override + public void handleButtonPress(int index) { + if (index == 0) { + WifiParsedResult wifiResult = (WifiParsedResult) getResult(); + WifiManager wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE); + if (wifiManager == null) { + Log.w(TAG, "No WifiManager available from device"); + return; + } + final Activity activity = getActivity(); + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(activity.getApplicationContext(), R.string.wifi_changing_network, Toast.LENGTH_SHORT).show(); + } + }); + new WifiConfigManager(wifiManager).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, wifiResult); + parent.restartPreviewAfterDelay(0L); + } + } + + // Display the name of the network and the network type to the user. + @Override + public CharSequence getDisplayContents() { + WifiParsedResult wifiResult = (WifiParsedResult) getResult(); + return wifiResult.getSsid() + " (" + wifiResult.getNetworkEncryption() + ')'; + } + + @Override + public int getDisplayTitle() { + return R.string.result_wifi; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/google/zxing/client/android/result/supplement/BookResultInfoRetriever.java b/app/src/main/java/com/google/zxing/client/android/result/supplement/BookResultInfoRetriever.java new file mode 100644 index 0000000..241abe2 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/supplement/BookResultInfoRetriever.java @@ -0,0 +1,107 @@ +/* + * Copyright 2011 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result.supplement; + +import android.content.Context; +import android.widget.TextView; + +import com.google.zxing.client.android.HttpHelper; +import com.google.zxing.client.android.LocaleManager; +import com.google.zxing.client.android.history.HistoryManager; + +import net.foucry.pilldroid.R; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.json.JSONTokener; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; + +/** + * @author Kamil Kaczmarczyk + * @author Sean Owen + */ +final class BookResultInfoRetriever extends SupplementalInfoRetriever { + + private final String isbn; + private final String source; + private final Context context; + + BookResultInfoRetriever(TextView textView, String isbn, HistoryManager historyManager, Context context) { + super(textView, historyManager); + this.isbn = isbn; + this.source = context.getString(R.string.msg_google_books); + this.context = context; + } + + @Override + void retrieveSupplementalInfo() throws IOException { + + CharSequence contents = HttpHelper.downloadViaHttp("https://www.googleapis.com/books/v1/volumes?q=isbn:" + isbn, + HttpHelper.ContentType.JSON); + + if (contents.length() == 0) { + return; + } + + String title; + String pages; + Collection authors = null; + + try { + + JSONObject topLevel = (JSONObject) new JSONTokener(contents.toString()).nextValue(); + JSONArray items = topLevel.optJSONArray("items"); + if (items == null || items.isNull(0)) { + return; + } + + JSONObject volumeInfo = ((JSONObject) items.get(0)).getJSONObject("volumeInfo"); + if (volumeInfo == null) { + return; + } + + title = volumeInfo.optString("title"); + pages = volumeInfo.optString("pageCount"); + + JSONArray authorsArray = volumeInfo.optJSONArray("authors"); + if (authorsArray != null && !authorsArray.isNull(0)) { + authors = new ArrayList<>(authorsArray.length()); + for (int i = 0; i < authorsArray.length(); i++) { + authors.add(authorsArray.getString(i)); + } + } + + } catch (JSONException e) { + throw new IOException(e); + } + + Collection newTexts = new ArrayList<>(); + maybeAddText(title, newTexts); + maybeAddTextSeries(authors, newTexts); + maybeAddText(pages == null || pages.isEmpty() ? null : pages + "pp.", newTexts); + + String baseBookUri = "http://www.google." + LocaleManager.getBookSearchCountryTLD(context) + + "/search?tbm=bks&source=zxing&q="; + + append(isbn, source, newTexts.toArray(new String[newTexts.size()]), baseBookUri + isbn); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/supplement/ProductResultInfoRetriever.java b/app/src/main/java/com/google/zxing/client/android/result/supplement/ProductResultInfoRetriever.java new file mode 100644 index 0000000..84f3891 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/supplement/ProductResultInfoRetriever.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result.supplement; + +import android.content.Context; +import android.text.Html; +import android.widget.TextView; + +import com.google.zxing.client.android.HttpHelper; +import com.google.zxing.client.android.LocaleManager; +import com.google.zxing.client.android.history.HistoryManager; + +import net.foucry.pilldroid.R; + +import java.io.IOException; +import java.net.URLEncoder; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + *

Retrieves product information from Google Product search.

+ * + *

Please do not reuse this code. Using results in this way requires permission + * from Google, and that is not granted to users via this project.

+ * + * @author Sean Owen + */ +final class ProductResultInfoRetriever extends SupplementalInfoRetriever { + + private static final Pattern[] PRODUCT_NAME_PRICE_PATTERNS = { + Pattern.compile(",event\\)\">([^<]+).+([^<]+)"), + Pattern.compile("owb63p\">([^<]+).+zdi3pb\">([^<]+)"), + }; + + private final String productID; + private final String source; + private final Context context; + + ProductResultInfoRetriever(TextView textView, String productID, HistoryManager historyManager, Context context) { + super(textView, historyManager); + this.productID = productID; + this.source = context.getString(R.string.msg_google_product); + this.context = context; + } + + @Override + void retrieveSupplementalInfo() throws IOException { + + String encodedProductID = URLEncoder.encode(productID, "UTF-8"); + String uri = "https://www.google." + LocaleManager.getProductSearchCountryTLD(context) + + "/m/products?ie=utf8&oe=utf8&scoring=p&source=zxing&q=" + encodedProductID; + CharSequence content = HttpHelper.downloadViaHttp(uri, HttpHelper.ContentType.HTML); + + for (Pattern p : PRODUCT_NAME_PRICE_PATTERNS) { + Matcher matcher = p.matcher(content); + if (matcher.find()) { + append(productID, + source, + new String[] { unescapeHTML(matcher.group(1)), unescapeHTML(matcher.group(2)) }, + uri); + break; + } + } + } + + private static String unescapeHTML(String raw) { + return Html.fromHtml(raw).toString(); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/supplement/SupplementalInfoRetriever.java b/app/src/main/java/com/google/zxing/client/android/result/supplement/SupplementalInfoRetriever.java new file mode 100644 index 0000000..6aa8533 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/supplement/SupplementalInfoRetriever.java @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result.supplement; + +import android.content.Context; +import android.os.AsyncTask; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.method.LinkMovementMethod; +import android.text.style.URLSpan; +import android.util.Log; +import android.widget.TextView; + +import java.io.IOException; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Collection; +import java.util.concurrent.RejectedExecutionException; + +import com.google.zxing.client.android.history.HistoryManager; +import com.google.zxing.client.result.ISBNParsedResult; +import com.google.zxing.client.result.ParsedResult; +import com.google.zxing.client.result.ProductParsedResult; +import com.google.zxing.client.result.URIParsedResult; + +public abstract class SupplementalInfoRetriever extends AsyncTask { + + private static final String TAG = "SupplementalInfo"; + + public static void maybeInvokeRetrieval(TextView textView, + ParsedResult result, + HistoryManager historyManager, + Context context) { + try { + if (result instanceof URIParsedResult) { + SupplementalInfoRetriever uriRetriever = + new URIResultInfoRetriever(textView, (URIParsedResult) result, historyManager, context); + uriRetriever.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + SupplementalInfoRetriever titleRetriever = + new TitleRetriever(textView, (URIParsedResult) result, historyManager); + titleRetriever.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } else if (result instanceof ProductParsedResult) { + ProductParsedResult productParsedResult = (ProductParsedResult) result; + String productID = productParsedResult.getProductID(); + SupplementalInfoRetriever productRetriever = + new ProductResultInfoRetriever(textView, productID, historyManager, context); + productRetriever.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } else if (result instanceof ISBNParsedResult) { + String isbn = ((ISBNParsedResult) result).getISBN(); + SupplementalInfoRetriever productInfoRetriever = + new ProductResultInfoRetriever(textView, isbn, historyManager, context); + productInfoRetriever.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + SupplementalInfoRetriever bookInfoRetriever = + new BookResultInfoRetriever(textView, isbn, historyManager, context); + bookInfoRetriever.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + } catch (RejectedExecutionException ree) { + // do nothing + } + } + + private final WeakReference textViewRef; + private final WeakReference historyManagerRef; + private final Collection newContents; + private final Collection newHistories; + + SupplementalInfoRetriever(TextView textView, HistoryManager historyManager) { + textViewRef = new WeakReference<>(textView); + historyManagerRef = new WeakReference<>(historyManager); + newContents = new ArrayList<>(); + newHistories = new ArrayList<>(); + } + + @Override + public final Object doInBackground(Object... args) { + try { + retrieveSupplementalInfo(); + } catch (IOException e) { + Log.w(TAG, e); + } + return null; + } + + @Override + protected final void onPostExecute(Object arg) { + TextView textView = textViewRef.get(); + if (textView != null) { + for (CharSequence content : newContents) { + textView.append(content); + } + textView.setMovementMethod(LinkMovementMethod.getInstance()); + } + HistoryManager historyManager = historyManagerRef.get(); + if (historyManager != null) { + for (String[] text : newHistories) { + historyManager.addHistoryItemDetails(text[0], text[1]); + } + } + } + + abstract void retrieveSupplementalInfo() throws IOException; + + final void append(String itemID, String source, String[] newTexts, String linkURL) { + + StringBuilder newTextCombined = new StringBuilder(); + + if (source != null) { + newTextCombined.append(source).append(' '); + } + + int linkStart = newTextCombined.length(); + + boolean first = true; + for (String newText : newTexts) { + if (first) { + newTextCombined.append(newText); + first = false; + } else { + newTextCombined.append(" ["); + newTextCombined.append(newText); + newTextCombined.append(']'); + } + } + + int linkEnd = newTextCombined.length(); + + String newText = newTextCombined.toString(); + Spannable content = new SpannableString(newText + "\n\n"); + if (linkURL != null) { + // Strangely, some Android browsers don't seem to register to handle HTTP:// or HTTPS://. + // Lower-case these as it should always be OK to lower-case these schemes. + if (linkURL.startsWith("HTTP://")) { + linkURL = "http" + linkURL.substring(4); + } else if (linkURL.startsWith("HTTPS://")) { + linkURL = "https" + linkURL.substring(5); + } + content.setSpan(new URLSpan(linkURL), linkStart, linkEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + + newContents.add(content); + newHistories.add(new String[] {itemID, newText}); + } + + static void maybeAddText(String text, Collection texts) { + if (text != null && !text.isEmpty()) { + texts.add(text); + } + } + + static void maybeAddTextSeries(Collection textSeries, Collection texts) { + if (textSeries != null && !textSeries.isEmpty()) { + boolean first = true; + StringBuilder authorsText = new StringBuilder(); + for (String author : textSeries) { + if (first) { + first = false; + } else { + authorsText.append(", "); + } + authorsText.append(author); + } + texts.add(authorsText.toString()); + } + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/supplement/TitleRetriever.java b/app/src/main/java/com/google/zxing/client/android/result/supplement/TitleRetriever.java new file mode 100644 index 0000000..93467fc --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/supplement/TitleRetriever.java @@ -0,0 +1,70 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result.supplement; + +import android.text.Html; +import android.widget.TextView; +import com.google.zxing.client.android.HttpHelper; +import com.google.zxing.client.android.history.HistoryManager; +import com.google.zxing.client.result.URIParsedResult; + +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Retrieves the title of a web page as supplemental info. + * + * @author Sean Owen + */ +final class TitleRetriever extends SupplementalInfoRetriever { + + private static final Pattern TITLE_PATTERN = Pattern.compile("([^<]+)"); + private static final int MAX_TITLE_LEN = 100; + + private final String httpUrl; + + TitleRetriever(TextView textView, URIParsedResult result, HistoryManager historyManager) { + super(textView, historyManager); + this.httpUrl = result.getURI(); + } + + @Override + void retrieveSupplementalInfo() { + CharSequence contents; + try { + contents = HttpHelper.downloadViaHttp(httpUrl, HttpHelper.ContentType.HTML, 4096); + } catch (IOException ioe) { + // ignore this + return; + } + if (contents != null && contents.length() > 0) { + Matcher m = TITLE_PATTERN.matcher(contents); + if (m.find()) { + String title = m.group(1); + if (title != null && !title.isEmpty()) { + title = Html.fromHtml(title).toString(); + if (title.length() > MAX_TITLE_LEN) { + title = title.substring(0, MAX_TITLE_LEN) + "..."; + } + append(httpUrl, null, new String[] {title}, httpUrl); + } + } + } + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/result/supplement/URIResultInfoRetriever.java b/app/src/main/java/com/google/zxing/client/android/result/supplement/URIResultInfoRetriever.java new file mode 100644 index 0000000..0f6df6f --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/result/supplement/URIResultInfoRetriever.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.result.supplement; + +import android.content.Context; +import android.widget.TextView; + +import com.google.zxing.client.android.HttpHelper; +import com.google.zxing.client.android.history.HistoryManager; +import com.google.zxing.client.result.URIParsedResult; + +import net.foucry.pilldroid.R; + +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +final class URIResultInfoRetriever extends SupplementalInfoRetriever { + + private static final int MAX_REDIRECTS = 5; + + private final URIParsedResult result; + private final String redirectString; + + URIResultInfoRetriever(TextView textView, URIParsedResult result, HistoryManager historyManager, Context context) { + super(textView, historyManager); + redirectString = context.getString(R.string.msg_redirect); + this.result = result; + } + + @Override + void retrieveSupplementalInfo() throws IOException { + URI oldURI; + try { + oldURI = new URI(result.getURI()); + } catch (URISyntaxException ignored) { + return; + } + URI newURI = HttpHelper.unredirect(oldURI); + int count = 0; + while (count++ < MAX_REDIRECTS && !oldURI.equals(newURI)) { + append(result.getDisplayResult(), + null, + new String[] { redirectString + " : " + newURI }, + newURI.toString()); + oldURI = newURI; + newURI = HttpHelper.unredirect(newURI); + } + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/share/AppInfo.java b/app/src/main/java/com/google/zxing/client/android/share/AppInfo.java new file mode 100644 index 0000000..94bde9b --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/share/AppInfo.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.share; + +import android.graphics.drawable.Drawable; + +final class AppInfo implements Comparable<AppInfo> { + + private final String packageName; + private final String label; + private final Drawable icon; + + AppInfo(String packageName, String label, Drawable icon) { + this.packageName = packageName; + this.label = label; + this.icon = icon; + } + + String getPackageName() { + return packageName; + } + + Drawable getIcon() { + return icon; + } + + @Override + public String toString() { + return label; + } + + @Override + public int compareTo(AppInfo another) { + return label.compareTo(another.label); + } + + @Override + public int hashCode() { + return label.hashCode(); + } + + @Override + public boolean equals(Object other) { + if (!(other instanceof AppInfo)) { + return false; + } + AppInfo another = (AppInfo) other; + return label.equals(another.label); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/share/AppPickerActivity.java b/app/src/main/java/com/google/zxing/client/android/share/AppPickerActivity.java new file mode 100644 index 0000000..778beaf --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/share/AppPickerActivity.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.share; + +import android.app.ListActivity; +import android.content.Intent; +import android.os.AsyncTask; +import android.view.View; +import android.widget.Adapter; +import android.widget.ListView; + +import java.util.List; + +public final class AppPickerActivity extends ListActivity { + + private AsyncTask<Object,Object,List<AppInfo>> backgroundTask; + + @Override + protected void onResume() { + super.onResume(); + backgroundTask = new LoadPackagesAsyncTask(this); + backgroundTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + + @Override + protected void onPause() { + AsyncTask<?,?,?> task = backgroundTask; + if (task != null) { + task.cancel(true); + backgroundTask = null; + } + super.onPause(); + } + + @Override + protected void onListItemClick(ListView l, View view, int position, long id) { + Adapter adapter = getListAdapter(); + if (position >= 0 && position < adapter.getCount()) { + String packageName = ((AppInfo) adapter.getItem(position)).getPackageName(); + Intent intent = new Intent(); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + intent.putExtra("url", "market://details?id=" + packageName); // Browser.BookmarkColumns.URL + setResult(RESULT_OK, intent); + } else { + setResult(RESULT_CANCELED); + } + finish(); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/share/BookmarkAdapter.java b/app/src/main/java/com/google/zxing/client/android/share/BookmarkAdapter.java new file mode 100644 index 0000000..b95a6ee --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/share/BookmarkAdapter.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2011 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.share; + +import android.content.Context; +import android.database.Cursor; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.LinearLayout; +import android.widget.TextView; + +import net.foucry.pilldroid.R; + +/** + * A custom adapter designed to fetch bookmarks from a cursor. Before Honeycomb we used + * SimpleCursorAdapter, but it assumes the existence of an _id column, and the bookmark schema was + * rewritten for HC without one. This caused the app to crash, hence this new class, which is + * forwards and backwards compatible. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +final class BookmarkAdapter extends BaseAdapter { + private final Context context; + private final Cursor cursor; + + BookmarkAdapter(Context context, Cursor cursor) { + this.context = context; + this.cursor = cursor; + } + + @Override + public int getCount() { + return cursor.isClosed() ? 0 : cursor.getCount(); + } + + @Override + public Object getItem(int index) { + // Not used, so no point in retrieving it. + return null; + } + + @Override + public long getItemId(int index) { + return index; + } + + @Override + public View getView(int index, View view, ViewGroup viewGroup) { + View layout; + if (view instanceof LinearLayout) { + layout = view; + } else { + LayoutInflater factory = LayoutInflater.from(context); + layout = factory.inflate(R.layout.bookmark_picker_list_item, viewGroup, false); + } + + if (!cursor.isClosed()) { + cursor.moveToPosition(index); + CharSequence title = cursor.getString(BookmarkPickerActivity.TITLE_COLUMN); + ((TextView) layout.findViewById(R.id.bookmark_title)).setText(title); + CharSequence url = cursor.getString(BookmarkPickerActivity.URL_COLUMN); + ((TextView) layout.findViewById(R.id.bookmark_url)).setText(url); + } // Otherwise... just don't update as the object is shutting down + return layout; + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/share/BookmarkPickerActivity.java b/app/src/main/java/com/google/zxing/client/android/share/BookmarkPickerActivity.java new file mode 100644 index 0000000..c4cc1f3 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/share/BookmarkPickerActivity.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.share; + +import android.app.ListActivity; +import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; +import android.util.Log; +import android.view.View; +import android.widget.ListView; + +/** + * This class is only needed because I can't successfully send an ACTION_PICK intent to + * com.android.browser.BrowserBookmarksPage. It can go away if that starts working in the future. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class BookmarkPickerActivity extends ListActivity { + + private static final String TAG = BookmarkPickerActivity.class.getSimpleName(); + + private static final String[] BOOKMARK_PROJECTION = { + "title", // Browser.BookmarkColumns.TITLE + "url", // Browser.BookmarkColumns.URL + }; + // Copied from android.provider.Browser.BOOKMARKS_URI: + private static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks"); + + static final int TITLE_COLUMN = 0; + static final int URL_COLUMN = 1; + + private static final String BOOKMARK_SELECTION = "bookmark = 1 AND url IS NOT NULL"; + + private Cursor cursor; + + @Override + protected void onResume() { + super.onResume(); + cursor = getContentResolver().query(BOOKMARKS_URI, BOOKMARK_PROJECTION, + BOOKMARK_SELECTION, null, null); + if (cursor == null) { + Log.w(TAG, "No cursor returned for bookmark query"); + finish(); + return; + } + setListAdapter(new BookmarkAdapter(this, cursor)); + } + + @Override + protected void onPause() { + if (cursor != null) { + cursor.close(); + cursor = null; + } + super.onPause(); + } + + @Override + protected void onListItemClick(ListView l, View view, int position, long id) { + if (!cursor.isClosed() && cursor.moveToPosition(position)) { + Intent intent = new Intent(); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + intent.putExtra("title", cursor.getString(TITLE_COLUMN)); // Browser.BookmarkColumns.TITLE + intent.putExtra("url", cursor.getString(URL_COLUMN)); // Browser.BookmarkColumns.URL + setResult(RESULT_OK, intent); + } else { + setResult(RESULT_CANCELED); + } + finish(); + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/share/LoadPackagesAsyncTask.java b/app/src/main/java/com/google/zxing/client/android/share/LoadPackagesAsyncTask.java new file mode 100644 index 0000000..a49f2a0 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/share/LoadPackagesAsyncTask.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.share; + +import android.app.ListActivity; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageItemInfo; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.os.AsyncTask; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.ListAdapter; +import net.foucry.pilldroid.R; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Loads a list of packages installed on the device asynchronously. + * + * @author Sean Owen + */ +final class LoadPackagesAsyncTask extends AsyncTask<Object,Object,List<AppInfo>> { + + private static final String[] PKG_PREFIX_WHITELIST = { + "com.google.android.apps.", + }; + private static final String[] PKG_PREFIX_BLACKLIST = { + "com.android.", + "android", + "com.google.android.", + "com.htc", + }; + + private final ListActivity activity; + + LoadPackagesAsyncTask(ListActivity activity) { + this.activity = activity; + } + + @Override + protected List<AppInfo> doInBackground(Object... objects) { + List<AppInfo> labelsPackages = new ArrayList<>(); + PackageManager packageManager = activity.getPackageManager(); + Iterable<ApplicationInfo> appInfos = packageManager.getInstalledApplications(0); + for (PackageItemInfo appInfo : appInfos) { + String packageName = appInfo.packageName; + if (!isHidden(packageName)) { + CharSequence label = appInfo.loadLabel(packageManager); + Drawable icon = appInfo.loadIcon(packageManager); + if (label != null) { + labelsPackages.add(new AppInfo(packageName, label.toString(), icon)); + } + } + } + Collections.sort(labelsPackages); + return labelsPackages; + } + + private static boolean isHidden(String packageName) { + if (packageName == null) { + return true; + } + for (String prefix : PKG_PREFIX_WHITELIST) { + if (packageName.startsWith(prefix)) { + return false; + } + } + for (String prefix : PKG_PREFIX_BLACKLIST) { + if (packageName.startsWith(prefix)) { + return true; + } + } + return false; + } + + @Override + protected void onPostExecute(final List<AppInfo> results) { + ListAdapter listAdapter = new ArrayAdapter<AppInfo>(activity, + R.layout.app_picker_list_item, + R.id.app_picker_list_item_label, + results) { + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View view = super.getView(position, convertView, parent); + Drawable icon = results.get(position).getIcon(); + if (icon != null) { + ((ImageView) view.findViewById(R.id.app_picker_list_item_icon)).setImageDrawable(icon); + } + return view; + } + }; + activity.setListAdapter(listAdapter); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/share/ShareActivity.java b/app/src/main/java/com/google/zxing/client/android/share/ShareActivity.java new file mode 100644 index 0000000..d779d20 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/share/ShareActivity.java @@ -0,0 +1,306 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.share; + +import android.app.Activity; +import android.content.ContentResolver; +import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.BaseColumns; +import android.provider.ContactsContract; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; +import android.widget.TextView; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.client.android.Contents; +import com.google.zxing.client.android.Intents; +import com.google.zxing.client.android.clipboard.ClipboardInterface; + +import net.foucry.pilldroid.R; + +/** + * Barcode Scanner can share data like contacts and bookmarks by displaying a QR Code on screen, + * such that another user can scan the barcode with their phone. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public final class ShareActivity extends Activity { + + private static final String TAG = ShareActivity.class.getSimpleName(); + + private static final int PICK_BOOKMARK = 0; + private static final int PICK_CONTACT = 1; + private static final int PICK_APP = 2; + + private View clipboardButton; + + private final View.OnClickListener contactListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + startActivityForResult(intent, PICK_CONTACT); + } + }; + + private final View.OnClickListener bookmarkListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(Intent.ACTION_PICK); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + intent.setClassName(ShareActivity.this, BookmarkPickerActivity.class.getName()); + startActivityForResult(intent, PICK_BOOKMARK); + } + }; + + private final View.OnClickListener appListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(Intent.ACTION_PICK); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + intent.setClassName(ShareActivity.this, AppPickerActivity.class.getName()); + startActivityForResult(intent, PICK_APP); + } + }; + + private final View.OnClickListener clipboardListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + // Should always be true, because we grey out the clipboard button in onResume() if it's empty + CharSequence text = ClipboardInterface.getText(ShareActivity.this); + if (text != null) { + launchSearch(text.toString()); + } + } + }; + + private final View.OnKeyListener textListener = new View.OnKeyListener() { + @Override + public boolean onKey(View view, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) { + String text = ((TextView) view).getText().toString(); + if (text != null && !text.isEmpty()) { + launchSearch(text); + } + return true; + } + return false; + } + }; + + private void launchSearch(String text) { + Intent intent = new Intent(Intents.Encode.ACTION); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + intent.putExtra(Intents.Encode.TYPE, Contents.Type.TEXT); + intent.putExtra(Intents.Encode.DATA, text); + intent.putExtra(Intents.Encode.FORMAT, BarcodeFormat.QR_CODE.toString()); + startActivity(intent); + } + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + setContentView(R.layout.share); + + findViewById(R.id.share_contact_button).setOnClickListener(contactListener); + if (Build.VERSION.SDK_INT >= 23) { // Marshmallow / 6.0 + // Can't access bookmarks in 6.0+ + findViewById(R.id.share_bookmark_button).setEnabled(false); + } else { + findViewById(R.id.share_bookmark_button).setOnClickListener(bookmarkListener); + } + findViewById(R.id.share_app_button).setOnClickListener(appListener); + clipboardButton = findViewById(R.id.share_clipboard_button); + clipboardButton.setOnClickListener(clipboardListener); + findViewById(R.id.share_text_view).setOnKeyListener(textListener); + } + + @Override + protected void onResume() { + super.onResume(); + clipboardButton.setEnabled(ClipboardInterface.hasText(this)); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent intent) { + if (resultCode == RESULT_OK) { + switch (requestCode) { + case PICK_BOOKMARK: + case PICK_APP: + showTextAsBarcode(intent.getStringExtra("url")); // Browser.BookmarkColumns.URL + break; + case PICK_CONTACT: + // Data field is content://contacts/people/984 + showContactAsBarcode(intent.getData()); + break; + } + } + } + + private void showTextAsBarcode(String text) { + Log.i(TAG, "Showing text as barcode: " + text); + if (text == null) { + return; // Show error? + } + Intent intent = new Intent(Intents.Encode.ACTION); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + intent.putExtra(Intents.Encode.TYPE, Contents.Type.TEXT); + intent.putExtra(Intents.Encode.DATA, text); + intent.putExtra(Intents.Encode.FORMAT, BarcodeFormat.QR_CODE.toString()); + startActivity(intent); + } + + /** + * Takes a contact Uri and does the necessary database lookups to retrieve that person's info, + * then sends an Encode intent to render it as a QR Code. + * + * @param contactUri A Uri of the form content://contacts/people/17 + */ + private void showContactAsBarcode(Uri contactUri) { + Log.i(TAG, "Showing contact URI as barcode: " + contactUri); + if (contactUri == null) { + return; // Show error? + } + ContentResolver resolver = getContentResolver(); + + Cursor cursor; + try { + // We're seeing about six reports a week of this exception although I don't understand why. + cursor = resolver.query(contactUri, null, null, null, null); + } catch (IllegalArgumentException ignored) { + return; + } + if (cursor == null) { + return; + } + + String id; + String name; + boolean hasPhone; + try { + if (!cursor.moveToFirst()) { + return; + } + + id = cursor.getString(cursor.getColumnIndex(BaseColumns._ID)); + name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); + hasPhone = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0; + + + } finally { + cursor.close(); + } + + // Don't require a name to be present, this contact might be just a phone number. + Bundle bundle = new Bundle(); + if (name != null && !name.isEmpty()) { + bundle.putString(ContactsContract.Intents.Insert.NAME, massageContactData(name)); + } + + if (hasPhone) { + Cursor phonesCursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, + null, + ContactsContract.CommonDataKinds.Phone.CONTACT_ID + '=' + id, + null, + null); + if (phonesCursor != null) { + try { + int foundPhone = 0; + int phonesNumberColumn = phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); + int phoneTypeColumn = phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE); + while (phonesCursor.moveToNext() && foundPhone < Contents.PHONE_KEYS.length) { + String number = phonesCursor.getString(phonesNumberColumn); + if (number != null && !number.isEmpty()) { + bundle.putString(Contents.PHONE_KEYS[foundPhone], massageContactData(number)); + } + int type = phonesCursor.getInt(phoneTypeColumn); + bundle.putInt(Contents.PHONE_TYPE_KEYS[foundPhone], type); + foundPhone++; + } + } finally { + phonesCursor.close(); + } + } + } + + Cursor methodsCursor = resolver.query(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI, + null, + ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + '=' + id, + null, + null); + if (methodsCursor != null) { + try { + if (methodsCursor.moveToNext()) { + String data = methodsCursor.getString( + methodsCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS)); + if (data != null && !data.isEmpty()) { + bundle.putString(ContactsContract.Intents.Insert.POSTAL, massageContactData(data)); + } + } + } finally { + methodsCursor.close(); + } + } + + Cursor emailCursor = resolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, + null, + ContactsContract.CommonDataKinds.Email.CONTACT_ID + '=' + id, + null, + null); + if (emailCursor != null) { + try { + int foundEmail = 0; + int emailColumn = emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA); + while (emailCursor.moveToNext() && foundEmail < Contents.EMAIL_KEYS.length) { + String email = emailCursor.getString(emailColumn); + if (email != null && !email.isEmpty()) { + bundle.putString(Contents.EMAIL_KEYS[foundEmail], massageContactData(email)); + } + foundEmail++; + } + } finally { + emailCursor.close(); + } + } + + Intent intent = new Intent(Intents.Encode.ACTION); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + intent.putExtra(Intents.Encode.TYPE, Contents.Type.CONTACT); + intent.putExtra(Intents.Encode.DATA, bundle); + intent.putExtra(Intents.Encode.FORMAT, BarcodeFormat.QR_CODE.toString()); + + Log.i(TAG, "Sending bundle for encoding: " + bundle); + startActivity(intent); + } + + private static String massageContactData(String data) { + // For now -- make sure we don't put newlines in shared contact data. It messes up + // any known encoding of contact data. Replace with space. + if (data.indexOf('\n') >= 0) { + data = data.replace("\n", " "); + } + if (data.indexOf('\r') >= 0) { + data = data.replace("\r", " "); + } + return data; + } +} diff --git a/app/src/main/java/com/google/zxing/client/android/wifi/NetworkType.java b/app/src/main/java/com/google/zxing/client/android/wifi/NetworkType.java new file mode 100644 index 0000000..809e3c6 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/wifi/NetworkType.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2011 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.wifi; + +enum NetworkType { + + WEP, + WPA, + NO_PASSWORD; + + static NetworkType forIntentValue(String networkTypeString) { + if (networkTypeString == null) { + return NO_PASSWORD; + } + if ("WPA".equals(networkTypeString)) { + return WPA; + } + if ("WEP".equals(networkTypeString)) { + return WEP; + } + if ("nopass".equals(networkTypeString)) { + return NO_PASSWORD; + } + throw new IllegalArgumentException(networkTypeString); + } + +} diff --git a/app/src/main/java/com/google/zxing/client/android/wifi/WifiConfigManager.java b/app/src/main/java/com/google/zxing/client/android/wifi/WifiConfigManager.java new file mode 100644 index 0000000..ba11f90 --- /dev/null +++ b/app/src/main/java/com/google/zxing/client/android/wifi/WifiConfigManager.java @@ -0,0 +1,226 @@ +/* + * Copyright (C) 2011 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.client.android.wifi; + +import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiManager; +import android.os.AsyncTask; +import android.util.Log; + +import java.util.regex.Pattern; + +import com.google.zxing.client.result.WifiParsedResult; + +/** + * @author Vikram Aggarwal + * @author Sean Owen + */ +public final class WifiConfigManager extends AsyncTask<WifiParsedResult,Object,Object> { + + private static final String TAG = WifiConfigManager.class.getSimpleName(); + + private static final Pattern HEX_DIGITS = Pattern.compile("[0-9A-Fa-f]+"); + + private final WifiManager wifiManager; + + public WifiConfigManager(WifiManager wifiManager) { + this.wifiManager = wifiManager; + } + + @Override + protected Object doInBackground(WifiParsedResult... args) { + WifiParsedResult theWifiResult = args[0]; + // Start WiFi, otherwise nothing will work + if (!wifiManager.isWifiEnabled()) { + Log.i(TAG, "Enabling wi-fi..."); + if (wifiManager.setWifiEnabled(true)) { + Log.i(TAG, "Wi-fi enabled"); + } else { + Log.w(TAG, "Wi-fi could not be enabled!"); + return null; + } + // This happens very quickly, but need to wait for it to enable. A little busy wait? + int count = 0; + while (!wifiManager.isWifiEnabled()) { + if (count >= 10) { + Log.i(TAG, "Took too long to enable wi-fi, quitting"); + return null; + } + Log.i(TAG, "Still waiting for wi-fi to enable..."); + try { + Thread.sleep(1000L); + } catch (InterruptedException ie) { + // continue + } + count++; + } + } + String networkTypeString = theWifiResult.getNetworkEncryption(); + NetworkType networkType; + try { + networkType = NetworkType.forIntentValue(networkTypeString); + } catch (IllegalArgumentException ignored) { + Log.w(TAG, "Bad network type; see NetworkType values: " + networkTypeString); + return null; + } + if (networkType == NetworkType.NO_PASSWORD) { + changeNetworkUnEncrypted(wifiManager, theWifiResult); + } else { + String password = theWifiResult.getPassword(); + if (password != null && !password.isEmpty()) { + if (networkType == NetworkType.WEP) { + changeNetworkWEP(wifiManager, theWifiResult); + } else if (networkType == NetworkType.WPA) { + changeNetworkWPA(wifiManager, theWifiResult); + } + } + } + return null; + } + + /** + * Update the network: either create a new network or modify an existing network + * @param config the new network configuration + */ + private static void updateNetwork(WifiManager wifiManager, WifiConfiguration config) { + Integer foundNetworkID = findNetworkInExistingConfig(wifiManager, config.SSID); + if (foundNetworkID != null) { + Log.i(TAG, "Removing old configuration for network " + config.SSID); + wifiManager.removeNetwork(foundNetworkID); + wifiManager.saveConfiguration(); + } + int networkId = wifiManager.addNetwork(config); + if (networkId >= 0) { + // Try to disable the current network and start a new one. + if (wifiManager.enableNetwork(networkId, true)) { + Log.i(TAG, "Associating to network " + config.SSID); + wifiManager.saveConfiguration(); + } else { + Log.w(TAG, "Failed to enable network " + config.SSID); + } + } else { + Log.w(TAG, "Unable to add network " + config.SSID); + } + } + + private static WifiConfiguration changeNetworkCommon(WifiParsedResult wifiResult) { + WifiConfiguration config = new WifiConfiguration(); + config.allowedAuthAlgorithms.clear(); + config.allowedGroupCiphers.clear(); + config.allowedKeyManagement.clear(); + config.allowedPairwiseCiphers.clear(); + config.allowedProtocols.clear(); + // Android API insists that an ascii SSID must be quoted to be correctly handled. + config.SSID = quoteNonHex(wifiResult.getSsid()); + config.hiddenSSID = wifiResult.isHidden(); + return config; + } + + // Adding a WEP network + private static void changeNetworkWEP(WifiManager wifiManager, WifiParsedResult wifiResult) { + WifiConfiguration config = changeNetworkCommon(wifiResult); + config.wepKeys[0] = quoteNonHex(wifiResult.getPassword(), 10, 26, 58); + config.wepTxKeyIndex = 0; + config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); + config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); + config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); + config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); + config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); + config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); + updateNetwork(wifiManager, config); + } + + // Adding a WPA or WPA2 network + private static void changeNetworkWPA(WifiManager wifiManager, WifiParsedResult wifiResult) { + WifiConfiguration config = changeNetworkCommon(wifiResult); + // Hex passwords that are 64 bits long are not to be quoted. + config.preSharedKey = quoteNonHex(wifiResult.getPassword(), 64); + config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); + config.allowedProtocols.set(WifiConfiguration.Protocol.WPA); // For WPA + config.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // For WPA2 + config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); + config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP); + config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); + config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); + config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); + config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); + updateNetwork(wifiManager, config); + } + + // Adding an open, unsecured network + private static void changeNetworkUnEncrypted(WifiManager wifiManager, WifiParsedResult wifiResult) { + WifiConfiguration config = changeNetworkCommon(wifiResult); + config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); + updateNetwork(wifiManager, config); + } + + private static Integer findNetworkInExistingConfig(WifiManager wifiManager, String ssid) { + Iterable<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks(); + if (existingConfigs != null) { + for (WifiConfiguration existingConfig : existingConfigs) { + String existingSSID = existingConfig.SSID; + if (existingSSID != null && existingSSID.equals(ssid)) { + return existingConfig.networkId; + } + } + } + return null; + } + + private static String quoteNonHex(String value, int... allowedLengths) { + return isHexOfLength(value, allowedLengths) ? value : convertToQuotedString(value); + } + + /** + * Encloses the incoming string inside double quotes, if it isn't already quoted. + * @param s the input string + * @return a quoted string, of the form "input". If the input string is null, it returns null + * as well. + */ + private static String convertToQuotedString(String s) { + if (s == null || s.isEmpty()) { + return null; + } + // If already quoted, return as-is + if (s.charAt(0) == '"' && s.charAt(s.length() - 1) == '"') { + return s; + } + return '\"' + s + '\"'; + } + + /** + * @param value input to check + * @param allowedLengths allowed lengths, if any + * @return true if value is a non-null, non-empty string of hex digits, and if allowed lengths are given, has + * an allowed length + */ + private static boolean isHexOfLength(CharSequence value, int... allowedLengths) { + if (value == null || !HEX_DIGITS.matcher(value).matches()) { + return false; + } + if (allowedLengths.length == 0) { + return true; + } + for (int length : allowedLengths) { + if (value.length() == length) { + return true; + } + } + return false; + } + +} diff --git a/app/src/main/java/net/foucry/pilldroid/MedicamentListActivity.java b/app/src/main/java/net/foucry/pilldroid/MedicamentListActivity.java index 5d357fc..5bfe26a 100644 --- a/app/src/main/java/net/foucry/pilldroid/MedicamentListActivity.java +++ b/app/src/main/java/net/foucry/pilldroid/MedicamentListActivity.java @@ -4,12 +4,10 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.design.widget.FloatingActionButton; import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; -import android.support.design.widget.FloatingActionButton; -import android.support.design.widget.Snackbar; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -18,11 +16,6 @@ import android.widget.ImageView; import android.widget.SimpleCursorAdapter; import android.widget.TextView; - -import net.foucry.pilldroid.Medicament; -import net.foucry.pilldroid.dummy.DummyContent; -import static net.foucry.pilldroid.UtilDate.*; -import static net.foucry.pilldroid.Utils.*; import java.text.SimpleDateFormat; import java.util.Collections; import java.util.Comparator; @@ -30,6 +23,9 @@ import java.util.List; import java.util.Locale; import java.util.Random; +import static net.foucry.pilldroid.UtilDate.date2String; +import static net.foucry.pilldroid.Utils.doubleRandomInclusive; + /** * An activity representing a list of Medicaments. This activity * has different presentations for handset and tablet-size devices. On @@ -74,8 +70,12 @@ public class MedicamentListActivity extends AppCompatActivity { fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - Snackbar.make(view, "Will be used to add a drug to the list", Snackbar.LENGTH_LONG) - .setAction("Action", null).show(); + /* Snackbar.make(view, "Will be used to add a drug to the list", Snackbar.LENGTH_LONG) + .setAction("Action", null).show(); */ + Intent intent = new Intent("com.google.zxing.client.android.SCAN"); + intent.putExtra("SCAN_MODE", "CODE_128"); + //intent.putExtra("SCAN_FORMATS", "EAN_13,DATA_MATRIX"); + startActivityForResult(intent, 0); } }); @@ -247,6 +247,27 @@ public class MedicamentListActivity extends AppCompatActivity { public String toString() { return super.toString() + " '" + mContentView.getText() + "'"; } + + public void scanNow(View view) { + Intent intent = new Intent("com.google.zxing.client.android.SCAN"); + intent.putExtra("SCAN_MODE", "CODE_128"); + //intent.putExtra("SCAN_FORMATS", "EAN_13,DATA_MATRIX"); + startActivityForResult(intent, 0); + } + + public void onActivityResult(int requestCode, int resultCode, Intent intent) { + if (requestCode == 0) { + if (resultCode == RESULT_OK) { + String contents = intent.getStringExtra("SCAN_RESULT"); + String format = intent.getStringExtra("SCAN_RESULT_FORMAT"); + Log.i("Prout", format); + Log.i("Prout", contents); + // Handle successful scan + } else if (resultCode == RESULT_CANCELED) { + // Handle cancel + } + } + } } } } diff --git a/app/src/main/res/drawable/share_via_barcode.png b/app/src/main/res/drawable/share_via_barcode.png new file mode 100644 index 0000000000000000000000000000000000000000..56c34492985d3e9cb0b434479deedf2a2020749d GIT binary patch literal 3207 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_medicament_list.xml b/app/src/main/res/layout/activity_medicament_list.xml index a7aa1fb..33ff41a 100644 --- a/app/src/main/res/layout/activity_medicament_list.xml +++ b/app/src/main/res/layout/activity_medicament_list.xml @@ -36,6 +36,7 @@ android:layout_height="60dp" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" + android:onClick="scanNow" android:src="@android:drawable/ic_input_add" android:adjustViewBounds="true" android:clickable="false" diff --git a/app/src/main/res/layout/app_picker_list_item.xml b/app/src/main/res/layout/app_picker_list_item.xml new file mode 100644 index 0000000..0f68618 --- /dev/null +++ b/app/src/main/res/layout/app_picker_list_item.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2008 ZXing authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:orientation="horizontal" + android:layout_width="fill_parent" + android:layout_height="wrap_content"> + + <ImageView android:id="@+id/app_picker_list_item_icon" + android:layout_width="64dip" + android:layout_height="64dip" + android:scaleType="centerInside" + android:padding="@dimen/half_padding" + tools:ignore="ContentDescription"/> + + <TextView android:id="@+id/app_picker_list_item_label" + android:layout_width="wrap_content" + android:layout_height="fill_parent" + android:gravity="center_vertical" + android:textAppearance="?android:attr/textAppearanceLarge" + android:singleLine="true" + android:padding="@dimen/half_padding"/> + +</LinearLayout> diff --git a/app/src/main/res/layout/bookmark_picker_list_item.xml b/app/src/main/res/layout/bookmark_picker_list_item.xml new file mode 100644 index 0000000..95398b4 --- /dev/null +++ b/app/src/main/res/layout/bookmark_picker_list_item.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2008 ZXing authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:padding="@dimen/half_padding"> + + <TextView android:id="@+id/bookmark_title" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:textAppearance="?android:attr/textAppearanceLarge" + android:singleLine="true" + android:textIsSelectable="false"/> + + <TextView android:id="@+id/bookmark_url" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:textAppearance="?android:attr/textAppearanceSmall" + android:singleLine="false" + android:textIsSelectable="false"/> + +</LinearLayout> diff --git a/app/src/main/res/layout/capture.xml b/app/src/main/res/layout/capture.xml new file mode 100644 index 0000000..658e0f3 --- /dev/null +++ b/app/src/main/res/layout/capture.xml @@ -0,0 +1,204 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2008 ZXing authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<merge xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools"> + + <SurfaceView android:id="@+id/preview_view" + android:layout_width="fill_parent" + android:layout_height="fill_parent"/> + + <com.google.zxing.client.android.ViewfinderView + android:id="@+id/viewfinder_view" + android:layout_width="fill_parent" + android:layout_height="fill_parent"/> + + <LinearLayout android:id="@+id/result_view" + android:orientation="vertical" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:background="@color/result_view" + android:visibility="gone" + android:baselineAligned="false"> + + <LinearLayout + android:orientation="horizontal" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:gravity="center" + android:padding="@dimen/standard_padding"> + + <LinearLayout + android:orientation="vertical" + android:layout_width="wrap_content" + android:layout_height="fill_parent" + android:gravity="right|center_vertical"> + + <ImageView android:id="@+id/barcode_image_view" + android:layout_width="160dip" + android:layout_height="wrap_content" + android:maxWidth="160dip" + android:maxHeight="160dip" + android:layout_marginBottom="@dimen/half_padding" + android:adjustViewBounds="true" + android:scaleType="centerInside" + tools:ignore="ContentDescription"/> + + <LinearLayout + android:orientation="horizontal" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + <TextView android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/msg_default_format" + android:textColor="@color/result_minor_text" + android:textStyle="bold" + android:paddingRight="@dimen/half_padding"/> + + <TextView android:id="@+id/format_text_view" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="@color/result_minor_text"/> + + </LinearLayout> + + <LinearLayout + android:orientation="horizontal" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + <TextView android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/msg_default_type" + android:textColor="@color/result_minor_text" + android:textStyle="bold" + android:paddingRight="@dimen/half_padding"/> + + <TextView android:id="@+id/type_text_view" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="@color/result_minor_text"/> + + </LinearLayout> + + <LinearLayout + android:orientation="horizontal" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + <TextView android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/msg_default_time" + android:textColor="@color/result_minor_text" + android:textStyle="bold" + android:paddingRight="@dimen/half_padding"/> + + <TextView android:id="@+id/time_text_view" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="@color/result_minor_text"/> + + </LinearLayout> + + <LinearLayout + android:orientation="horizontal" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + <TextView android:id="@+id/meta_text_view_label" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/msg_default_meta" + android:textColor="@color/result_minor_text" + android:textStyle="bold" + android:paddingRight="@dimen/half_padding"/> + + <TextView android:id="@+id/meta_text_view" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="@color/result_minor_text"/> + + </LinearLayout> + + </LinearLayout> + + <ScrollView + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <TextView android:id="@+id/contents_text_view" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="@color/result_text" + android:textColorLink="@color/result_text" + android:textSize="22sp" + android:paddingLeft="12dip" + android:autoLink="web" + android:textIsSelectable="true"/> + + <TextView android:id="@+id/contents_supplement_text_view" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="@color/result_text" + android:textColorLink="@color/result_text" + android:paddingLeft="12dip" + android:autoLink="web" + android:textIsSelectable="true"/> + + </LinearLayout> + + </ScrollView> + + </LinearLayout> + + <LinearLayout android:id="@+id/result_button_view" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:gravity="center"> + + <Button style="@style/ResultButton" + android:visibility="gone"/> + + <Button style="@style/ResultButton" + android:visibility="gone"/> + + <Button style="@style/ResultButton" + android:visibility="gone"/> + + <Button style="@style/ResultButton" + android:visibility="gone"/> + + </LinearLayout> + + </LinearLayout> + + <TextView android:id="@+id/status_view" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="bottom|center_horizontal" + android:background="@color/transparent" + android:text="@string/msg_default_status" + android:textColor="@color/status_text"/> + +</merge> diff --git a/app/src/main/res/layout/encode.xml b/app/src/main/res/layout/encode.xml new file mode 100644 index 0000000..120935f --- /dev/null +++ b/app/src/main/res/layout/encode.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2008 ZXing authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:fillViewport="true" + android:background="@color/encode_view" + android:orientation="vertical" + android:gravity="center" + tools:ignore="Overdraw"> + + <ImageView android:id="@+id/image_view" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:scaleType="center" + tools:ignore="ContentDescription"/> + + <ScrollView android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:gravity="center"> + + <TextView android:id="@+id/contents_text_view" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:gravity="center" + android:textColor="@color/contents_text" + android:paddingBottom="@dimen/standard_padding" + android:paddingLeft="@dimen/standard_padding" + android:paddingRight="@dimen/standard_padding" + android:textIsSelectable="true"/> + + </ScrollView> + +</LinearLayout> diff --git a/app/src/main/res/layout/help.xml b/app/src/main/res/layout/help.xml new file mode 100644 index 0000000..786a624 --- /dev/null +++ b/app/src/main/res/layout/help.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2008 ZXing authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<WebView xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/help_contents" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:layout_weight="1"/> \ No newline at end of file diff --git a/app/src/main/res/layout/history_list_item.xml b/app/src/main/res/layout/history_list_item.xml new file mode 100644 index 0000000..0c060b4 --- /dev/null +++ b/app/src/main/res/layout/history_list_item.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2008 ZXing authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:padding="@dimen/standard_padding"> + + <TextView android:id="@+id/history_title" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:textAppearance="?android:attr/textAppearanceLarge" + android:singleLine="true" + android:textIsSelectable="false"/> + + <TextView android:id="@+id/history_detail" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:textAppearance="?android:attr/textAppearanceSmall" + android:singleLine="false" + android:textIsSelectable="false"/> + +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/search_book_contents.xml b/app/src/main/res/layout/search_book_contents.xml new file mode 100644 index 0000000..f572a0d --- /dev/null +++ b/app/src/main/res/layout/search_book_contents.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2008 ZXing authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:orientation="vertical" + android:layout_width="fill_parent" + android:layout_height="fill_parent"> + + <LinearLayout + android:orientation="horizontal" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_weight="0"> + + <EditText android:id="@+id/query_text_view" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="left|center_vertical" + android:layout_weight="1" + android:singleLine="true" + android:selectAllOnFocus="true" + android:inputType="text" + tools:ignore="NestedWeights"/> + + <Button android:id="@+id/query_button" + style="@android:style/Widget.Holo.Button.Borderless.Small" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="0" + android:text="@string/button_search_book_contents"/> + + </LinearLayout> + + + <ListView android:id="@+id/result_list_view" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_weight="1"/> + +</LinearLayout> diff --git a/app/src/main/res/layout/search_book_contents_header.xml b/app/src/main/res/layout/search_book_contents_header.xml new file mode 100644 index 0000000..09d627e --- /dev/null +++ b/app/src/main/res/layout/search_book_contents_header.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2008 ZXing authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<TextView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:paddingLeft="@dimen/standard_padding" + android:paddingBottom="@dimen/half_padding" + android:enabled="false" + android:singleLine="true" + android:textIsSelectable="false"/> diff --git a/app/src/main/res/layout/search_book_contents_list_item.xml b/app/src/main/res/layout/search_book_contents_list_item.xml new file mode 100644 index 0000000..0238154 --- /dev/null +++ b/app/src/main/res/layout/search_book_contents_list_item.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2008 ZXing authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<com.google.zxing.client.android.book.SearchBookContentsListItem + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:padding="@dimen/standard_padding"> + + <TextView android:id="@+id/page_number_view" + android:layout_width="75dip" + android:layout_height="wrap_content" + android:layout_gravity="left|top" + android:layout_marginRight="@dimen/standard_padding" + android:singleLine="false" + android:textStyle="bold" + android:textIsSelectable="false"/> + + <TextView android:id="@+id/snippet_view" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="left|top" + android:singleLine="false" + android:textIsSelectable="false"/> + +</com.google.zxing.client.android.book.SearchBookContentsListItem> diff --git a/app/src/main/res/layout/share.xml b/app/src/main/res/layout/share.xml new file mode 100644 index 0000000..785cd0f --- /dev/null +++ b/app/src/main/res/layout/share.xml @@ -0,0 +1,95 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2008 ZXing authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<!-- ScrollView wrapper is to accommodate small screens. --> +<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:gravity="center"> + + <!-- Must wrap the rest in one layout --> + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="center" + android:orientation="vertical" + android:padding="@dimen/standard_padding"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="center" + android:text="@string/msg_share_explanation" + android:paddingBottom="@dimen/standard_padding" + android:textIsSelectable="false"/> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:scaleType="center" + android:src="@drawable/share_via_barcode" + android:paddingBottom="@dimen/standard_padding" + tools:ignore="ContentDescription"/> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:paddingBottom="@dimen/standard_padding"> + + <Button android:id="@+id/share_app_button" + style="@style/ShareButton" + android:layout_weight="1" + android:text="@string/button_share_app"/> + + <Button android:id="@+id/share_bookmark_button" + style="@style/ShareButton" + android:layout_weight="1" + android:text="@string/button_share_bookmark"/> + + </LinearLayout> + + <LinearLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:paddingBottom="@dimen/standard_padding"> + + <Button android:id="@+id/share_contact_button" + style="@style/ShareButton" + android:layout_weight="1" + android:text="@string/button_share_contact"/> + + <Button android:id="@+id/share_clipboard_button" + style="@style/ShareButton" + android:layout_weight="1" + android:text="@string/button_share_clipboard"/> + + </LinearLayout> + + <EditText android:id="@+id/share_text_view" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:hint="@string/msg_share_text" + android:singleLine="true" + android:selectAllOnFocus="true"/> + + </LinearLayout> + +</ScrollView> \ No newline at end of file diff --git a/app/src/main/res/menu/capture.xml b/app/src/main/res/menu/capture.xml new file mode 100644 index 0000000..fef1ad4 --- /dev/null +++ b/app/src/main/res/menu/capture.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2012 ZXing authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:id="@+id/menu_share" + android:title="@string/menu_share" + android:icon="@android:drawable/ic_menu_share" + android:orderInCategory="1" + android:showAsAction="withText|ifRoom"/> + <item android:id="@+id/menu_history" + android:title="@string/menu_history" + android:icon="@android:drawable/ic_menu_recent_history" + android:orderInCategory="2" + android:showAsAction="withText|ifRoom"/> + <item android:id="@+id/menu_settings" + android:title="@string/menu_settings" + android:icon="@android:drawable/ic_menu_preferences" + android:orderInCategory="3" + android:showAsAction="withText"/> + <item android:id="@+id/menu_help" + android:title="@string/menu_help" + android:icon="@android:drawable/ic_menu_help" + android:orderInCategory="4" + android:showAsAction="withText"/> +</menu> \ No newline at end of file diff --git a/app/src/main/res/menu/encode.xml b/app/src/main/res/menu/encode.xml new file mode 100644 index 0000000..b6b1237 --- /dev/null +++ b/app/src/main/res/menu/encode.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2012 ZXing authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:id="@+id/menu_share" + android:title="@string/menu_share" + android:icon="@android:drawable/ic_menu_share" + android:orderInCategory="1" + android:showAsAction="withText|ifRoom"/> + <item android:id="@+id/menu_encode" + android:title="@string/menu_encode_vcard" + android:icon="@android:drawable/ic_menu_sort_alphabetically" + android:orderInCategory="2" + android:showAsAction="withText|ifRoom"/> +</menu> \ No newline at end of file diff --git a/app/src/main/res/menu/history.xml b/app/src/main/res/menu/history.xml new file mode 100644 index 0000000..17faa05 --- /dev/null +++ b/app/src/main/res/menu/history.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2012 ZXing authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:id="@+id/menu_history_send" + android:title="@string/history_send" + android:icon="@android:drawable/ic_menu_share" + android:orderInCategory="1" + android:showAsAction="withText|ifRoom"/> + <item android:id="@+id/menu_history_clear_text" + android:title="@string/history_clear_text" + android:icon="@android:drawable/ic_menu_delete" + android:orderInCategory="2" + android:showAsAction="withText|ifRoom"/> +</menu> \ No newline at end of file diff --git a/app/src/main/res/raw/beep.ogg b/app/src/main/res/raw/beep.ogg new file mode 100644 index 0000000000000000000000000000000000000000..14199476a89093b575f6ef388febe417b5cd003b GIT binary patch literal 6401 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 Q!3(l<w0I|Y!;u01144^n5dZ)H literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml new file mode 100644 index 0000000..08959d5 --- /dev/null +++ b/app/src/main/res/values/arrays.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2008 ZXing authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<resources xmlns:tools="http://schemas.android.com/tools"> + <string-array name="country_codes" tools:ignore="MissingTranslation"> + <item>-</item> + <item>AR</item> + <item>AU</item> + <item>BR</item> + <item>BG</item> + <item>CA</item> + <item>CH</item> + <item>CN</item> + <item>CZ</item> + <item>DE</item> + <item>DK</item> + <item>ES</item> + <item>FI</item> + <item>FR</item> + <item>GB</item> + <item>GR</item> + <item>HU</item> + <item>ID</item> + <item>IT</item> + <item>JP</item> + <item>KR</item> + <item>NL</item> + <item>PL</item> + <item>PT</item> + <item>RO</item> + <item>RU</item> + <item>SE</item> + <item>SK</item> + <item>SI</item> + <item>TR</item> + <item>TW</item> + <item>US</item> + </string-array> + <string-array name="preferences_front_light_values" tools:ignore="MissingTranslation"> + <item>ON</item> + <item>AUTO</item> + <item>OFF</item> + </string-array> + <string-array name="preferences_front_light_options"> + <item>@string/preferences_front_light_on</item> + <item>@string/preferences_front_light_auto</item> + <item>@string/preferences_front_light_off</item> + </string-array> +</resources> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 3ab3e9c..90633b0 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -3,4 +3,15 @@ <color name="colorPrimary">#3F51B5</color> <color name="colorPrimaryDark">#303F9F</color> <color name="colorAccent">#FF4081</color> + <color name="contents_text">#ff000000</color> + <color name="encode_view">#ffffffff</color> + <color name="possible_result_points">#c0ffbd21</color> <!-- Android standard ICS color --> + <color name="result_minor_text">#ffc0c0c0</color> + <color name="result_points">#c099cc00</color> <!-- Android standard ICS color --> + <color name="result_text">#ffffffff</color> + <color name="result_view">#b0000000</color> + <color name="status_text">#ffffffff</color> + <color name="transparent">#00000000</color> + <color name="viewfinder_laser">#ffcc0000</color> <!-- Android standard ICS color --> + <color name="viewfinder_mask">#60000000</color> </resources> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e742b28..869e78e 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -4,4 +4,9 @@ <dimen name="app_bar_height">75dp</dimen> <dimen name="item_width">200dp</dimen> <dimen name="text_margin">16dp</dimen> + <!-- Default screen margins, per the Android Design guidelines. --> + <dimen name="activity_horizontal_margin">16dp</dimen> + <dimen name="activity_vertical_margin">16dp</dimen> + <dimen name="standard_padding">8dip</dimen> + <dimen name="half_padding">4dip</dimen> </resources> diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml new file mode 100644 index 0000000..58399b9 --- /dev/null +++ b/app/src/main/res/values/ids.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2008 ZXing authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<resources> + <item type="id" name="decode"/> + <item type="id" name="decode_failed"/> + <item type="id" name="decode_succeeded"/> + <item type="id" name="launch_product_query"/> + <item type="id" name="quit"/> + <item type="id" name="restart_preview"/> + <item type="id" name="return_scan_result"/> +</resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9684ed6..0b0ce68 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,4 +1,128 @@ <resources> <string name="app_name">PillDroid</string> <string name="title_medicament_detail">Medicament Detail</string> + <string name="app_picker_name">Applications</string> + <string name="bookmark_picker_name">Bookmarks</string> + <string name="button_add_calendar">Add to calendar</string> + <string name="button_add_contact">Add contact</string> + <string name="button_book_search">Book Search</string> + <string name="button_cancel">Cancel</string> + <string name="button_custom_product_search">Custom search</string> + <string name="button_dial">Dial number</string> + <string name="button_email">Send email</string> + <string name="button_get_directions">Get directions</string> + <string name="button_mms">Send MMS</string> + <string name="button_ok">OK</string> + <string name="button_open_browser">Open browser</string> + <string name="button_product_search">Product search</string> + <string name="button_search_book_contents">Search contents</string> + <string name="button_share_app">Application</string> + <string name="button_share_bookmark">Bookmark</string> + <string name="button_share_by_email">Share via email</string> + <string name="button_share_by_sms">Share via SMS</string> + <string name="button_share_clipboard">Clipboard</string> + <string name="button_share_contact">Contact</string> + <string name="button_show_map">Show map</string> + <string name="button_sms">Send SMS</string> + <string name="button_web_search">Web search</string> + <string name="button_wifi">Connect to Network</string> + <string name="contents_contact">Contact info</string> + <string name="contents_email">Email address</string> + <string name="contents_location">Geographic coordinates</string> + <string name="contents_phone">Phone number</string> + <string name="contents_sms">SMS address</string> + <string name="contents_text">Plain text</string> + <string name="history_clear_text">Clear history</string> + <string name="history_clear_one_history_text">Clear</string> + <string name="history_email_title">Barcode Scanner history</string> + <string name="history_empty">Empty</string> + <string name="history_empty_detail">No barcode scans have been recorded</string> + <string name="history_send">Send history</string> + <string name="history_title">History</string> + <string name="menu_encode_mecard">Use MECARD</string> + <string name="menu_encode_vcard">Use vCard</string> + <string name="menu_help">Help</string> + <string name="menu_history">History</string> + <string name="menu_settings">Settings</string> + <string name="menu_share">Share</string> + <string name="msg_bulk_mode_scanned">Bulk mode: barcode scanned and saved</string> + <string name="msg_camera_framework_bug">Sorry, the Android camera encountered a problem. You may need to restart the device.</string> + <string name="msg_default_format">Format</string> + <string name="msg_default_meta">Metadata</string> + <string name="msg_default_mms_subject">Hi</string> + <string name="msg_default_status">Place a barcode inside the viewfinder rectangle to scan it.</string> + <string name="msg_default_time">Time</string> + <string name="msg_default_type">Type</string> + <string name="msg_encode_contents_failed">Could not encode a barcode from the data provided.</string> + <string name="msg_error">Error</string> + <string name="msg_google_books">Google</string> + <string name="msg_google_product">Google</string> + <string name="msg_intent_failed">Sorry, the requested application could not be launched. The barcode contents may be invalid.</string> + <string name="msg_invalid_value">Invalid value</string> + <string name="msg_redirect">Redirect</string> + <string name="msg_sbc_book_not_searchable">Sorry, this book is not searchable.</string> + <string name="msg_sbc_failed">Sorry, the search encountered a problem.</string> + <string name="msg_sbc_no_page_returned">No page returned</string> + <string name="msg_sbc_page">Page</string> + <string name="msg_sbc_results">Results</string> + <string name="msg_sbc_searching_book">Searching book\u2026</string> + <string name="msg_sbc_snippet_unavailable">Snippet not available</string> + <string name="msg_share_explanation">You can share data by displaying a barcode on your screen and scanning it with another phone.</string> + <string name="msg_share_text">Or type some text and press Enter</string> + <string name="msg_sure">Are you sure?</string> + <string name="msg_unmount_usb">Sorry, the SD card is not accessible.</string> + <string name="preferences_actions_title">When a barcode is found\u2026</string> + <string name="preferences_auto_focus_title">Use auto focus</string> + <string name="preferences_auto_open_web_title">Open web pages automatically</string> + <string name="preferences_bulk_mode_summary">Scan and save many barcodes continuously</string> + <string name="preferences_bulk_mode_title">Bulk scan mode</string> + <string name="preferences_copy_to_clipboard_title">Copy to clipboard</string> + <string name="preferences_custom_product_search_summary" formatted="false">Substitutions: %s = contents, %f = format, %t = type</string> + <string name="preferences_custom_product_search_title">Custom search URL</string> + <string name="preferences_decode_1D_industrial_title">1D Industrial</string> + <string name="preferences_decode_1D_product_title">1D Product</string> + <string name="preferences_decode_Aztec_title">Aztec</string> + <string name="preferences_decode_Data_Matrix_title">Data Matrix</string> + <string name="preferences_decode_PDF417_title">PDF417 (β)</string> + <string name="preferences_decode_QR_title">QR Codes</string> + <string name="preferences_device_bug_workarounds_title">Device Bug Workarounds</string> + <string name="preferences_disable_barcode_scene_mode_title">No barcode scene mode</string> + <string name="preferences_disable_continuous_focus_summary">Use only standard focus mode</string> + <string name="preferences_disable_continuous_focus_title">No continuous focus</string> + <string name="preferences_disable_exposure_title">No exposure</string> + <string name="preferences_disable_metering_title">No metering</string> + <string name="preferences_front_light_summary">Improves scanning in low light on some phones, but may cause glare. Does not work on all phones.</string> + <string name="preferences_front_light_title">Use front light</string> + <string name="preferences_front_light_auto">Automatic</string> + <string name="preferences_front_light_off">Off</string> + <string name="preferences_front_light_on">On</string> + <string name="preferences_general_title">General settings</string> + <string name="preferences_history_summary">Store your scans in History</string> + <string name="preferences_history_title">Add to History</string> + <string name="preferences_invert_scan_title">Invert scan</string> + <string name="preferences_invert_scan_summary">Scan for white barcodes on black background. Not available on some devices.</string> + <string name="preferences_name">Settings</string> + <string name="preferences_orientation_title">No automatic rotation</string> + <string name="preferences_play_beep_title">Beep</string> + <string name="preferences_remember_duplicates_summary">Store multiple scans of the same barcode in History</string> + <string name="preferences_remember_duplicates_title">Remember duplicates</string> + <string name="preferences_result_title">Result settings</string> + <string name="preferences_scanning_title">When scanning for barcodes, decode\u2026</string> + <string name="preferences_search_country">Search country</string> + <string name="preferences_supplemental_summary">Try to retrieve more information about the barcode contents</string> + <string name="preferences_supplemental_title">Retrieve more info</string> + <string name="preferences_vibrate_title">Vibrate</string> + <string name="result_address_book">Found contact info</string> + <string name="result_calendar">Found calendar event</string> + <string name="result_email_address">Found email address</string> + <string name="result_geo">Found geographic coordinates</string> + <string name="result_isbn">Found book</string> + <string name="result_product">Found product</string> + <string name="result_sms">Found SMS address</string> + <string name="result_tel">Found phone number</string> + <string name="result_text">Found plain text</string> + <string name="result_uri">Found URL</string> + <string name="result_wifi">Found WLAN Configuration</string> + <string name="sbc_name">Google Book Search</string> + <string name="wifi_changing_network">Requesting connection to network\u2026</string> </resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 545b9c6..8a9ee49 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -16,5 +16,13 @@ <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> - +<style name="ShareButton" parent="@android:style/Widget.Holo.Button.Borderless.Small"> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + </style> +<style name="ResultButton" parent="@android:style/Widget.Holo.Button.Borderless.Small"> + <item name="android:layout_width">0dip</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_weight">1</item> +</style> </resources> diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml new file mode 100644 index 0000000..196fed1 --- /dev/null +++ b/app/src/main/res/xml/preferences.xml @@ -0,0 +1,135 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2008 ZXing authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> + <PreferenceCategory android:title="@string/preferences_scanning_title"> + <CheckBoxPreference + android:key="preferences_decode_1D_product" + android:defaultValue="true" + android:title="@string/preferences_decode_1D_product_title"/> + <CheckBoxPreference + android:key="preferences_decode_1D_industrial" + android:defaultValue="true" + android:title="@string/preferences_decode_1D_industrial_title"/> + <CheckBoxPreference + android:key="preferences_decode_QR" + android:defaultValue="true" + android:title="@string/preferences_decode_QR_title"/> + <CheckBoxPreference + android:key="preferences_decode_Data_Matrix" + android:defaultValue="true" + android:title="@string/preferences_decode_Data_Matrix_title"/> + <CheckBoxPreference + android:key="preferences_decode_Aztec" + android:defaultValue="false" + android:title="@string/preferences_decode_Aztec_title"/> + <CheckBoxPreference + android:key="preferences_decode_PDF417" + android:defaultValue="false" + android:title="@string/preferences_decode_PDF417_title"/> + </PreferenceCategory> + <PreferenceCategory android:title="@string/preferences_actions_title"> + <CheckBoxPreference + android:key="preferences_play_beep" + android:defaultValue="true" + android:title="@string/preferences_play_beep_title"/> + <CheckBoxPreference + android:key="preferences_vibrate" + android:defaultValue="false" + android:title="@string/preferences_vibrate_title"/> + <CheckBoxPreference + android:key="preferences_copy_to_clipboard" + android:defaultValue="true" + android:title="@string/preferences_copy_to_clipboard_title"/> + <CheckBoxPreference + android:key="preferences_auto_open_web" + android:defaultValue="false" + android:title="@string/preferences_auto_open_web_title"/> + <CheckBoxPreference + android:key="preferences_remember_duplicates" + android:defaultValue="false" + android:title="@string/preferences_remember_duplicates_title" + android:summary="@string/preferences_remember_duplicates_summary"/> + <CheckBoxPreference + android:key="preferences_history" + android:defaultValue="true" + android:title="@string/preferences_history_title" + android:summary="@string/preferences_history_summary"/> + <CheckBoxPreference + android:key="preferences_supplemental" + android:defaultValue="true" + android:title="@string/preferences_supplemental_title" + android:summary="@string/preferences_supplemental_summary"/> + </PreferenceCategory> + <PreferenceCategory android:title="@string/preferences_general_title"> + <ListPreference + android:entries="@array/preferences_front_light_options" + android:entryValues="@array/preferences_front_light_values" + android:key="preferences_front_light_mode" + android:defaultValue="OFF" + android:title="@string/preferences_front_light_title" + android:summary="@string/preferences_front_light_summary"/> + <CheckBoxPreference + android:key="preferences_auto_focus" + android:defaultValue="true" + android:title="@string/preferences_auto_focus_title"/> + <CheckBoxPreference + android:key="preferences_invert_scan" + android:defaultValue="false" + android:title="@string/preferences_invert_scan_title" + android:summary="@string/preferences_invert_scan_summary"/> + <CheckBoxPreference + android:key="preferences_bulk_mode" + android:defaultValue="false" + android:title="@string/preferences_bulk_mode_title" + android:summary="@string/preferences_bulk_mode_summary"/> + <CheckBoxPreference + android:key="preferences_orientation" + android:defaultValue="true" + android:title="@string/preferences_orientation_title"/> + </PreferenceCategory> + <PreferenceCategory android:title="@string/preferences_result_title"> + <EditTextPreference + android:key="preferences_custom_product_search" + android:title="@string/preferences_custom_product_search_title" + android:summary="@string/preferences_custom_product_search_summary"/> + <ListPreference + android:key="preferences_search_country" + android:defaultValue="-" + android:entries="@array/country_codes" + android:entryValues="@array/country_codes" + android:title="@string/preferences_search_country"/> + </PreferenceCategory> + <PreferenceCategory android:title="@string/preferences_device_bug_workarounds_title"> + <CheckBoxPreference + android:key="preferences_disable_continuous_focus" + android:defaultValue="true" + android:title="@string/preferences_disable_continuous_focus_title" + android:summary="@string/preferences_disable_continuous_focus_summary"/> + <CheckBoxPreference + android:key="preferences_disable_exposure" + android:defaultValue="true" + android:title="@string/preferences_disable_exposure_title"/> + <CheckBoxPreference + android:key="preferences_disable_metering" + android:defaultValue="true" + android:title="@string/preferences_disable_metering_title"/> + <CheckBoxPreference + android:key="preferences_disable_barcode_scene_mode" + android:defaultValue="true" + android:title="@string/preferences_disable_barcode_scene_mode_title"/> + </PreferenceCategory> +</PreferenceScreen>

gqK7AR)VSqGM6XTKHY zFaE_##{7K#xOD$~*m^s^7ya=?^V|w^3bhnxSMYBInTSQ1@+MOh=USU!j~hxgvq6v= zxk^Qlf)8!OX4xdpW{Wt6&TkW;?o?scZ9HIQaOiO5Aa~bA>Y|I-#=*J<7{FfFAK2V= ziv7zmKhU}REH}GuIEZ!KuGs?yTh1#*j376=gd!8o2u2RuOPvGgabw}xNQwq)WYAfK zW9$hJinCzu6<-SzV^0*jSncHYqRL_j3C-CphMLYpNj?K8Ypo-P3(}myXq=>&T1pza zb^X@+Fu{(r=UV3yaB!Fv)y@MLqLrOV`rRva|U#dt^DVdr(=pILg7tCQ4*hwA8((w+!g;H%HBa+5FpwP>}%V$ZQHhO+wN=I zwr$(CZQGuHFUguDE0gu+AFAr?I$JqoQ1f?rA)KD<*2bKuLA5K(P=Bzq)=Z&Gp+C&Z zE79VF7d?L8I<)#5g1LrAWZS6?ZyYg=JgFdT_e%lDbUnw?#pwVchv5Jrf* z-qE}`xzZ%g4Ma`wOzh{4tpob6jhZ@``?Tg}>x$5B&F-So`v;;@r04A{SZtv$)6dWy zI`VFmgu5E*{Pq=Sx>|~{8jB^2vinp}4YxVxv%|jcs|>-< zk3LHiE}NVoaM~9)?MIJ{Mk#NswTyM~B%Vzcy-i>pG~Xt}Cyt;iAN-O+nQwSUct8!cnk$%?Oiu@K%ks6ooVvLLV;N*To|fblB7K z9u9bvE#B2Z=?xOmS_^U|4+LMkF9qw)V~-RC>~$$E^oS3j$r*bSeWdM6T^5GamWA+A zj1L5lYOno`Mm{axPFTBe+o#l~@m|{>K$ySmFH}ylNuciOhuD3m)sA9C!xig!s)a^DCpG)KCHdHBYd$2MX>@0|%okT0P;fqsU)VG8-h(3S@Qmor#P zb-dPnMt23Fj!tZohAFpQ_CiJhXq|8y6;Mgf@JSVtGicZ2ImfP3_tg9A0;$`(S}iKe z`94tmbK7r;Aaf(KR-*q3#{Of2Ybo&eT2;BO+8>e*yKLC;tq#(xKd=#FfV0DgRue-I zYkOCE)$8nSd5a?e%ATjUB|$wFpQed1?y(Le+Pr`!L>N8;U>ymbyn&3LJpa0~y)zuQ z$-W77gF3d^+s>Je{qDgaOSSs^E!HJ-f#Mo(bYo)O4rOZ~#Nc=GC!o_N_t`)B-UenGa_7un_ zb*hphqHzfEzVbzOk(+E>xLsHN9_AJs(I(+cZ6VW_-D494{V$eRT}H%efYtdeOVH!v zkffP&pf-wV)+{tM#-*&ewwfd_OMPp`wd#1Pj*X{K z;JcH))6B!77SS-W2*EJ&zzeRWoWMIctO&<2$-#kZ8a*tMdo)p~a2?E-%pgZNV|-R} zF_V4wL9Xb!fjX8f^AXn%5@56~ZSxDTWB(RI66nT~eyi9u#EC5D`ZS1Rd>o7UeHm(N za{5^dc zLg@|QMJfpw38p7#B}S>27=$Y<@puP7w?El!@%TGY+ik(}yAhdhT`;Xub9_=4O^GF3 z79ztgq)V*+LI@W^O>@#o8SW0Ly>yhIz9F)4IdVDYO0ck`re*L5H#f4s82vq4rx`bar3E@L#6j z11u;cDujBTk!rtx1neD;(&ainB-kHkl0J?jCcd7PYOzibr!HG=P#CvN8-tizMUQt- z?X98-I!TV~xr9$xJgse~uh*z<*>-J^eOj}V?Bjr8$AQ2+?luIXug3|otfAK8(C$Am zet@8V2_~)wkq^Ys4+@hO2bJq2N*0W|N{OT=Mm;{|@B_#k&~jfLt_*zTz{^6=Kbn`u zb-K8~)T&2OuGWu9T*j1%=|%8!DFD-n-GI>qjSX_8JEPH0Bm$tc(pGX4wcD};=Vlo) zgL-f^RWOqMXs#6BwLmB!`4j+CC?-D5c}eV2c9lt`VjMchex4OqSygkLU9~p4m&NKy z_fW>h6i-Q9sXXB{!PoU5<3LdHTSOl|u&hhb9~-Oqc8&YJQg(RA;_n{e(IyQ;qe4d0 z6*k{|%aO6jwlU%qBF!h{9WiOoKPi-@M6X$Se7C6|be4_?^@4CSE8;hmofg)O7+6|J z$)#E>E38-~=BSRJs|E4Emt{F?ID9WEu-*;~?o8fM@DdyOgUI zc>{Fi=W7mJTorOf^l?Fx)D-A8ebYB+8g|NPH?`xMu@6owF^;&Hso<|`c^O|3l$hG- z1>QK6y4A|^NsL{z(&2RAHtkJy)fBNO`~DQvD}=TQKW!Jhu#*~P?8iE|8)xl z8K;ATK6Y-Y7N9I(sbBfKjvpMblQ<4$%4;(ju7^C&gWYV^tp)A;uQu&l9# zp1LA}zHuZUq7B`rLf^2Mp46iM)?$2KeyP60)PK>8e{rou?kW}i_IcimRg7SL6<*3M zCGb7k#j-_S7{Cv9H&{j?iRf64*hq&7Xf`>mGNOK%T0#L(?F>DZ#4tBvimXLMaq>$| zKRF;Zn}{pAkcovvvIOH*sh~7=F=`2LYnnKK@#d+MAJpPM2CO*L;(tWb8BOyCXFpuy zrVF^Fo>^CTKzHO;EpBv&It0IhQ({uSUvy7oTI3Em7U+HgH}^PJqgQf3cdGdy#(?_% zybWD$V3s&&2o1k6&vaNyTJvgATbCg`f=QW{n&y^-JDu$HMEQaL@gphTA>HyT{JoWT z{h6Wu1|#?)6Y@&kmHj0o_?>S4&4>R@W&FSmKJfv31&I6(1wOKgVps@}URLyO72l{K zo=O#`WYR|3arDKuKJM}E)`D5tPsXfK;}xz}G;LMQ36K)68ZbF1bb9jpkMAZ%3bUEc zzu0y$l>Zxi|3BvF{`Z{3|B+nt|H5}M(f{EdnU%v5L;e}*eAzH%=(R*_AT26KvPQE` zkWXMv3KEnyhY=-=7UT$ezARA%vE z>eQjm1B)2yTK9PDx$VB4j`I8cOw|L};^&Cr-HOh~dVQmx42?yZ8b%o5{%xBLEeHr^ zH*Bli6TsHlqNRKzmaUO%?=8{~Cum{R%j$A{92bly&|}=v%)jVR8Ku0sS$nq3H?U1; z)&D0*)|?J7K~B+byl!emi*Q3PSdl%<*L9!{nfoC0;j&%+O>wI(nWT3B9Yb05kj+cb zDs?YDp<$#4jFH}S>0}v%pP{BT#Y6bQ24Q+iy6R}&s!^#bncdWLgxU5eVzc?Vren+` z)YM|lAFfc{w!ENem6+s$-mawCelwJKy}%C->#%I*MO)XKHJ;7!3mTa03c8Wpbe$q; zy;-r|Hb^^a|ApgTtYD=XxMb9}a$01yuG}${=jth=m0*+6!=>~;f6~hjv2LZRF0q~S z4fhnGG!D`$5LL)`{Z3!rB0V#&zHYh-dEBb>UEV1cp%`oxErl6H%S9Fcc&pg7#Z;X? znIH`~jPtADTU05cuRZ`|M!Cf=H-wkqR5Png52UVS4}GKzvCr9O45ek~1fk`OQCZGj zH*MA_9JswjS1mN@bP3rnlxdXdY*uO1Y?y^zo*>QvYZ#);jI}I7$$SQGpSL_&WQVhwuRzwe}F9Z?uOkU^+Rh&a|PLaYBp^%Dk zc>p%;p%3OLy}%*zLz)PHNki^FXUkdpCt_k7F+HL3E=ZTu@&31t|j87*%g^UtK_D)X!fw^baV47g2I{Nezf+av)Oq0p+%b2vPzCQDN#G z#PhP9kiVQ>miABXcTeU091DF=KOvL{EGEsjb1r|^Hh2$ui*@lS8Rw6p2j3prk|?2? zM}LEX3p9B=qPp2v{gB zGwzVI^LP-~(^59_vIL`3M=7Zx3Z!;Q{*sH5Z4yN&=y4$YQhcH{9R-rI7qrAP%8BTn z^UDH{h5z9|z?VA!!h47Hc|-}uGobOqe#rle{nP>+C;5j1H10;$R*Am5Ww4CIA0NAhUBT~zr#lni8%M_9bqEJ)QD(9MocD;z=ueXoA@J= zV29#;?2ZZds`x&Uf*it{pQw;HO?6KTr$n^8B@YF&4eRUzof5IqC=P2l(Gp-y|6&50 zcF})@Mcy}Tyxk{!AaLyDuaiCzi)&;*`wI{Ffq1~qbT1QoVy_BM$(|lcLtXmr%~e4Rh1>lI13hCTsBxDk?4CI~hx8Me-COt!=eePgHWfKQuz9?Tpdhd4x9 z3k7raL^A~q%z;>C1YfdwafIGinR3w&e{!6rq{Y^0_C0{Vq)yR9&g`xCs2A_-XY?-b z{p8`Fl>-nUvx2h1poSPG`tp5MAWH5)CY1OJ!e!&MgjF5FYt}ZGSm@Sq`_8Ft1AV5O zBpSEz%WcAKqQUM5&s^x&$;&3_-K2d04BVuBt%i@dkWd!x0(|Zp&fu3s8&%||A3D)bp4zMDWS-e^m2F1} zX|PJj0-Q}yuvVBF>>^P!N-g<3d1Y;0Bg3Kl2*?>b{D#VjU>@c?4&4^T$Dsk^_JatG z2^+~3Tvn`5<3u2V{NCeWgf2Z6|1%6Y5@|N-)VEkty zM{$P=&0?gi4QbfAiaj{?lDs=i0Fq92W#{iAG4Q$D@I%hrYK$xC>QsE&>E z@7@GmJdA1&`#AZ-OwcKN=GMK#IK07_^5u?vi(+!9ql<#7tx6r?ZPJ8DYf?3%n=GrG zmX4_Y&DXxkp)JL( zpQ3{&mh7RVKwi7Lu|OK_->gB^Ao?nlA%YESjk@>qkJ#T`D>2iE%nw^P0=EMqi-S+B zPvw?VgiSfr)qrr5+!)(LJqeKNLzCJx8f!;xw}|yj$B&7bx3)~DY{g^-8V-+ih`lBT z#TpL|vp$qR)O_XnPgi5ICNf#ktT4L_^=M}4Z;&&FQr6Vk3ioBNOMwrLhpQ#X7}pC&5nnh(irZ$sI8L?a>?KP$=~wH z-4%=Q#(R9&4G%`ytMp|Kb&|>x>Jo#g-ONT@?NtRfPoJJ_+#I>6f|k9xr z59I>&xt=HFIFyyV#I?#wi0*{PtE`uTP7MZi^m>lKi>`z~nLsk;Xk^fN3K>by^AXvS#JBffRc}<+Ji;k$^w^1*JZWrom^BoiN4zck z8*atbBW-^$9Oji7xcv3Tk(jH%O#D@ZTq3>UXnnfr$*cf4HDe^tsVBN<1>QaMN}4rT zk3kS)^YvpP7R7WrF{95nGpOd%jiWxky@bLE#+hP&QJ^RAFCYsgzs3l>ba{m>%9%YW zqN#*g$_q5Rh0-cTRjde>2BmqhIwhsG0E5c&4+0BH`ig1n)X#VXwlKT1^2-W>jMaAU zaP;b|CRA35uQ z5Z>%-BL?gq`L5ncOe=lV?!M#~07h424ghiXedH=H{ zo$ZU&x0rfUJ974!ATq1!eJK>?vs*!CLX&njS3=mLE#|2ct*DLJ+$$~do!fzwEHf14 z2|UpP=19?-BAr^M_c`E9@LZKM;|MXrYC+bd_$p#8RTArn7X#tb+iX)p5ty9;8f`wZ zi8O3uU5sy6q?S1yMBsfiBcFufi;wp7R#kB+9wQkR`EWXtKHHN9DDv`LsX^j^m{6~{ z^W|17Ld?_w@(^!pN833O^ep3IINi>`uD^#t;uK(Rp3Xa&jIQh@W#R5rn@2s!mc<9v zDdLonml}?g+I_k}6;*W&X2Y_M>Ub2mfn?9RCZ{1% zCk+_j)cXAJU`X}E!UAUsSW&&9i#o-k+Hoy+sMS&NF@Ae9eY)H*kn5WgH?_59yk!fF z9$36|#gYT$bEplAJ6|&_7Y;9@R}ePA{5X#6l7pru7h~u8ir|6ZQUoq^*3+}_FxvJC zwJnd1Gl(Gdm(>E3F&0r_1rFBxJD?1%sTJS@b)!&NbmO~p94(i4YPPhqf2GKPRl?tn z1M*7_{ppnDg*zE6lz`Px$C{g_z$K)Eb9@g{|Qrf$AWJSm+yjKOjM2XqO;7!8eIO$%gE%41xc~Wmdv(lGM4;?rdgvOnhYstGe& z%k;Ps&Vdnqr+Gy`sbxd!|6UH~)B<0B8?ibCL#N1<4*30Jy}-b&L5Op1{^7|k#Qzyn z{_k}I|8>K#&_CwZ&Cb#Ie=!VaD@)lSsiE^Q;m$^7I~)wL(@IQnF+-60$D!#9?!+HT5%$Dpg2zYWF%I$$8j71Aw3U!gC6KKr}y`v-pCiO^ej zu*~sRxBSS!cxrHr3lk7?ghg7M-t^;CwA8eA<{2&uPRgE!I!au=u-v+0Zqh{Qu?yH_ zPBH_rVnj*9sUa;qv%OuNds=+DEjg_C)Tlj4olBtDo+mkVjwh#%(MBqzIf-@iW=GZ} zbwf2F5@)n?Gr=^#y}ji;AAuI+g@!5>n^H{fF^i;8UYF$5=$w#XTL!9dx)70)Nwp!3 z6-+T$pfZg{JPr+=CBaWB1^rV|`uRv*IsuC)Gr*Xrsgp*8g*O9JHj`aRm0`}F2aFeSkn5Wr%Bg(i9$E;qFFNhE#enMZvia zKO5ak$1BsRK3ZTH>^=b?1ZH%0QrtxIIQz3+>iXc6adizKvEdL3X(c^?wUihJCt{mn zNKi|7dV7Jft@qw9lK$R64ir6BBz0NKqS`B2Jl>&!}}NBp{{3V+8{h-x&ga z8eobZi#U<8R!Kh5o(4&$%c8 zXM?bKgQr9687AIvh0cV>qh;xr(7Ca0077h265Iaea@k?@ofEZ}=+8{_#Bkm*olp0c z+&3C;rK^q0JxT=OWqaWhxdifGE9_*wglx69Wrg2_Lf^lh?gh`Y`^k7hiEMdGw_$p= zC&1&uho>u&ukH03Lhr7fjER-S3A>pZyE!$^Fe6k3)q+G#W%MbN1E;nma@${D(m3ou9b>+XhMp0uijXC|JQSTAB$#w#6pA`Qp6u?}1dty$u zHRbtG_wDLOkrah;;>^-}pvt3jy+K`oa#XVQdmX>eoRmYB;?17&JCjL~S2n?W7)TzK zf!m}iKsDP;lNDL%%#hYbxTdGpa_o5nZ=iDczjlW8=y0fv~* zM}D>RZJ`e%9k|9h1nm|~sk~K>qE3rs>FN?3uX7H+`Xp6E0O4o+(aHlYJ4o0R{>vl_ zH|dWUsu$HcCt^qywEy`7_#cA=?Ckf?9>||RYX8^e1nqxeIq^S6$bVZ&L@V1UA*mtz z+BU3{I0)Z5-2jF3qJGYLpUHK`Rmz1*y(mC04BYt6mBwzUoqe+l>vQo8~^ zr76$2U4rwQ$qPs+^0im|*Kn0ub7|YuV-^+|5iE-&?x}k)`sAnPdT~EM$tgetfTmM6 z_Z+bwGDk$iEK+vbwv>m>O(y~xt-IkoMS6GN2VFU!ViBG`!o-eG?Y=9*>U5{u#WGoY z+cP^ieNw|U{p}085!bWlSzf=)lC{iebc54^I4Ao@K!1+ICC_;Ey~vM?e$q>B+Ee{i zaS*nk>KL^Bl4X)2)BhBWyR}^}F^Rae))0&<21VKAZ%E2NpvX=b{l&sT5>pctXeeIJ zL)E>Y5YiI;Yu(O9i{QTLFP8x#+PFB(cH*DzB!elyB^jZ#sk=zGxy!NT`P*CAHl5Bn z;-G{7S^T)@04u~Px?Z#%RX<+$4ygvrxP7da5hDf6sVbjm_L!5cg5yRn^vEl*v*lxy zD$!-Ra`|KrOe(QOK|_Ec(UHtU^Yr^zt{vqI^*7=XeF*-HW1cnyK~n_jjCQNbyFO8AOMG)y>K{?hUpiTRj}+@U1WZEics*~ms* zI5nOK>0iYgd5Z4Al2se-3c36uwuDpS#$HmTYJ1$pkGK(cy1Hb;PCmwzGjn!K#TGt; z&470qrwB8|2c>H3l{c6WrD0kOx?|Hry0BZ|DOX=Oxb+h-Sw}wQ zProLcdo$Uas+@fn)>j+ZTMICQdwj#Yr?T%$DQ&fQS}Bg4P&E3|odx(05O_Oo=qlSY zSi&yeq*hU>m#I3RARiRbFE~)Iv&&mm;b3{3-d@dA#`k}=Pq7pfs#ya4`2z&@Kf}TQ zJwN83!talfoeiCtot>Gr37x0=zl0dN|BY4oKlcF;{}W36_h!9fWh*5_1$19kRM-CJ zkkq4s6or5k^ZjCeKm;*U`6`vjbD_oo$xCXf#=nb8au-qu(yS~jzBghl-KYG~va)!F zZYMr39H-qpbfVDpa194x5a764kVkZQpx*bZ0)IQv0$1FE;U`$8ZSF=4A&2mc=X(Jd_>!_z2dj=x3+i3 zuOQBjRrJcW+GR%GF6>ByVHe)Nt0?i`8zvuWkfyB}amwwBHnj~y;LP#u)IVe!J2qiShkM{!H~DzZRVu6DirFQL>Eh>W9T>IkVqPlwA+v~n=_V$)ff|&QpKuSt`mAJ z=mGpMyH7O~KoYN<vb*T@{WHmCHoeR@j~>P-&{^lEV=HN0Jql>K8WHJc}sxtpIqj4 z`}x5FakBK;&&-gD#Sv_`hG@XkNLgjZaOI!|$ey(O?&H(`ZW`-&-@?9!jNH4hLNS3q`e5>Cq!=K;dP?+PY2RVjEcyjWr5RNp;=Z=SVLTdd zMtkEETzUMW7|v61%n;=EPlt;g6{R8#k4xZ@ebdTe7oi@bhAcCIm->;iNK^-4-V$~DDsl^X8Wpk20J@4N6cQ0c zfW$<$^_L2*!b_n`z54n8>@jpbbss`3B|NVX> ztLn&MsloHCvg+2c!N~SO%oSNkhRZ<9LP7usY8~(&j)XAF<`I978Pb`Kd#2W`f`2Hh zR45JvoSQinJo z;YpsSBta5vjo^StL8gENXk}xGCC5TZlr)Vx{btfPB@zCGg`Lr8@sh#Ci(WG*NN0wW=hg8Fh43U`k~k zjq@Btw_k-Z#F|FAmTa)zG*OcCt+$~cHnp(%IuLFsLc^Gq&|Su+pdL3&Yig|M%$b6( zubSGdS5XsD#s615z*1PGC4w2#+D~I&v}ZXCR<#5qID*l*h0Np|>%i$e>EhZpyX?kd zrO}bd&}^x~xUo60o_9)Oq}FsTjTDeqsAg3{1#i<4S1+SP*AZe`@T%WBm5=R7GO7P-p4L>-{qyarz~W^)0Za*d_5Y!(aAx~N^Ea6xDIl6^Q32!6Hs zf)h%?0nvx@CP3r1{0%+#%7cYW{+@zY$pH^@(;ePu#i1!XOTk5@s-P^dNN^OhzLMNX zC)ht4_1EV>IcpSjQu+Q*sdCzyyn=smpK5*hEC^yPV+i0jSQwfb+gLTf99Iv=7uZQv zC0B+O7hnWiL!{MFCkS;e;yW68#4#+H`0%gI!4c-l&d~#cqy2X#%TBJf)9hRY z$>1NrEsmw8tdgXVT*Nt^FJQwr3~wsAym%oGojrlrXY0(b~=YEL6o&&1pnZ8oi5TlniXOoJr0t=bUzVUBV2Fz>E|4AbXh6gmL{G$=g|Cffz|9!@b{g-C^{}RBdXy+zjYiwck zAKmuhYiW?;cogrc%Tk$iVRxX14)Tg6W z;$FlGB=pr~yx3M$cHzUC1*-2OF!3)b4>2dpi={fsJJ!KQ)2dzGwpEqg>4#26Sf;eO z3*>uM`)&NPK1JJ_bIU8n!>K_T1=tv>cu=7Q(fRJezGPt8;Va^${L>h->1HHV_JoL5 zdd4oUB1n;jmzVCg>`7t6R)+I6EidVSJtYE0z>=ZHo&2t)B+DDDi=<-lT`^*`I(U(6 zP{_Fo1~QJ-OD*gOkhM18E@hFHZOZzNWgaqWW(A}xD+tFnvUPlqXXj@7ukzZEFsg)0 z*pfk}vgL>0gVn0;)yvW<%7pBMgn)&E^XjF|^tRQJLmiw-q$?Ahi&O5_-(6!D%c@(J za7?(O7aiHk1LUkYe$WIA#*@HZ7R7)hR3Qf4$>AR%X*Kx~`ADa{c zZB;32&d%x%poH#+#+9DypUWxy94&oix|?Sr68^Mv+cpocXe{VJ%d#slg;gYr2>o52 zbE;H0S;-4TW{V@^312%9&VmGfzzAo_cgcS+5Bs=M(ACw$zKjU1-UvJDkT5%{V=N!w zr*Oq2?^g!mIV0JC<_?d91~zE~wSu`CPy#OU-#%lyYqHLXpKd%O5{L1In#Fiy?J?Tx zTr=A9xSGHF*L$@u0#w-tq-xmGx0Da8h&jCYD(UmRMpjG(Lh73y5&USm9)G@Jcnx?g z-9~T`O}yT&``7n`E`DK z1V{#!LV>AIfPrDrSUH)Xev#9a&@6x&%&C%ktr>4DZ(GsWoz~y{BcRO|gjlUT96-EB zS)qiHBe>LHAFt?fr@RNHC>Hd>)sO+FMM1D9%w_O8^D?(sPjD z13wJn75~i5*Vu+|S6O~l%H!+EmwR*#F7f4foJ~ZfZM4H8Y#}Z;3NjRu=C< zBT24YcJ*v=;4?63BTw#4j;Or~e(3%f8D&IRq{h&IiSQs|NGSx9fkRO;fkq@{l@QB4 z0~nhjEo&j}t3ClPF+ScfA?o!o^{|w>e{CNxv*919d)SnH9_`@WLrd?ek59HBdvqDW zP?C{4J}??XL`@Nll`yD!)hYhuGC^to6Bp=Fv8L7tvy(k2>Am*lvBH>I(oxvO3aPMN z?Tv>3Ks8nx&x{roBvpnSU7_)~KavKy3*1v=UD}4UmJa2>C2jo2fj}aL+;+NRbJK{t z-oXixyQA*9EL&acz3zvW=1&u$=6!(fXPI#J9HU)Nb9iTwmI2;0zGAV;Os&LSwSgYU zr-(b4sLST+-oPBz#m-TsrdH|&`;cB4MqdboQg?W9|KjFYm?Id7n!AYX!F^)bAxq)? zIS!o6M;LHDJFaspwKXHCJVZ_s?jAI8IR=g}boCxcdFo2j>ZbH4>)#`27bolUobkow z+oe;_uS6`$&nwED!M4EU;q9fQ87xX*pT?5#*P1FPvMOnBT@eg#Ww#SYRO1x>aC&$L zkh;#pU1BuDpa)xFtVU<`{!=dJIJ|*=`w@M+(I7ZQM!Y-UWK1XNm3(nW6B8C*sG`*q zoe?fvfyW$V9IN+VO7Ni#x&ZTX9-@f4LAhI$icEg7%C_qPx*?0_GqO zS1A`vGt4L<$Shlgooq3WKJ~>#$cg~D#V*Mf`Ljc=?Fgi9Nz`r+D{l-8?M^hcXTtY{ z%J!zx_Qb+==F**kfnS4Rtc8jL#m0fQ9GY^E=y0`HfWZ}_#Xb)AWX?XB-67|0civ-u z+!^_H3mLkne(sWSjM4K6irE>?T_<%%hMSjKGZ7?8YhX*JRtl9TnHY`>PZw0%l?%Jf z9duJFWH)_kB$v@zx(kw2Xl)CSR*YnBu zNg8j!0JDhA8F?Brba3pk@}MN|{8j5OrrAqoH(+9P(-xCYRg|40Bj~`nvDHgCcXH#l z`VG~r-Y#dPJLC!ORVgmHv304r7%k&P2G#zGP=sZta4r)dZL2xy5*!f^^MXnwd1taq;O8U77{4# zY$M(??S^XuJ2zp%W7)%VqgC`}RWLmeSs2nqZSqA8^AVnq8XB35`t%k3Mj?H#EIJ23 ze7bCd;lt1H6G#3HL+9Xk?vYsP5|R1ddRFQZDC&vM-A8-l@Rb_!6+cJ%O4xd*LJfKy z0`Hnte6~ud*d@oVC3Q_n2*^N=s4)l!r$U}KFqN?OG8s}D8fGLy7&B`jCs?2v8AL`Z z8$6gE37QQ7t^Atp(~UP_ihzDhCUlDo2Y~r?};`3B9Gw$OuXZY_-C_bd*D-1 zc0-2(ncdf$WrZDv;g%|F;pM%M1ofOR)OE2&u4oy9C+BZ3N+Jr6LU_0h&}CG0lw<~> zcS|{!1+W$Y?HRdK<0ZV5Nex0{i{19m>u%37QizG#gy0*7jW~3}*O!B3(y{c|hc$N; z=Al!A<)y>IFyF&RdV?SQ0oVogJ8FCo>apQ7Jo_DD@gwE%md1R8(gX85?%cbT?)A%q z`6Vv@$}IoEQ|u!vsu(1$CL*p5T$5=Xr`HutHBLOZI<+9MQcNUF7_X8x5FyqeZYC#r zkGYXTQqp70Q%vx0pi%&MA{s-C5JZm=BB&0VDLEKL=?4x7`ZM|Nn2w|1fBJ*(WWd{BBhhlNOFcTCe0XTWZr2N`MRy;GPG377Xat3AbAS&$`mUtq zJ{@>$c&~$^8(Tuah@mXn?P+MKHyBL$aGBOxVXZ0GR_QG^aGCZ5Q7Md5N4YwO`t%x* z`KkH&8(lI&LEQQwWYhoBm%+cbdjt20Vq0Ma<(ldY9EhXipYZAC^5UHI)MBUOy||F@ z^7jflSvkg3W5j6_XrEuJjcH8@@9gpxQVpc@qtojH*>=ZU#e#~=uy`tHMc+@33xhJS z6FH)`W_irjvGgCEaZu5Qs%o$5{NfyNiUwgm|P;+?&QFVQ53lqfp zrq#)wsETI&=*IFcl>J~UvoW~I`B?+<#b7_LtS5%gO%Rr(meafU!4o&XduX@2vx^4X z6iLGsnC}WT7PTXWpw53LcXSh0c}@VJ0F3Fq$bQ198i9CTwYll&M={b_c#G9QY+`|+Kqh$ z1L7vCgRMiBmdyk7Q#0c#Yq9u2il9g)xG-9^WNm|}8=UZ!kzvL5&#)hdt#lWjmm&@g zlwU#aJP#jh97j&S=n2?4aA=w+dhbN&5yb&Htrq)KCaEOvi*#=WS(b&rUmQIprkxkZ z$=F^|K}!#RR`BAJ6*=7sRZAcgBjGNAV`Q9kM3-i`GINzloJ>JI+3N`{okPY*HW{Db zXIWEoV!S?p0?QgCWGtU1Yt{M*_C=!O`;ghF7-m>2dNlP`-7nwDhn-S(m!bW=KU0%% zF~*FMP2iKX6zO2N9$LpCZ_ft&DP-e+AuG|mI7;qOSm#j(e97I0Kmr=V%^qS2hgvun zs7S4-?x^GHRR_=JVb4X0@<5tc=WD`(r_z6OgO8z_uetw1k)z57%K@i5B!ydrK-Cj+ zi0h5B3%{SqqfTYILjx7f*hM|a<`AI3KCHyE7AAw+6<|kkq<2a4lm{~Op~CT81YJ6` zXMyCd+Fxdw!(yl4#j$u8X0+ODTZ#y(`?$C1z8$!TZt6UJuxtAhL_BHx!_7`qaCm|c zWoyqK>9VSCe7wdgXM0(u&9FPA_M~oyhVagZ;&s2&Nv6a996tZ0?oCrIA?+c#eR6Bn z5FtTa*sy2A2r??|`61f9;nAB}gdBaCg3>T5wR2&&iGU9dQBo$JIoPU_AEyrwna*H% zJh_B0yZjUcgtJi#w4heIIUz|(VX_6=zIgJ_7d3|GSI)K?4HIetMLG^cOIgzC4kD(d zR!7%|l|B=T+UJi!&QE|GQPeNSuyFK{D4VENdFuZB%=P#uckxXtfYFhfgyj#`(IS5B z9<;K+zQqsHUswzIgw=XLV`V0u3c_!#$d4V z{&P|z5Viya@DZ<5`n`nTWT{a?^Lc@k6cj$(JX^B?;OT0)Y=sSr+&i&F5^{r#1 zg|IYE-3{d=uCiEsM5ZW|p<6swtZsuA79qu`B(sSw!BKJ&hd0!9Ry%jl7$ao$bk0{Y ze7y{_sc{BwgZ&0CywXw>dQS4Ui2w;;s$Vt46)bv3^r&@_ic3AVV{Q;~e$?Slw>x_7 z2yf6G^lHxG4#CwDes$hEPglvM1Db%HDe#gd9j&1Jr;Ed!Z>gdp5XED} zR0tJNDnsB85}NLS_Kzv%+8u)lCKse-NOQFz_lU@lI~2mQdo^1= zP2=VS_DKt4>8b}hn-@+D!3mWAjD>;qTNKot$F*+gEPG@WBQJB`j6gAHwpxsyhuEMe z^9k(I!wBFjQyQ-Rnsggw`2sne8K(v5v3`Yh^g;LP02j=+>ex(4=xx-& zv{s_yKfg|&ETUk!2%e~Y4_Cya4(g286nc#R8fv7i6!3PZ;aoFRT|73Ei#x;>9CMf0 zNdG6Z-GOgOs#zLtjtMxPeh<%BhC`UZ8+PNXJz0W9@MVzE=1BUj4t@XJ(;$sf0#Br=oJ-8 zx0N|mRdHkVx}ypOVZ91TWaDe90Ap~BJ51Qa(*|Xf1)l+bYMz!u;8-`mqE<0Hk(#?y zT~Ln*zSik`sw`o>D6&a@T2m!|NMA_>%z9>uU5Ab}({lKo{XG9Qdw9M0IKd~1+N+aY zra`uSG0WVbMKV0D;Y3=36D-#~xwAnE%R6N8^oZ$`-t-+>%YoIzeqpabqP>k;x#e4= zgn?*SCF^<)io*7$ehk4I^i07NfUU zKkEl^^q#8YYSkU6m*CZ|{e!D3^z|OV_h0Wjn0Ei?gg>99+0J0v?_UN#IGj}cp711J z#pV(%iEV=vNk!9lXYyhlo6;V2VgKrT>SqvjB=~%eQ_A4haNz5AN=e;O@a48h3XB1b25x zaCetRg1bZG?(WV%_ysn_^lQZr6GAZ{xFI&J>zIdYYGe9?VK&UvyM?2o%D?U6> z2?1Ze(IwhlTe;dcg~z(6(M57=&5~7i!;L)p5MW?g2dJN*tyQ-7q)_jrQ!T(5(*OJf z7Cl%pHCTimSRdpPG@MBrgGWd7^V2O#7tYjYK9gbLlLtlE-Ih7I_pDlqX#!Wd4G26W?I8c%co9BC!3gsx5A(&)khM{L+w5NLe}Ou-It4fQ5F-wPA+EAI76wUhFxcONBX(kHO(`A2$!p* z=e9`=5v)`Ewoa}x?DPHO=e_xc1&+-y6-qVc&BXNm*HuUi31AgFY^@~(Pwd)a;|&(9 zTeFpH2QOzSt{x_@;I^KCQ*Bqet8uaj+_67!>c09I2k{oSI_DkAKxOD;GL4N@)QUHj zt*apuGE{yAlUM@bv(^(Go!t*SmL8s?p?4Hi<#!Se2RO+0ZKp{9=2BC#W`ev^a+j2G zae0~)X2q{5=?j|k1Ao#@_2VH&mo>3*!D}!Jmhs1wl@%7l%96<4>=2JHy9vWOSWCS3 zbBc4J?3Eb9c2{^ncf<@AqvH#Qu(ZfOcbJCNgz8rnN#Cy-gpU#S8BenDTeB%>APBo& zGZZE_s0`Cg(8Lw}F_)tqn%^Y6CmLO2SI=;&*%FCb1^u)q0>V4Z*-@b{xJp17q3rDp zpEK5j^YK4w=oi3eS5=L4g2xl!^0)ZF6y%BBr1CYlA@8SY+QgVwZ5mBl59N5q8ikq* zx*+<9ZeP1SdPXliI^1s6X_gI+|H4N@=BA{G9JwN{%bU|%*!m%d=I1N4T)hpZ^d~O{ z!suR-5K=LCjjm(2^_z0E`rRe&>y}ElO)o*Ax21b~o?go0OcxF!!Q(1Z1;2I%Tslx@ogBdQ-aW zaA(EEo?22Eq5W2#3}(&^L$g+w3%l}~cFh{!Om=4Dv6@`HfQLO%nZ`d=l-f_@BqWx( z?wO@ivy=34XQlA)C~VkkG4oA!URxP44ydOIkW_pq5b<_Twdon&6?BmeF3!Lze6hhDh@*Bxb$GXnn%P4`19J2dor~p0eSmP z6A)q877p;cOH-Ez5OV5pVSQ`KU`LO);K7{-rt#KXVRlLetzP`u+Gw^#RtT-)7i{>xby4P|Q?ZCFx0Y#C`k;{)z;p2fTyE z#{feaSav#OI+N6I9wAdnrm3#wLbug5-MDTRpNoW3{DP1vv6@|@Iq8W{pR$+&)7O5y zy-!ivVm)Ij2hi|O?u<%lm~O{0+|bUnaE8{_HF4zAWnZdGED&o^he+&|Rg-wj>q^`- zQJ0U>u5t85Wo!oxhQ6q+I|g`O;CkraP>rm6wsax5B&)U{XIU4j3&Dtx)H`C#26ANV zcPp(^slQIVZwp%CbEEKZ_ephFg!w5QzL0?3wlL-5t+?SR8NOm}_GqKHagc!RJvVjx z#@Mpa_WluhBQga$l7*G+HC>##)m1d`EIc!o4o75VWlO~N26d@!;0V`aL6h*`N zd=d}!=FJ$wfBVe)zjWOFIVegR;Gk!y=b-odb1zjD(En@rJ-ZX(=xna0e-wk<80& zyp0R;ety1xzY60Hh^wglO3dasH}RwNXB`5!@FBWwSF0JLK+nhjBlM;$n(O z;*q^@`wFP(g!?L9cUazY+`-gLeXMZKi^&Y%1# zU^2HUPq0*)TqyPVRvEpAUTWUCv2vyklHXK9FkQ-Lf~Aq3VP|Yn0-_!84>9Bf7hbkWRgj z_a}VE)`+5}Ws@rA!O&_=*2YiP?0Ad8mFSEUP57w zVQSHWYC7x%#ldsS19+qL#TF#^aWd(M<4=$Nbg8O%GXB1g<$xG?)2c*qV5)fCa0CRwIo6jn-J@$YdfIC3f8S72}6!2H(*`~KTtyWe{n{@yM2Uv8=xY3tXUDqzJi zEl+$YFRo5*!1>N523axWQ&s^+kwo-cVTh}-G`9Yk2D?KlC%JCx^*6|9$k1MI_~95g zF#Q`+!4uP$u39emm=AQ?ydNPd!h1Gjql>qEa-d6a^3mq-kmAotw<`WJuqy2rr^UgM;11H zYkR0Oq@B~2T)PL_b=;@MJ;?pxiWPako2m`!I+*4O{y6Z+(Y;(O?^9wQw`!bgJoa~5 zI-Hp!eaoCjc>GIl$1O_>`KL0%g8W{k`XCZi0qW*`df|D5Migz%f#p;uzsiu0bF!&g zb<|Bxq2nBYZeUUeVD3g&pDItwG`}a7;M|GZHsdC1yN#JdE@l4hmaJy#HIi|n`kKwy zmm#8xyaV8fE;_nxe=lB^^trzO|-IN1?A<2RN4eRq$lVmxnecT^plm%0MOgpFdI zNte33pH(=c1K^}-Y4Ha#*3psHJBwFGE2-iEa?xDaQ(spnjyS-MT1f26mqYaIQQZUA9LPy#@y!|iW`bM8KqKw?(VA>dPtXDIjK4yBR7^_D; zuuu+9ZdMc0i&Zm2e)DEz^GY)Ly=o-bmQEe%>xj?2zukoYI$w_dzkZ?rHE7D(j$R1x z8-D*=%T;mrQ0jGjHoD=vwgo67V^p@!GxiYD3RG37DS~whAXZ028H&R|1b0g`i(yDM z4;+UCPId(sQ;~5v;n(6Ub~&NVN@(_irG16LTnP5V@#K*?1()emm_XE!lHpoqhC81KP{FAZF&(n*A*bfmK(w7f%5H)!GFI z4S!_nEi-|XM@JWi=cz=;=msq1Z4Ro(KqP-}(xXRz7qllu$0Xk)WJYwRE#)bo{~=`Y zvLv|e(r(4x?m~t1swD?VR!DMguOt&GeuuGnU7mUyfY@s*V3je(#^!lKOKGD}eD}lJ z4{@c75+%R(fgj54ChIGnWtsKd^4Rjyvi!o#_>%g<`1sfi&FVZBS`vTt+yqxO`kX>@ zYjfSj$nnU0or$Hrmfu$sREh#gQf81U(*hO_rVLD+7^7K`lgL5+4BK!FUBgh4W8t%_ zoq@T7yP%@8r$$Ys-+s0g)Do>+L4uucqj2N*3*4iV$htbVDd+lHi-R(A(EQ@Kw0t8b z>ZzEKyQpCCr}4b`x~7EtfMeS6?c?G1);OvIw;&F~L*IKm2BB_F=Qn5=8C3EkgkmGNToMSxW1<#i1 zzbt8E$r_@xf|Q!7_+(46yKxo2w>caGrDd2B_$vDQ5qbh zH>JHna-?!Z1(FobP}mbNz&a6O zZVPl`wlED&-f+2=8C>wId>Truo()FaS;$y_i2dp3IC(Z+U1$-OUm4)4Rhd?|MX3CJ zt~#vz1g}rW1b97V)07CESX!-HB&gIEQYGgXP6h<5Ex1ezfIC&Ssof%sR86b7NHgj5 ziuka$sk}t*w@Drjqgq>X;c*jE&voLsObXz_!ms?)ID|xhhBKypWCdEUS)bMgJJUSU zF2`pQsNNEJ8Lpk2*7>*froNT*!a%1j5oz>CB(l`Y&4FStIU5!+i+}XM^rql_sPw-% zMe(UJ2i8bGPIdCH63{-Pcp0rlGMcSt(mvw05zKQ3OP-FZCbUfv!-k9l(zTB zNt>Qv;E3b>t}W>SzS|03_;Gwo8pR(ZG(E4eIc)#Fh_21qkpE($c=!%M;;KY9lG!r{ zGPnA~w=i2G@!lYLyUXi%JjN`EpOljtJZ`d}Rg%&wEulea{*REZK+QyJ0@P|wT|WsdqNd-Oe~W$CrA zvEb;tokG=a!u^EU$;VR52RUZkMMS*$$tu&S4 z6#5MhNA2U8M;DwKsd7<{HqRLk+8u8ObM4`~rooxn(G=^|a+1VDfz8DqUTT$t1MHr+ z5MA=53e*I=wj;t#5LHZV}o}Wg-pnzO$6s_9buxfyJ)Tmh9FK~7{cS?(oLN?E zK#t(sh4I|=3O{+>K(cQ8rbVSg(w8O0Q>XN=)}hTkc;kymyfx<>j|LpoOorwt6-D9S z*R-Fo@BIQgh>Q**e`5B=#^re2iKD_OrGCEnSQZPWPG0ExmYziJ2-dA;+E^YFJHE>n zRp$Gyob;GM6c$W>bc-MgMHyD62cWAoQZ~X2sg=hht;++Wj#eRn__JWXha5t$9zlo+ zXVIzLFb6usd;1jg?Z#N=xY5mZJ|pm5ALv#dFI-45!mmrJL43sXL<%cSGbh>&^QB`_D{gL{p^y{CsU7^oB zaXYzP#I_p46P&Z&5wt^#p9QiX69M|#i+Kd)nMO+tT5``1v+}L8QYoA#S7s|i<3!5a z{4kw&;UH&fJh-<2$0|Sh#fbzrC+HzM9JGCjZ15q;+(t;G?r}p#J905-IRlAR@G%?v zKAxjpGH0pW&-TAPojt84%!1^h&&p9p+}HEfKZ`L?StYi4`N?U8ZP09-V@|DCYHRr`{H1eF1@KXRyd9aX{tL}XV3uD}1- z;+RJj4NWqGKRAt!s-s@79scPugLk%<@2O=4f;9BiXi_y(k0`lb(B`VA#l38%wm1nx zQ6A$8{St#yvxs&E+cL@=AU9TSTP8gW@2gy!x!;Ra;pwwFSv6mZl!1kr*}fb}YXxw=O!#)C%L~ZCKQ#Y9aT8uK zkGO8hGZgajE;D7cG9_{idhyP{ZpDE038Jk__RJjk@SHjdwBOWh9}Nz6_V@8dxj2=q zL~TPhKPAY5YD1TQ6sfUU40%yl#m;udfo*-awvipkJ(oDJcU9an^bs(=KZ!|p=~3e; z*MBE$i66lioL^W(w6$3jFopkxHD-UXBSERH2wVIp7d^c+NBT49Ya-u~!HM2c&@hiT zXXq+n<~(%6&*D$5U>9`6gtO9%&iL@tHzHo6pPkbMlf96rg{(@Wb;>OSUi?BX9N1J~ zJd}3ee*7bR+L2 z_ttYK`4$g&5Hz^8n7fu77xU55b;su@`K0IhU0`9FDI(4il!xvO=L{YGUAxBOEjtFS z_aQum(%1UdZ%s$mocbuf5LG|E9M0#i_7z(03!TAHk*rxoXZP54r5Lt`s|u)(t6Pk2 zFx1+fs$YfO!v5Th>&{J7r^&FC53R>VVm4U{{a~NvC%V~fmZj=a@yP`V6}?CZ%!)i< zCisn+5YfIcQeBX~1=c7bTjWBvoHyVVK^otE3MnKPmN3&}>nb z*O#5U>{`f`S6757y{MI`E_sK9EY@gmkhX!J@(i26b>!+}KL}JYn zG0s(E;=10CeqA{|))b^c+fbQW5~87PZ(HAhll=UQ?e>Yt8L#*>QtS@&q@$l+N;E?{ zL8T|HFf?i&;hgpj^#x z)v4438grtc3SIEdhjVSA%E9jZL%21wRluIJIOAwol4R$wpJ-m@(W##5|=Ew@=7n z6pa}GPXm4>J)b5tYQ>g-J!85OH091b_GOGgEFXRRW4v8Q6v7wJ*DgCm?El$q_pdG6 z|GpB;pDo+p{Ve}z-~R4z`E%5r!XKM=@J=2D`cDgdLFK;-%F_ypg^GuUK@@XQuLV=Y zcbTu-U}{)0t*eH5`Vu83<*^EVnjPkxS3I836_Cj7JTla{v)E{VchL*^m6b;N$5&Cn z=Gojga#9{zJs+Z#1h@8zLuaMPKnefoRUKJFT)Ve!RND&*ZSNh3W!W%8JV_1gJ$v{O z_@H^Fnbv{0CS24fgA51`DKG&&eP`QiE_b|)VkAo}knD9*N77i5t=*?hY(9zdPi~>= zuGvi=wa)-F%ek#}Vtf!sK~Y8JT%V`lkWH_#l4eC?xYP(R4xIUc79|&DV_Df>I#aou zYgYQ}1Xm1Qj#r9w?%SvdG_!qP+M@O82p;e7I)BW8|oHgMWWN0C~T{ zsT2+e_(B34+T9>BN%xI);&mSDM`SU!o3c8?EwgXR96^$3)U4W5v(hN^ zhG&a*`G$+vhOOu2Xgvlx zoWGl}N={a_MBJQ?gOmI?r|=FseNxuNtKD|In<~R9O*CFwkk`1qH8hpG$+IdR@WbW9+-C7E&1pC>&An%Y_{T&^)P$RD|gz z4>2VIhz89P!f7;A>#7cQIn(H)!9@@-IbX*qF~x7uCP>rto|C2z*+C7u(v+&rS1k@r zq;J6{kgH`FxMpk#C$OLAVydGF7VGyZz4H(GA;*YH6(Gb`mZu=RWo$`Be-HL9v9J<}dL@+<3}RKcR8+*OO+c8G(1G%U2@lQI8hu34022~@)h@ws4;W$IYIN&$rNL}CCKg;(7Ek}!Lb zOVg&2utGan9>2vtaE=4G3$KDGquHSybRD#ts=}?M5v3iJ|2M?-p%$eXKnk_%%EGOr zctzVOyR<6Ye41X$LEC{}s75V1GZ0;CXGlw8j`hTJ4{+#*N$iUciu?UzqtigYh;a zO+mpwPKk*0iC+bM43(c3W-i+AM~l~7 zSq;kr4yU79u_LAa!YUQPYqLJ>^i<71wV?XMf?j6mSZ42d4EWPu!OHHJ4htiAr(qQw zd5R)Lr_Tzw@W1qC@4G1BMHX$0Q^u=_O;Tc1eJE56nxYiiME zy}-6m^P@Gd(0K1u++oE!R|@4mMfjFA=#%tgX>cuTW!>vM%dYtpRSgsjvvmP!&4OTf z)^Q-&{H)MJiitPXcmDXeG>KwGQ%9=zGFxmjoyqDPitvhNdJ?o!h5nSa47uoeQ=M_@ zi~j0K3a|N^DD5Lh_(=Zv9ZLYuYmJ>`u6THtlJR+x*~AU1{^6a~P4dSFsTfbPem)f2 z5ur3@q#da)&fi$ME>*&Tl04ECQayK0Q^y0ZHL|X1TzLnw@S?*>?}ga0t-HY7;OXIr zWE|l>)9T^KTxs}P>;wj`)&2>CVGPot@oTX%4wCtXsAXKqFt8R>&-O55v@(AypZcJT zqiALzVJTHOJYDcAL6iLt@mxZ=2=ax368qon@f^zhMjXc)5x8bQ?{Ixhy zOr~07rGq(+(PeZK)51+nVk#JW`@~vWImMw4ze3nz$xgbQY5%lG0d+00VtCF=f7~Yg zozlSCD-LVk5sk=;nT?iT7@;1SJ+o18#qs*^SUvLN3`y{nm_Bce3)1V8bSn(TCt(X$ zBn|DZ1dPh9?j$?LJk8GSM8a!QDH~W6%}$6!hK^qdoF;F+Vr=9io9*4aPtqiaJ;*lo zWGRizyK?=qPh#Qutu(UYO5E0S%CdcO_G^AQn5+(X1`vwJ^S#SG_UR?-?qFv>j?Fn# zS_>Gtb^G7Yt^=FNP;lG4&*Ob^Inf1c*KNQ%P!tgkle(aYd7sI9tWu)v*HEO!OsH5S ztsdzKd%XO&-Lnd`^#mm@Qu9=*4hGPd5)~5Qrczhj|<7>e_rUY5MW5H0HD-abS6m8Rl#;xbONR4 z>R}()whUwyk2MsD$KqgENZ(2afBFk6vnUhGD7{#^BlB*@QTbEWMHNd-LeQjP^_aC! zj5NE9T9$`hT2pOF|J0cq`-V2##+6lo=mKE#IQpx_Y zT*KW75gLd+1z!is&rNZJTJx#?ELs5qi9ZGbyLMPjEIYTuoL=@3D`^|-{}VTdIbH2# zmeXR{$-Rd;9qbX7eCcR+C;ny)qO`ColAY5rHnkr$|3aal1l%^#UhDod4ZFvLv=&lw z>u#&kxl**|TK#(E!(V$y4MH1-`&qt0N^$pREX zyMVOdlr)QQF|Vi1jl2-irTx=d^CzOtFD10;MIK;o809r37h3V1kt!~AMlKFSF7_zZ zGfrEQ0}YE7?iydkjd_G1((K23tQ*Naw}F6N(;InxJC6T;zFOX$%`Ecls1fW{&URYI zn@x-T?8lop&Kb8*poUnBMRB&{O=X8wy#23!cyguS7mm6>grr%p3oc!4Xsb`qxQDN~ zO$9iDQ+o#jj|iSi7}rEO$soRx@P!Ayhgwms@cT}mm*@%>ARU{(TVYHcbq*i+c4;+uz3PTxnpesZQE}<#ryB-2 z6{!7zPdAkS_PqTbrKO}I97RWiA}gusaDv9nm7@`pC9G2JY)9jojmyZju^S1=AubWbQm zpk2rZ(Te!_WH7-KR7J0G4HyJkfD&mRssK859&hUL4OgH+H=nOPqdW;-vGVLQ@mM7M zIO4{Go(F%}N#NNN1CXHSMsVFrY!NZ|;fEE!)u&%_I36Yc`t0#`_kWZ}6=iQesLLIL zPye$t9?R0)lL&c#+l~D2gp|cEa7m8-B%jT1b}1VETrf_+3Uykj`v$}P%?@TeCzMSD zSen6K_|53e53KfJD4Q&>G?QOg31w3PhHL(&7rVXNE9e?={F!K;U+5vwVPn00K*ES^kW1tO z>quh4RD?1Z(3SctTS6Op`Tg*qAQ(sxyz7x;!yXV31es9qvtM?Nj(bs%A?EJMr6Bw=J^@^UHS0}$ zSO2XG4=j-#JqP?Ay?}8q%s?!W2fZ4CKdgr{fbogp8nXu}!1kNoAzRo|K;;616OIg9 zKy3J$p#cX7^Djg|=5Jb}8_Yb*} zaO}fGaJ}^wT|I$$#Pew*Idz73j%Z&&y5;^y*pZ9Vk?S5O#V3JGKpGr*UXJ?L;Wcos z1`HGGiVosHMiM1n7YoA%1Fj8RYkJO2!nek;2eVldM9pa; zXH@Y^D|yrnqCIJwvIh@WGW@wLsxm zfEZ!(sg_<ID@-Bm4Fe9_$)|lZLizjp7DQRH(UnSv@HvynJOO_}ubV!y+EF^FGkYY@9R^7rf zst>AGy{1Xv4V4-tp8OSLO;`6_(!lYC3XEoru^i9*pc~pAEHup|*r0=EdPMQ0Yk8i*kpthNbnnXEEjONb{zaqJ{Ui;c zBi9QJTe>%TYR4yLOcSVC2Pp7i-S1fMSp0m97{=Z~rF76RCjp?UhgMTYHvdppcJeoG zGLhk~f?rjCROm1{h!>^Oczr<%H8Xgfxv_#d+LH|9np2%uw0P%rWunrI>}mVO?41VD zY6bv$-cVS7Td8`vg2P`O!3zktvlx(>=_{L(L_b=?q2%oD)a%a;Y z6*&Yo@TaEo;DC%t9xM#Kqwlm0YcQ~mghkw=$Dg}Q=oxzkrLLG1TRqk#^X}pKZ!o-$ z(L~(+$F=opRFd}5^4$Cjwe^ZrOjx1KcXW?%9g=?n?Z*HJsiS%qoT}WvL(O!*VtX4$ zgt8IRSbNwt&E>>K7Z!}j?e%d@o|I5g`!f?d{Ne75#v~>T#ciS;9;1xjp^GF}e7g~Y zQ`dKVksUjXw>+C^fiV|j*7y^{f=#YsH&j~Mxr40afNC*`VVP!hn;ZR}$w z@1A6#V;&Gim3cLV0^F53huiU9J5>PMa4K6sirqWqYZdo?9 z41<=*j848Ea~GT;2(QS-AEO)aVmzjtX=lLOc?{pZDjffrq{N6I@L&V$S@(IuNDM2~GN&G<}f9$l4QN z(Gu&yAU+ge@r-QS@Io|S*&tbRw>jXI@kg|-VoZqYCpEN#P1Y13OI+QR{m$cD? zrK9QaCvB*Jz^3U4Asy3&Wl0Y$^efly-dh;Vc%#;^ajP|exu*c zpo?r`#|7Y#{Je_b9KfkhFM7BY)QVe~NOEo0r5!Ohh~)nN2~|$vN(cfap&oOEZfId!xrX;rz;xB!9{)TcIqNNWV4U4I`1p(& z%rCMY8GUOor6rA^9P2kNq|4e<-g7&R*@iu;LUL`^r7c~hl6`B2suR9mEbqbkI){3F zTI>-v`1YHShX64j5mIJUkgQl2`Nwq>noxu1pXrAw@FhJW(HMPPi!BYWWLE^~^ah z)sgEGzLjp>nsYwqvpmJ+Wlmfwrg%vV@sS!G1cA8p>mrg$NsJCY-EmdbMU<41m>=}b zb9Gky#-MI4{mKZ{l3!^LS5;+%#Vcl3o){lKU_E&C0KLJVy*E%mI~LEJsoo>onbjvd z7I&N)UL*N|S062SVKrnsXJRY~mqY+M>g-haq(j8SB-N^Ct>=b$IA7 ztY8e?KwfxunCL|L(VL!hxsW&Hz#sDBa$&2&Qp%l2>7Q=o1*h@{%PV%B3#xv7b0BV;o&+48?$q_ ztXTKh^lfB~%b;a;f?fd8xtcN7V$&SUAmMp#aEq8+l$ z#cye;Q5QJNP1Y3;IET+r`E4D0);9MzX}@rd-VOMlj;-dE^Cj!M<9d%94dBC3@X7h? zrxmYc`qaDfsp0RI%q9zA>#29AHObDF%pMD2V5y9{%up6RUx!WFuxcz{tH&H@C@}q3 z5tyW9S^8INqrF`4{h?vf; zvw1==2L4PwVc6o9xm*CR-ZF(ZI5!7PJENmA-3?C#q-KR1R1i zi25rWs*j(t{ErtmSQkW)>!Z6YKicAmFa8~EE9;SZEj15+3Bn$y9K<%!817(2lD^Qe zw1A|~&AAkTy&!M!tA1RFHsm(5AkSI|-gP2wN)NL78?K;?p9JsT2wl2s=bZHK-E3aE z+uieWK4ql6ZVB5){%r-N^8|M7=G&>eKm+)Z^Yfd@fs??F`QOA5wfblshxDY5lZHK(6}q~p_LEYL-159{|IGD=7Q0Ha-jgXVhqv_r7_2%hf!eGif43C!%!7rWU-!uc%j zc%5>oTd^rL-vL8*kB(>FU$ptu1Oxx5Gh55020qg1bGQ~}Exg%b&(l&v8_tdM#iRNgBeVg-!qb=KoLGs(o+siAIOrY2LsX#~PKFbM9iy3ijE-}vHvssJ}}eDeYKwZb^P=|Et* z_-w@2Hw2x0N61Vd6y*2LE2;yL>Gm@ef8Q!J)+3=Gf#K1x9Z&#Ndj={1mfGV!;zh{F$@Iu#PK|_A|&H(-whbM6Zi8j3clS z`(Ndni(t?HTM;(ik^h@c)t+HGcmxb**B!{hw*k$Sx~sBC(R zy|%e-+A&YJjKyDp*4^P`vR?28$nLaz{mEE`q9Hj??yP8={pAF)uI+sPnl?peaMr_H zWcj%0F|y3kdGcjP1G2aNT<3{?<(_uMY<54OE-~|Vq%HNL)GkkMjUVW^bahl_>Meb7 zP~P@9Uwr3e1ebduLJqtsC)kh;O%_NVEN|Mr*Er_~0zEIx%PqY^Dd#jUP~uyT6N=Sq z%om>Tw`u3KGhU9{>hEs|y2!MeosSlVP#4vVS4`l5fXHU9o#A<>qvgAO=;M>Q#+xfV zE~mklkLC;6ih)+Izs6F0`O6NX=ZbsNHKRZCywkp|_Yobho5S8rWytl}m_^iV}T`I`88~<|u(}QEB)I8Ip zH}=InRI_k7{efqU_62q_KJ(tYpYi)n8!6{a+p}BjOO-)&Phr6iO4PP8^TcDkd%iL5 zm#z61&*zut1#*NhanvDzC$~!=HGiiX`Ba!E)Z$8|D7zxXOpapxOJ#kRBQO5$Qlb4p z**mpke$U3Q+j%zgF9e8^=($+zyJ)raJ1uy|>rXX7z~GgLnOKy7Z01uD#>V^IaYA zAz0ygh5wF#nKf_rh3DN1{+&=Z3TV*!bAQC^4YA9++BAaa=G;WiP88{MEb_yuBW^BJ zXB^pIf)pW+Bgxy5;$%)&oZU&edG4E?jT~K8Z?!J3jr`-(RmK}Ai*4;_Jokk|_sl9Vk z?!XwK8*s;vcs>XWkwA|hFh9$h5C%NwcO*TM8)%z1lI>_ZE_WIoBYVe`Uu*t&bS1xo zr-S_>1Lw?!wLN^OD#I_L&nZA1isimc4aX$b_(vRn zj}BL9H97c(Ujc@xcsma)w)@sa+m zVjT*qA~~hXcG!8;FH}WgDE=3rMVrP0|O04{`v_;q6LfiR87;xk=YGtdEjo#=3 zPX}@NxPznxww>82cjB_NMOXaz4#Tn`I@8*;s9#1T5L}Dpip1j!{dIM`YUP>+AfLr^O+_K9C##B%M7`nx22$_C&<-;=H?_1%!t-XD>pVu+&oZId-CAr zHjgUbF?@e2Vt?Zbe9IkmB#l9b&1%gQK?mw~7=nxDA?3lM%2m!B0 z@rP%@Kz$yb6gcta;MKk7j&f{VI?%=j=Z<1*Y&zbF;pWbgjh!dey_AT?8eb{-iIj$0b%G&#Oi!j;cG{Ji(jaR45qLs?zTPC;*Et?(SzDtu?p zmU*sl&9=35h&P~91sSJOnQT|v&qjGuE@O( zq)^}+W>cI2Xi#JVR^*=(EOR|FEVD~S>lE1xR}_JLPIAB@Ck5bu*LRDd*T0PsCq*^@ zzXGuTS`IjTt-xl?FJEW)K(PXNpwy@ae;vmBdEol+!`8zg13=X2TNU#|^0}Z>TopC9 z2q+yd|1s$)y^8z+8en}bJ0J_9kMm@L-1ou~2OJ(85 zQ;P7CDWck5Zy!C!)-O|F3hL%(AYGctN4jJuYI_>jlEi| zK)1GpUe;TiY^~2tx*4ycWc`gb(kV|xW~oKBW_ACOD9+?>PEe6InsB$@6Dyg?WYhje zKSDOd*l6O8JyWb(rk+jvTm4AcFk`a`-I^e`B(7!^+r(+jHkn?| z6Le!;y%0Om?IR(a$I)Nm zGf@)KIs{%f>eXHe;@gs_@+hCER)_8!8^?^2$nwWN&(!bDI9boXF&FH5=#!|fIZ=n9GjkFHnO;r(nhv5}i9Q+X zwDx;rle(WvRA(ky`{*o0OkbQ6>WcO$ZKdcIk)YLH2%lD+6X;6zDQNv?=Dq~2R%J8I zn_r@mfj`Y`#fk%357}$R4r<+N-cI^yGGS@Y8Jp5wBN29u^98HQ{cE-|#mTMv>$0?%P(j>0`2z~kRv+YZo>!-t-&)G^EQ%c2)OBDVHjoQ_2n?U1!I_&cU zJ4tg&g?K87e}2jxr$}j2Vm;)L^zvcn1g*rmpK`nuZ`*iS#T@uPf4n8BOnEIn!{%7A zw+f|he3nGvPdPz~+%_rJn-1xpAKaF_NNFA)EAdaC96!aoHX+s*4oT4ue@ui)oa?JP zMp4{$hqchb{N=;G2~CLyecMKquJO^<=SsbeC_UqeP5(G82h*&acC-Fi8Y@UaY?EXC z$I(3M;n2h>)K{TBi*3xTflf7%yEbfdXj-NFtRK|;5TRIYTa&mx`1{4fE!zy5A!)^? zbAClvC|BYKBnk(&Pf%>Paj;G~{cU+bSdOIGmfo@+CjJnmCb#V}T6a3wQcG~V#7v5> zd%rly9_~+`umklus_LMQg1T)60imguu&fCwKVV9ZQIqrF>o>q=!EF^NO30-NZI`Ms zllrXSojDq~Cm<-p%d400@)BO&+6)tgxv9wxMu2~At|i374?&DS*AnhU0KpG|$$2md zhC2NSsCy5p9;}il0ClH;%|SL8)KjRQq$ba00s9TuzfzFagq8o&K+plJ{uRRD6$I=U zL_r{j0W$wWa2uCXh2<*1!u$lRAP=f2dRbwByRCtx4!}|lnC1qR4T}1dpeP-RPDcW( zjVuHu<-iIf3vD^z#zb)r#h^NXT73bE1Yrg{QJ@f^t&%(l3}6WNkeNe91(-n?_dQJY zVyYSfX;g5)(x?Hghb>nECy!~|h$yJ{um~qr1FQnvfVsyI{KZWZfu#WUK3t@}hoByW zl{^bUy$I?~A_PQi%@S+^;LdCXf>H;mqat9l4^&Rrg6A7h)6fQPUSB8JJcsFf=7Ktk zswt>TplZATD=H}BM=LBMpmGuwn9W%u;7$UkAPnY`Sb+1v3zvauxXpd6ptj@fkOkEa z)U7JCL1hmru+^e1sGId6|Q#xQiEtH zj0_rAB&4VC)8`5TiV3mPsyq1!XCi8(Zi3%Kn=VRb3@Z!A106MPJ0>1+2W&pP+ z4V)iZ*h1z1E*Ku338vA;6I47&&j3)*;yuPssu>i`<3~&t(rdUw15lHpn*sj4pqp)LaIqQEtW3+nWsE*n`hKy-l3IS%SoP&J}}eFba= zq`fL2u!DBI(lJ1#1cFIa@-aZA1_BmP3{1f53@q0J7V{UtYX;Ndn1(@k1wpV14ctBk zOI?KY5lHtMLJ=Pnox*iv0f~m~cwx|nEVgw8SYxy*2Q?2>?!DvzCMYsH2|)q0zf}w= z2S`<32EQC+V3-4^fZ0(22rM%IJ((FmdLDPL06_(EMBoOn8aJW|st>5WSfl_&tH|yG zl><*G8Q2|Q*~*o_t6pW*bP*1E~BWzO>=w%swNakYk?I%q_-ZU0zFFOY?^_)8V)_)0`nvY z9J3+a0fUmh3h8M`x4i%rZ$}3fT>*6xZPGvyMPuA5UgoVxPzcb;JTG{eV;~CU)wnBm zP$tk+6JP^?@1c7yR^fR#;jVBACtSh;Ql-eKLa+xd1i=EY+b{U6%-@GV0eixG#|fsT zc*A&s6NX_s;>G$5)h2Kr1FE3r;f$k@g^89L1FH!WHNhKZj8<5b24drcY@oEshi z8=l1lC=kU)@!mZHzx(j99N+`42Ipo1!D%$c3xj+-wI7pR`|11t3jR+vm7s_pWsg4a3w~RndLp2iA zGEfQ85O9LBqXQ`mU__hh2u|>|6vVUORxP)^cAkT@b%K_BAG~T};JslSxZ@y%!wWCI z@WRV2pg%*kg+Ab}P;Li5u0Z?;z9#d~l6RURFn9qbsZbXMixdb!9TU{$v_RceU}uo! z0`&l>w?QRj16vHNBBr}wF~y4zNMeBIMHr|;;D&)F1j`T*VgFk{!K*hMmdghV7F+?- zA>c(cgy0G`APP%Sz*20G9=rtVCn%D}qAVzCLsl2m&k#6?080(539^?_g_WFyL1hEA z05(Rt3;_X#u~UF4K?wA~&jJ}7W&s$Jq*1|?2L{l<&H)GpVZb|AF@Txu2tz=|Ihx>R zaOZs(;LiUda}o^qg5gmyHVe2BT1el+ zY8>J(C|bi!BTEZsNPZ2$4tipL{{YJghwq2#V^BG9r9+?+_#s#TPXbOf1#A@I@OH!? z6#&;z@dBu-kmiJjcTS)U+&sSzU~>a)a0)W0!Zq}(0+j(&0u}|K6&7)#g2Pq=Me`MK z!N6&PIXM&p9b6j+bqmvI^AuD`R5d^~LL1xyCn|W4e}F>7Sto-rxd>oUm<{aE8+l~eL;4w&JfV11c6ddr*SqMb&5}1JnUN>?Qm@Z(a4T#NKBP+_O*8`)PjV1G*gG1a5@0WW z(NI(gDp?EC@=&x81)ltnUOV}bK(yFJ+M?LMILN8{fJ}Pv@Ag^%(-2WH^&j$12da9Y z#(>%gD!CE@@-q};`v>qy=niD9|QK^$&chArXj+<{fml9d)7H4{@tc+U>qWx z$On!JgkXHhf|rxr`I^cuQowt_U+O#{ABP|3F*bNW9_9f;L;nFe&<5^Uogt{7P%Q&> z6x5j4pfW&_I^5l1HAs_C(Ln`fWBDF99k_INjltXwf*3R}!ZZxivI5eQsN(H#1GNWwy;pirX%TOC$L1^1B*Yu;4@uV@I?acl*!D=}42$`QsB(gWBW0}rgi_1GX)g-e(q zgXiG@sb6qrmJh*V0WLuy-lsL}6h4gsv=A8LdI3-%1RYr74Z8ws8sZIeg=&4AW;m#V zsN#KZ1U47DWq|ZINEhmZl_sX)VCw83y?qsw4pi_6D1ocNt8@he99J6nS-{7#5VzqjMhP(&60&@>fpOk`3R$iyFS1gcoBvQlkV^ztVd`ewP5{ zvG7A1;wt#c55(Q~5HNvBZYI?6LY<%>)G0$Bn3)@+efFK^(3&6etwglI91=R#q6;K7Cs7f0G3)t%VZAkUO z%)%aQF9-LmNNfDzP1$ZxX0~ano3IABuh>O983^ zo{%E2TfoZTfbb%*gF1Q))V-)GfjWqLy$1>>Ow+%ZJ4rq2=6%-3J#!DfJ#{8g=;gd0X1-xo7uz=ot@ixkW z(vGG{02d&P?gi*$09AvytE(7bUp0_&!qjsJsL{dzEbzM3WPs@w1b(j}z@7}vAl{Lj;j;`M>NI@hKE3<7Fj-V2- z^Drp7hn{MXzJGa9ao*q&dFcWDcG%viA%fhS-Q-bA-gVBf6aSIdi$GOHH62tJP|5ia zD83vbY-d1<2#oHvN91PsY7LkxxOwxgCqJU!*3_aRWq_BCIJ^f70(SufE_k^t056x} z_ssPmK=|No_usz5sgL(wi z9^FUeX zf?x-SVSy=q2y$Qu707rZ1Ko5vp@OMd49p>5!vF^yj{(la1cJ>xSfUhn6^{Y#Dgc5x zXs|*Dn1f*GfvrS>>V*wrWhJC%p#Ls;Ov6~G&0!<+I>4dL8un!d90#OVu{s*mYAnJ@ zSpdrcH(>fa1e@rI1KI_wJRE-4IZ!D1REbEP%I&J0IuP! zC!mJG7NoR6)j}J%d0jWb<`Ya`3a8+LDqO>^yP)!cx`IUvXoW?JsJsLv5=Ii23mhYG zN&3(uD+K9azJeF73)5&r1F9{m37{5%>VqRzL}t_-|v7-1`WMllMUJV|=9HBN87)_z1yA4m?f>$&fGJ`fr0%fV!Q04Lkxq zJz7@$z??u%DH__Qtp;Qtyc~yh0;~c1R0!$~e0v9#b>AUp$quDr(9K@xBfv#ihWr?V zCCsm5{$I?efKyBpc&pz58@_j7L&QfUdNm_E2JCPt7VL+D#j{xT7OPsY$^oj@#BHi2Xrq4`Qi^VS~BorjJ+-Vm*k>Aa($; zbi}Z?Ty*<}*eqg-Fx>z$9>^??b`@q^$BB<*tfz$f;SMyph$i7+^8GuQY&XE;jukka zE{4*0EN#OoW@N7*8-?so#Ng6!mLS%L*c@U95mNP!-`x`Aik*!2_09g)X zH4%$OtPe4?{EOHYVmpZK0&MskV9qZ9lff?8(d{5&0f^NhMu*rX#9ktX4YH%#bHoTZ zhel+Hcwa}cKoRFag;h#e6@gXQY66;TU{wYdbRo-%m^xyw5W`jz(7YY7NyL^B+k@Bz z#BiWx*s3YIi69n@*k{C;5W9>R&aw=@&7*rQ^c$0YrmF#_xdyakV1?dFJ`5;SSkc9a`$ZK4OJpTu9Vt_sygJ88$9mnE|$r(_JUvt2|cK zK-G2{KJY~QKSDhTkJa%em`J||6E+htA>vV9#ZybiQb{Z=$AVg9Zvk71tO>FXh?O9A z7O`r?@Zjgsl57tTFJ#XmYldt-veL*_B3p+nTCO2>53&1*)gY#b7!fczY?T8oX%X9t z*hR!r09z6R>~0xi*dPbGg(0Sj*bT(qA?Ab+8DQ7Fu%HSGwga#V`%OY~O|0U_DjlrK z!UDXLcPkLXR+G@Y12H?q+z=~AOb#)eZxyy`j&7oeu^@H@G5CW~;olk{hO?}~R?X3^ z05Jo^ZX;HV*crrdmQ~o>FLZN4Od2s0#PSe3jTnxx3VZv7ZVQNcA$AY3YQz)}!!i0| zZwlzfi5M+ns)(f_CJxv-j?ou;Q$V+5#557JL#zlfS;TO7zSvt0x>+D5ikJanIf$J? z4Cm&Hz15)GAYx94c_CJb7~aeE|J_UM%@5ra5#vNm6R`}$@D8ry+_p3DferehB^kf{ z5V63*#Ffez|Fte4Bsu@k8Ou3VyOj| z7C>oM;n=q3TcEN*(Q#~e5yg+$!1Yk$%Kz()#-adhu<_$2* zaDmdU>mXU9Tnw@;21O8zVx9`~Pr&IG7kEp(1Dm*du-W+pkE`~;@*x|E>>#du5(^ga z@e->9u&NlV{#S4t3evHl3kz5g3q_0%u_DA8z_$&3Z4oO%Oct>Oz^2!b6+sqf71xL? zT23IljO-p{A0c)eun&cR8Dqb~XvvIN2x7d5MId$(u@8u0gTm3O0_<#>Q1U5V%Jl2c@!eF9; zCO5!jg$130!0Bf?UHNh+%^}ZOEb}$q^pUv4D)%m>;Vcuu2W9tg$K>tFYBXG}l1Z4lzl@j1aqn*mK0N z)kO4dM~nqAYQ&TgvqB7KS%IyZp_>R|28anFriYk4VmQkRY}E|i@)46pj194?h}j~B zW30g52GGqBF)zfYgT2Y48wX;Vi18z) zgV-&^aEw0Kn>@NDAts6#{0Zyit}BSyAck}E!QQIT%^Wc&#H0~3LCgU$oSP5!R&6&u zt5+cUX`P&^ztK|~USL`JN6?d>=(qMqZ}ByUS*Jg_lm z?tUxB_omn3D+;q`Lxnk;kA4c*JWc!9chUQWuY%8E1BKJ_G28QZ4r?lO%Y}+2dvNf* zDCMGIXyLC52pW@qSy%t3eA$wIV{T%RZDVCkEX&u>H%47yOI}^XDdn)A;6m=<^cS?B zXo-;>&9pi#jS~S`V_ubY-G5RxEst!-FN)>)cKgL>_yx$Ri*m+r+P>)Mpp|TCoDPT` z>sqaA{S!ZC$-F_cBbMX)#xLgTFD;2y5hpR$i5F{$G;S?@SDp@jE+EyJx}G@T_SxuE zE4S*PSV6**I$zgw2bVu@NDCcv;y%p$GFiCp!kxza?NW2v^$d0L29Q6}K+c;ifA==LFwS5cfPb*`?%{}opCM~dYh>s6%@Y!POx zyX>mgQ24&;DZ75SAlFm9@rgjoQ{LQP3M={N6xtO(cae(0U@iQ+h?|V!4EUJ1(_AK(3Q`>$&mmkVX5+aO<-#Nk3LBrOZ z96-bN`P8X8i!sfsPp^)BjkeS&=eGT>p8taNbhIKXYsrfci>Jcl3Ne;~-X?v8#Z`R{ z-&KCmNZ%1$a9}Hm%<+9XH~uu)a_LLaRCHb@gsndDrc2t?)JaErua^yNBN|0z%7@;R z=^e@}yLxLZhG|T2{?HqtdB%FddHUTV^UO*j^K@@S=9zYj&NCc6-LUhhzJcP=mxjlW z7#l7=I@VBEds9!2E7YJNtu|Lrj<40UVYIeiPwsfqcV^9Cjb9@tEky*Am~D$jSS>FJ zCNXIyg-kxt%DZcB$&<{K{(eN+QbN$2KD}tf#!^7gobKr7hMd&M^1D}K=7M`07`8_a zSbi7$#i+R%Qu-vk;I2vTKE{Q8H_Vpu#eOj@P;r|t)!ePM@I4ml(GXB;ZQ#purX?gy zxzT$mXzG%v0#o8xgI#Tvp|6O(YcOH|;~PuSHTfZE`5>n7`S!3y$ z*eT}0V5a1evzF>YH7tA$BZIXc47XL)B^b#}k+coudTXVn$6|uaiot46NBG5uuWbvp z#y5!8)*EdL=#R8q;MTD_sXx_nnLEu+SbwoaCHHq!p5cbz*=M2g)hd+juft;{gQF@W zZdos~U(6kfx?yj<$$lkwCF;g)>k)QU?u(PJ!^?H7Yzo*7)W5#u$JDe%X|m?je}R%k|7Fn_Aegw&_*Y5(EOg!3^GEv)`pSqW-#8$x!> zDrv6FmU04iOhitgQn(a$B-`o@W2U}>|o`g>-gqKkotz|QhoY%I*HS$AiXrpy`(A}?k zjsi5IW`=s1d~i;pwcE^0fTOgi++B#8g%__q-?tMX@eYYlCG-e~XFkP8wjWjR`G zL#goe%h86&Itgyhv?-0+k2>>0H1gvjwL?1d0!i$zDyh0O$}7bdU)~GU_~ELlH5_#> zX#cx@6W!~JSpIWP>s|ETpvy!#L-!}I0s=2r$?59O z*i675r&8Cz5d3G~(pajTwp{0lF#4kzdgL;+Len{f}T+7DIc z>aSl(2L^rpqhiS=>O?>B=Z|gYah+cgqH`ploT=QCP7I0C<8w!18y3DaN%>`ny^Qt> z(un=zXelMSKzH=icr~WFnq>TlDk^{W)+;%0ypB00!b#8YX}r#gzRXuieP47~aC_FD zcfQm^1z{oW*?*`y!}SzSo+)j~kcit^z12ylrw~cEP!LOw(MkSXx|#IQLHr zi`IQ>z0pdIx*P9fq(m*~7^cQ^tX!*oh0}gmSg=ISkF&83kT%mHH%Je;KC27WzN+d8 z(F+qMDunx*?!TiJCQU9AcFwu4L~#ad5dUy@QW^RQo!RqQ^G{w1(J#)4X=hckGt0m) z$%%JoH97Th!8X^R>*j29YFEK_^we%4VoPZtY15;|W~JBZPu?4%pWvB|mW4mU8ALzP zGdnE=>Khj~I4xaIkOgUI$H`B2rEVV|G~S#It7X(8y>yb_S+%otJVBu23;1JTc{g*v zrC(-?ui#8Ul-L>FVlg@0XNJ@H#_ukedsvNE&76{mrF^EI0b|&VF#NATf-JuMEGyj7 zL+Dv+E_^p~KB}5KWbjz!lU@*2fxT&G%C*?3o0*>&j?(t5Th->ro#P&zdvYY!8NM66 zIs0x(H5NzEjW==H?h(2=K?h&j z+lvPoUFANbpM9%g%=T2Gn4m#dNc#(WN=y5ETgIb2J?gcKrfouJu4WrOp(~HmJNz=| z$CF#-ac1r>blvtbxSq-o<28WR_fOJChW7MZeSH_FsxF|v9Q-`ZUZL}$Zky8nqX<+*iQNGO=h+)#|zA%h>pE zbB>MDq;_%c)Sc{C43vxZ-j;{mWG^+uMla?HmZJ^$lX##hxx^m9U} z2J8=rmz(6BrUTDh;Jkn6S!1G(vgYpoSr>$lU zV>-q0Q=yrjEQ$0z9I1~}Tiz<#j#t<3HjN4)(6nv^Hka93bY^MI@$*e(?tx;qCg=a5|@*QSeERk=6T*GbZqV0h58v$up+!tPB$Q^;fc&8-gu79vWul zh%gFf_b6NW7greOR_R9vGW`(fB_||D2SxSGxQeIfnjP1_n!)>)E z(??gGMlUQVDsIN*-6Pm0)NMDG?Yz8OYbGzu=ay|(|3+gqH)bd+iGkrv&+WP!Y-foLk~>SpNF*LpQl1 z&ZoZO&e?V=+_LRcdwDGml;sdPWax;j-yH`J-YHqAe{gYi=K<%|pw)cJX2(ahgp{!P zvllsc)@UzK>)TAFQIplCh}ksv-G_)Yh7E+HFG88E*3(4xvcHLnp~{-wrFV;4MP)`m zG@?84@Tsh=U6D5r9}4-jYw#w$+ws-I6vki08_F)pe|u2ven(tSJ52Hz%TdaNv?JHT zp9`v7vS$b`@sUfplheo|Q0nt<%H14(#{FeJskubO3YjV*zt~x#Wk(Z=NaN@ztNy-l&hzvI_tiH7J%}lx+%F?3~vXtf%_b@C;Uwx;$>p+uj220(! zRT>J7pR5h7*W@E(PG;M2tY0XiiLtR`iafV^hk|J9DSkq?G4g9{1HX_vFzpjX8D=br>S<;zb>tO=w%Dx zSlbj$U90}3WZmB#AKV)6BN_fs$4SKJ*Q~IT=>6)qQ+WlY^zv(~-%?qKzf{V6XB?FI zG^-PvX0l3Ij1*Q6ruNqS(y}IX6PT*kS2eieGkzIauXa}k{!a2S7#_>=V#rVO@e;py zZQ;1>{u%j(-1F7ZG3PVam^I$|aEj+#TM$gRvg*ernDxuT`b5v(z|gmw=fq8}aq_&6 znR(ps`~3aDCdX`ArXs3UOD?u71ygIj9@Rjhx0{#3i*-49ZRuyylx?-|hc;cy4r7{6 z+jOc8(&gkgRa+hOr^r$;Z++5DJ|xMtN@eBwMnS9fWj8;Sox%P0G4ffObQ%Sly5ect z$$b45tJ7R*ISLnnwhI<2*c1|%)K1QOv?i+x73HauM_vf}Xp}E2^BLTK7(-Ds7mHc`*wWWTXT{*>%iKC?#d=8@r+>;fjq zE2|z>ud-^)TV;Br16eaSRfel_oal?RSKDfz84Pmud#~mRIDeW5=3tqg6L4<%b=)>; z=B(b(>oz8Nk*>;yT%G%2G5*;LdJn1pDlo}dEwB`+u2Kj%H!Ga5jhqS49ZI@y*ecc& zmicklR_6Zp0@F@6ojH|M?9`X{D?;d4HqY zPVAI?fg+3i^s1tAfzOVA6HOM8(THo6sPyg9PE-?D7LmDndR3b1;v15_b#V6}Re;(~ z_0)6$S=eWLmK^wtyh*g;dreAqZtYeK{PA#8bvP-DKrczT+EJ^eL+0|?n6*$2Bj^B_ z&RDeTDlfa#RbdJ1I2G$wsl2Iar!(PdT`Q@R#AYUWjqfKUZp87tzaA(4gd&|)r_3_$ zUA>U1WJ%1@O;_cxEtf;>X)0DKZ&(e=Uc{Mpjz+L+%0$L3`RioGo@>1+#Sr}CnJt%i zSLawT$K)tat#>yB(qnIG!@Je_-iO9DD}U2khCg?;Q~mh+aIAMs(6&B#sywxENv60- z$UdDeR;BHOm1i2ZQakO>mKl3q=5ZXWzfNYX+RBI1k|7+uw#=PdKU)QSOyYkib=;Ax zoJw(+I8F< z&~~BLvQtRN=YG7h60LJl=F|a4W(J@~YKI4fjwg`XB2uL*j4rQSmcA0gF=NZxX)+)r zn84cRn!2~r$h=G{j!CJ&vnbWsK}s+vY0B27Q*a=c%O^8lPdUt^C=TSD5c4V91D)Ih z*6X7}?TeE#rY6=$rDg+vKjJf3DRXjD4r7ppz_phlKLQjP5Aq3izN`6DE(?yw*!kO% z{kPuW4EkV36$6GVAEjYN;gvzou~PBD=9{*X!)I=tW~rXVil6Yon4Ht+s!aW1Y;7Xd z7f2IoYts4o*B$=%C*$UnZIz22JIhO*4K}ZzC`eU(_d~7hSX`n%Tj~$x6}i)u!RAf2 z(w*Etev9~U#LGW1N&TTy#ur!puk~w^G3!w>ML79iG#RgihS-bn9d1 zHf3#lm)cki+e(fX^r>-z)=fA?`wz4!KKYyi>SRMu?Z%e`9`-|R&9w*c3az>2PyI-S zZ#3%)W-@$nl26=HWp&Cegi$TRcZA6v|JsyJQ=Wdd zwuah*Lyb?X7BkPHG|eci@D4_}rH&Q3=U7TBQk<<&>#mCk6V0aT7Pfg}?f8y;q6TRHjs0 zj&0(*rNC0Ow@p#mR&Cio=IYHF_)gSDRQhyjIjZT{tr}*d<89Kl#a+IF>~d{hsa~ZU z<}38lWM=tKZ3HFJ8_O1*l0UXJSF}$n26EI)sCIVsZu3ZV#3d{9883%8XPhDi)0CH7 zJLTFItX@$ZTKS9>;{=NoykAj%=d5)A*&SO*&m= zzUG~j>(;Zp@DL~V@bf+ zya|_dwF>9`VM`iy-+rdj-l*2lY9GH5W+JuBxps3xkpMrJ){5H*3xW6OTN8@yUt0<6 zsj*}kl?*17+Xl}#CrbL7#Dt_8Lam$76 zs#PR3S>KLkF>;vO&sCRarqz0=L@+3{^z<@kFLa{On)^8i!QsK}}~9l=bqHUGnGh*0$DUUHRFKKVx&TcA>jRgpM?bKIv?lx&<+_qFpkzJwA%6d)Ze{G$hNCom|CwV>Ev+8VUKuJi z3Hr6|dAqZ6(2?6`uFpYP)TuHNzN?n9$k)vsOjRw1&WvEzpWXR8{n$B$OWe^*|8ezIw5=-6f4-JdLnFzsr*J(dc};N)(mGHth=u#jaQrr)KlgoMP5%#S@j z+0MQnGO~u&70vdvcbk%zH|+M8df$8HoK$K@ZQyh7`TqX&$^E51_mcLLDwq8$tE$hH zwe?Z^Q&d-9l4Cex4LnGA}%FKTX>NzJ?UY4=^nd2{+ zUahi6WZ<@*v)tq+XU6QRfD9+>b)jihQDZRv$tV%FH))wqcKLTuK!W0DpYG82YBOu< z4_=u=o8B4D>!n^)rG$H>&g9ayz&j7%5KUDV7!H#E`VIee;yg6}>hJks*IS(Q&!gdr z1gvs%b-ll@Ywc1J7WBLQuS@vc4~65lC4F%1`!uQS?BX{%{Jd4H(@SE>zXvDl)qS?A znrs~`4i(KhOei*9nNaMLUrrt!V+v2~s}Yd!?CY)1g+DQ%X~w~AhgS3#mYEAvrK~@~_UY?@dJp zqc2cet}(WmJln^@b+3F!TZa87AxLQQuV8p=zh7Q>(K_2R(@%r;V=^QS?!AB3j+6(H zg>BFFkpn|Z{t~TD7w;s;m^ly*{cxQNqh{SztQf*N_?JbTqMsyS>t6}SN{A(w z{R^L|{c!&bEG85k8}wU^y%J;ooA(h<8`vXWH=z8iKMpR;9@(c&fxka7{s-$wM+oP3(fksV^+TwyguBL}mJG+V(ec#cy_Vv&S{9Q2b#l@Bzuig65T_-3u&e2}{ zcGp#I+Xof58tz<^PK-G^lg?74F+gMWH!EJNRmnp#$SBLvcDQ}kmQGT0AlK?uTKv_r z$%-Ehp_ilsVvbHv=su)aSrc%6)Xw`}qoQ2-ubOn&e)hEG?2qzilK0p2Zd1&B-Seb2 z+vJ*3zB_f$zE_TxbZuXSx!|X^%6mhzLkl{(x715d;`D${9ohyg81DYZgFyG+xdA>dnan=j-SB(CsdgEamLH1nFrlgX z@ruIfebkpm4-;C$XQgzW<&J&3HkLduT_PV9S zOOZ1N58cukc*ylE`|Qng#=eF7p3NMjv(z3)xp1WSC?AjO!0-i;-lO6}xpJ;UqLY6( zJeE2sETjz94nGfLqO6~Hs(tbOsPtkIfyJtJetlQ6NB-OrOS0JO>ejdNjV)?i9C>Gr z>eD?k0%eNlb?HjKC7yOxmN9$t-ouW@^l&@7vsp5)L`OxDGPAMQ^QOzQ?Mz1Y1Kt!F z!y8;ad6m~cI^R#ZBsVKUuXb~wf$L;mrBV!KtFc37320W z2&#WPZy&{8+nZUx;+uE*`S7gnd$W8NzVvy@s5{AQ{#jX-YP=?6w&6`*2Dl=QRG8>l zb=O?weLB~tXZ5S*BCq14hULqddF`O`El10QnR%_C;VpB^^qF~`=4lt=<@}$tne}&f zUSBGl;-GJ49;oA5O1-DFN2Nzq@4DfA^*s|kjsE}T+`F*n={J7=;hcMy_we;*_*3QH zQ;Dgqu+wuLvdzBn+s}Lt-!~Rrt1|>Go^W^3peGUYHsPjUtGObsRv0LcTw06UPg7k$ zU1zfPbiaCy(|!umwO9K?iB8lyrfbi|nmrcwkD9I}?QgAE$QgREdG7G93R=DED?69= ztZW(b47w)=DkaS8gum>%&llld(V=&}W+&rP|8&hEHR*xq+U>79S1hexFxke=-?scP zT|<{1KW}1LJ6*#NG(ND#)m*hzdP!!1#7+ODk{rDI&phEsY#ZUw)8u(oOVYF-z3uCH zJIjMJu6iAlli3_yrs-!WE7Uz&-D78BX6-H4r`f`t2TQqRYZjgiS1X8SEe!;f~s~_xUx!<&+}~jmE1piSus-V-HIf&&K1QFvGSFo{Wm-n zWK{?lqEz6XBr?~|ukSSUyQsKh%5MNiUD-Or!-(SC(G z@&YkbOlalv{!tfVf|&TqXKHR&;v+Hc6~SPhFMhn@$NLL%!(+Xe#J&3q1o$GhdZZ*s z`T5~gcMpim4iuc^%ib!kf8#+cQArgp=MJa8 zQ6)K2%yErvUz#V`?pbIf+y2LQiQ!_oYi!iZK4g~g-GfeC^rKs*JvVX()MI{cwfRri z3|=@qyCtk=**$RiFlj5#e~CD#!n13oFZjs=zq5LW-Ah^0$$opo|M{|TLS22wLYd2f z7S*PTBg-~|Mb2{u=Gf6?4 zr(i`j$oduOrsdPwFs-2f)(oTW6cDql?{V;}6L7S@%Cjf8w*oFrO=})%mfr~y*jQHM z8qQEO;eMByosS4Gs$O6>n`RY3n3!bZp5T zqfgyzB|L8o(6t)!Gvu9|)Ton!6T|`p0{Px>I`ythu4bx!{3$2IVYkJQ@^9q7^sz@H; zFM5f`BUU%1^$LlD^lH94eF9=*HQW*Nn_kNF=H#SHt+RtHRGvF~Yw!LfoKVlaKcV<( zEKJYY+&4A+-I@+l0%!6q>%TjuJkoz-$)=j{>qv5hlM$R-gdpoCk|0xpv_;77W)d3{ zyVqdwn@^;(;X~gEqVybFgpl1$Bt-!+KC%Ii#9uN)(6b%dBdnf;?xwP>NEND2?CSG_Q*5+*hA6!>XIp+V4w*fM9Gm2S{^v7k3e zVoxvqL6G!GJLsM3ov0Wg_$3oFThfhM_+^S#7d@+Xsb@5C@JlHIjV#TY$Co*|ttS-I zn_3C#5ezx?VzNP(eD)JNo0Md;>_dGcvucN=%LUYfhyK{zfGA(OkvUgEDt*D`C@;LKNwGv90|bMrn2 zcmF6%xRi3B{6nKg{FQsT#exT$^xbU2d_8UGF0<*=(a#mmz+Y8b{E+xz^TE<-gTFB< zy^Lx^OX2Wswr|WqA1#lDGqQg>dZ>$Ze)s+WGTZlivq1@iFGB7;A2ID8-P_(EZ$5b7 ziKv|Qj2oka%wmD`k@e7Ld&lYsboA?m%^yvi1WcDKCBt_eJ1YWf>sQO1 zU3!b(xa`l|k-X0MOP@zOV2-lp`(Lhg+2689G)zGYlQ)er2+DLKZM^4Dtk~UEzx{mDf8U-Xa;XZI{8C?S?DH)|Dki> zILH`2Ied&Rh~pr0`1J6LU5{5%C>~AMDIN2cG2I;%z^(McTSj|#Vn7<@_7~L<(-r5| z2P&I}bZ0q8d{)hME?hNoV>3y0(|1#rY0Il7%g&siBG(0RdCDd5NRfuEQ`TrRGL@u# zvoEjIvHoE%&d3=XlD)`FTvw0U{#K-vU@2o#&;Ha+_x+U)y`Wc{a#1&PIt+roZT|br zy_F?<>`l$3dby_|%G)=}lopKHV=kVpVsaOXYOGsFiIUg+ST5{E3m9br-oP zPs`9>A*pQW|xhJm))y4vz5HI!UJQeIYZXV7lQ&bsFU{( zSgos{>Kk|KnfgLL=^immof1!Dk*z}B6zxeEx5%<06NKFphuKn=X$JSt*+FB(vn(6G zlTF8p2+$a*Sy^FFkYytwO>v*R@w(Q{{#wlo3(S7Zag~c9Uk3dxPJJC^%I=hTmECz( z|H3Ha?UbP4XJ1qr^r!Nz_*V?xu^8tbR-(}i<>EWRN5{$7c*sS?MV-!xv60?I)#VP| zZN^4AaY>g$;u>09e+8ZkjufT_tryB91u}(q_f6lfAUdGTZ1|xh<{6ME$T*-<^e=nTncf-_o62r{yM}HI)a#zWjT6nYD)p z!eW`coXGk`5c1i(FoJTw(w&w(i5@{&+2k%l9!HO$uIzTlBllp?d&uAC{)BRaLXV2S z+nti!ib0Rk|FR(i-WgjOmA2LJ2|gX`Sh955|6QTCv5x2{o%Un{GEM0|!#|#LGu#|_ z=_O9Cb$^B-<2f}sF|)A7kKlRj zu8Q6v*=GUs#$9#2JhI;c<~8vyytv7$nd+(dx7_K;1IX(s`Dxrm$>YfDsrRY*sn0ed zeYE>e&P(A|(V`IzJq^`L!$=eDsvvL5{d9L>@@85ey$DiovXsCIah?1Wv~pKzPpjOP z!@NRQWlxZtvE!he1l{CS*cWl8T%sV%`;wV9g0GerOwTMQmsv`F{bVX3GTE{yIn54_ z(r@w&g_lO9UteAnXnS1sodQ>T8@hus)sgn%Z__6!|ED~$l-8zg{i_Ql%dXO5EJ!`g zt-Zq9swqgFU8=nTX*Cpd8F$1_o|-O^fA5d(XkI&K8n-Lo<&Ot|j6DF-7Q`NXYm*~^ z8bWqOV9(FUuNEL5LM+)OrI$qImeg951uf^Bbq;NIHHOIDDjZ~+v0vr80wkM83E~qZ ziZg~z;vH7&$x7Fp0%Zjc<`oDasc~O>YA;UT!7d3Wvy#+G*5-qi1eNBCaX zp>juBfvU37-Rn99--D!NMZ2lxRLRjVL}oZG)S~F~jXnPV?X{ap`BAlaf>#O#2j+ zoFN_-Bf4jA@%}B1=;Tse7r_f78o!78HGW_JokARt++p_h&u&QB?b=;o2VbP|Ou^BW zs_eI}UAZHr!9fMQob-|X#Pm2iaRFrKEr} zQaFi~Q;P3#rxcTVSi})kl55=isuS^nkNTvTD1dx6^8@@qMML)LOCcTJ7EQ?|6C~#A z!0w+h{gTVy$R1q`ng7_!65n2Tib)eBqZ6JY+l5-N?! zWY>%-fmu#+KI0gDGnAelm-s?}nR3&bHD6E#GI7Esz#L|7D^b!p82Avb70J2sA_ZQq zntoQyQ$#*W1z11Z0oKvMK37>#Kxou;ID<=M-vQOJWaqv{d!xAYT5hUHo^rgd0ET9!g{g7Oe3wX0{ zfOntoNiN9wmRjfIvL`XL%5Jab6P#4hF%mvfllru6 z@i!~0U>O^$HsGr?I~X|803_luO_5;Cg*fH>Bygxf23_+owp}ZDIQ&H7-!BrmLjB)w z1PA(JbP5tLqa3u8GK=Nq8vk~fp>*0RJPM657iAv5r5~4n=8=0~^jqn1?dLMN1H<3) zg6w0)>sFj-RYB(ZRtMEmM*MayCD9W3&~v@(nk0vlzr!UW1U?!ubuSQSb{-z-Bd#Mh z5>061HIHZ8U+ISI$`41^cX%w1$0TsQG0_3n{ypMUOIMSY1QM@#yjO82Emb7m@aSSb zPFl)I$i^&^7RpSzDKUTfq;=*d=oH1K{k=a{do%9Am}R%zjl;oxR2C{nBq}QMF(ts<$xc3^~`@$q{I>7x$aq|B!PXH;E=6K`E~m5iO0!VO$$YSJWG+%!VacPq$K}0%En$xza z7M6eBlzVE_Bvn}VnO^RLilHH8DsKIS>T%^LF(%`z6L^+_Up z+{EEKY>{W|cubr%h}UMrgKO~DdcY#D=G}2z*3W$6oSOH>WmtpwZ1y}HZ1=3zgR})t z7J6lsto@A(-+bYa9kBM-EL8sz9effZFX_Dz9lSLPCrU8EcK7 zFY2H^--vrrfAbIGKdF_|NVY1xys@J8y1ucGD%W@3E=9>5NM;M&G}2i$-4LiN6WooY z$!qTjyLIdQ@2y+v%D8tP-nx7D?yX^spKosczy9z6*vi$J7wYN?b+Y00_qBI{^14~u zzTg+;wQ;d>wYGur%D6haSy*}6yShNEoGd&%QnZ|1$J8GNLmnD7J*VN#lnKln#|ilQ za_#M-P(?n24@Q=>38!B@8NIo-f1306Fk|$Wqvfkdt~pm488xU7axO`SNAn)T9!L-W zi^J(@=37(yVs~&vXi@s){2Z1#@(&&7iyzop6P1XqM1;QVZ3(^8Tl652VOs7XO=wwb z52RBG?bhtj>m^$EHQ3ixgz?z!CO3XjTcy_xJCtMS)vVAoT5nwRMknTXCjO5o-GZJ+ zJ6o+KtqbL2bCw>ZZF=K0x{InkG-9LM@BIdIZL26!iFAHj!6$fn=V?9XY%B8Woqv;y z52JBEDSZhpMsAdpQ6Q#v$!+*WXSphy95=kRb`7!uJwGgMm?ZUHTNK4ArCJ@M?p04S zv}HSMdfjBpF^0b=UD>#jic7nsWr|n&B>ofL7!g&g9xf=`ZIdt zl@=n~v!QgY@9&}a8gJHh<9oh*AkbIm`Vh z)|zap!0MkOg8Lq*zaDqgTsf)tDXQ@T$g&CPy3!jjFhDpIv1 zqLou{M~q`jWL#<_0>0RPNcMLPxKr^P@sc6;736=wBYW6{Gx7 z$~OhBh4zHBWYz6B;JS?>UXVAued|`ro&T?O`|SV6x>c8z2bS^w)@*VHK?9Xs74V=F z=$hyr<5HTZs9Wpd$x89zM&5DnMtkYJ&1EgW3%9)G z-u;dcN9sN$e_rX$8Ra*B>`trC%?O(gdR#~F%1aL`T4ZW=x!?ap<6$jlo4!PeK7&qM z8l?gPWrRR*n`$t~Y$|o>ckPmgyfzMNpmSF_TW(lBJs5r8O&GRZ%L0>JP=K-%XG^=NIMy)+qa_MSmxLV<6j)@Z&iX5Qc<+`pc^mWbim69lEzu}=q z2IfRn^sFu)lWoN2&q+{Y`OnYQ4aGg&4=QUiMjhg#+Ml1}x6SRfGA|16p+D^!L@&hc z8l2`RU~!_SEdn7uWacfTD;|{rxh9a|-c_l$!_XrsdEVTM$sOaCPjkBX-aP%?;&*~b z7Ryc-I-^V-Q=%x+{)!JC)i!yi?}!W9>kN0d${Hvqm&yK>PY#HvO65euVZ0hsQ$@-^ z7xuvA(A_9%PSJO;cja;Py48I4=vlNkG*@(Fhy9W+y8hW0&q`~`4F6?&@mf)55ii1B9kxth}>R&M58_A)dO?Dt6hP5vGLTq%NgRr zxW574Hx~F~Kw$b}on?ObGb(EBZBf7j6Vn&a=R81jyNu?&0>RcRKL0HSG1AUL`h4P% z^5O0%rxA7`a}Ihp?$Q%h;>w7!h7^(ZJ_jdDEjoULQMxbN7kAON(mizOF3agc?C#S* zvL9G)pjo*ejIr>2+i69~6mB6#veNloG`ibmVB>{+=JQ|4Q**M{4_7K?BkLnBxtPqV z72=+k*8BAq-SJKS+B!5RQT7Hw>7NlUp`dIJ*r@NmVH z@czWiyWbOU(G%|7MgNDc;PptkyyisCtBoCn;>^2~aZ_wHF09U2HanRp>0c?oz_SB%`n$?2ySq36EGVGYp5j6ru=&>{xkX|H`b~ z&zi)iS%mK^MWZ%^I#%Sx2JFO-9+=Dz-2HWH@wqH6@gBPg#Y{@s5@Yxy(k|@Fz`sH- zS*XSJSW{V2*OvXC2Z(Sry?@-2V`8EjscUmp4%I^>73ml>ZO%@Xd^6OUDtXnGv}Y3Q z>J`ZGr#b6cdF<}vz|s}nZ0q9p`;Vg?&4me@>Cz^?Lp{yd2W+cWm0?)YFZ<8)gpzoD z_+k(d_34F;9~)cVu8OApLaqMxx}z`uj^s{5($0S&qf*auw? zj}`N{+{r9m45KIcrkd>u!~QYDJ|n}$arXVJtH050T^sq6p8S4G7BtNOD^dvB4--?=yV=oRxE6J>#ot;Fstq25pD;`o{j& zjMX8p-_NRNby;!eUeB3zZ4KZ%? zP!}N*NB$VtnuRwUCiKoX?D8UQ>+%4nsc@n9@fx=^y0>tJyKn&j*3o+Afz)OFG!-4E z5W|XiH}1U#;>G?3bXZ#St_l3Xd=GgpRoMgL*HrbNjiPp}^P}06jGBB#d03Q;K1}87 zNEaJY#U(QIoLbhe+&*ZE0U9A+1F8a;ot7Hn9!EsPyoeikSn+4ggz z*ZL%&@BsR8BXM>&VE~yhv769cVSdSEAVwQU={wkE^;}ACY5xT}y`lBP+<46b+bGA% z#S0DF2TS&{gc?2MpV?iW$kHk#PkA~ni>7nx{c=|EVb4>#>xG9d`aAV_f>IV@u`DQJ z^rWHoiw;E+w_R-=)w00wlyLp{a!XLptbZ7k*#m!ZglX=a-?_1AYe4rm~IL-(fT9QK5&aZXM-ofseDwLMc+*UQ)!WTjFM=hYBRQ z89z`RxTEQLTjY#^OY*&EV60g7YgN@pj8<>U*;~2O_|ts_dnny9U$g6WIN$!Ok5f-m zPqgOPQwYN|q! z=bf!D@$~#XpJ{q!8|ha3J(c(2gobgtTrT`B$95?hynmDxk!gJZOq4mk&%7AkK;SOS z3vD*DDUuA%qRPA!%e;JQB>H}I{mmz?G%>a3gO=DLb77ojgRSd_(a_2ZekQ#YjmX|R zV*i#kA{C;0M?E)}btC6SYyM^M_Ixf>GZ|aA>k_VDGqnn?Pt=SXYf7K$d|Uif;7LLb z$Mgb6rs)%)?PTYB6*fv3J#6VoRG|E(q2gT{`gJddHCpfWpv&G0#lbGOo2@YL@s8pt zrTHOY`Y9#+knnFq%q=r=b7AvCe2qGC40nEuRI;<|StO_HeH(g>g+~KIAmb%FE1z5e zKe(kaMGnwRj|N`lJFyMm${Hvn6TqutImzy0r1HP90p3|^$pjGqvrh3p=1kTv{(l|g z*Y5}jzsKI9Ub=YHM!j_M$c1{z9fzGPBO>Pc_mukWWw#yt7xf2qCJf`~C5-MuT@-FJ zNKd%f3>)F})t47i&+;yL}|u9QV z+>l!5*6#Gj!QkUQl}n1rJg+0)!q3Sn{1qN!9!EaYkNaZL)8;KkNS=oq*^t&N5#$X0f&A^LCKa3eIrKeD*+Ou-(*Y7D zVoc`IAS{$XFFN~ow{Kl#wMVt?LiE6oqOmebd{NeA%X&pPfj+aZROi&?rw>Q}ccMj= z)1AjWx__Dp7ysiZfqh-}Ctyn_{701Je-z#Sp^8B2%c*Lo4`rLm{(oMX%l|i3&jnCv zwoEi?0#?-m6!c58)4&JEtA}#P@h1sw97uv-WrWjtP9f7Cu8HP9M@elIkWm^sDbKx$jwf8UKqZJ~aiyj;2zaMxUw5_imS3X%g zJ*HKT5@;Y_$)<5#mv!#)<>;9c(KYjUT<`Hs$g(B7x^`^qWv%O|VFX%!YazcjTLw$T z#LXW}?4C61{+Kz>i^7|`G9YxyXzJ$*do;7uix;9|=i?4=w93qJ(J{Ps&kpV$a>!>T zD?=|AI5c~cQ@w}^7NLI4dx4q14g79p|AzO@$BIU>IuB+iYfn+cPbGYz=X>mWKa}Jb zSD)(lZ)DCB2>-r??YV8}3Nw1vu_`Z5{piGINgm&S{5N8B0UkuV?aVF|d75$Yd62#T zNp-@Gw@XHhXT1mdTj2$}&#+RHD{O!M4VFbh)ur&_KC+8sBb9~j7mrM!Nsc;vyO!{s zZ#9VvJRCC8jsM_~SaqTP65a5=>+%C`^ZTsJ4~KQ{v*ur`LVA61|DNIzIEnPo_w{3F zTpw{DtXddW6lr(?i{C546%38qPhXLqB)*(bcamrh3&2PRP!0G1RsP`Xg-v0d| zYczheaFQ2lFt&Q{d6~_ObH|R2VW#3w#J>KgeH46iFjlNJY07Jcr*lWukk^PfZj-N# zf~C51h12lo&a181e6OO~z56{1>EX0&)&=n0GvD@5`cuW=Gi+c_oV8-k>Uzis!POhP z?u7f%X0R7+D{4KR{MVnX_QaXb5M$yDajq|k&0w04S_pw9u8WylzR*hL`@_1A$v2-4 zD{)pBSFdcNed4h|ez+$Oyis@0A!Uf~MxW5lHKspLO}b>O*%s~@QqTrPP5}pgKj7fV zQj*39EyXK)8f_{M9@32EOT%ghJEO@L4-uVisecKL*slX=hM$wv+bp{Y)gwm|E)ywU z{cOrYkwm-Ln&aY%zRb&{o%um%($k?VX4F%C%rK6i(I4T@?(6W(QCXd(sQDtWcPIZj zdJR6{sh~e?2;Z$3>E>e>0al5{%_onx_fxipqA#~lcCE6G;=RGFWq)g^emv9rG8sL^ z*QMUqL?*(F^hlFfwF?{;Ige*MVj-~PnmuEIT5v_2vGkgAMKmU7F^p_z!eC+r%KiQO z(Xr5)z71dbsQ-Z7sJ!z#s9AjXVp~GgZ|h}hYjt``f$(D(d1g`DxTpSu6+iyX*H+t zz_YX({ecdm93IRp_v#NKd{Y*(9)7-b=!&m5umQX`AI6zyM64lQU*=U7){qsoY|ri| zQn)=ncm#Vhhhm9p58$URqrJM`Ha3|JT1_Omtc;6${hcQ zIi7x`YMe%&U(k(;p@? z7>?5)h8i@j>zA$@WR=>h#REXUdTc8AF^!zz^a>=?lbyL z7^R~drR3safp|L>H+XLG)L`VGx_sHkxN}RK)#ijU-8#rt9f_!4$5i_n1(+`6Ag1df zyv!&h+X&ys%1e=hd*d`f$Lh?Zu$5#_STTTpi7cry5V#-UE$}t70;yz~CsP<@+h<4| zE1Vmp7Axl4TOW7%8-~_U8#ME=Kb)C?W*bD?yv(c1y9^gvf8N}5MfhhcZ~EMu@9o&M z9tWnqw+A`svc1MGMv&BQS(Ul@oq!#?(wr%}{|tYp*GIU1#o#0a_fK7Bz=4>2`%hji3}$Y8lOtV#O>a>Z*R_c3NNWNgGtH+Yt}|H z6gFR)zMx)Q@f|h3&CnYaTTSggBl`UJD67YtIyVVj4~bVx{NXZVIB}%Dp1A?fplkZW zgFl=GoLg4psJ`*HALz1QvmQEjb(Dp=$`%{>DX>Wg^?qR(*w}6Wk00i?KbboXurx4! z=v7TU6cxhoMf+5J3AdDu- zmM6Cf^@q#yvQ5ZX2hipX+@0*ezfaw-`qY}8 z8mcy07ar&3*A;uGq?h86sozBh*oUWr?I&+_*`B~?muI1K^PVI9Z*z8=e$5p z!D<|d!|H9mpANdm2b%)-?_r{#oMvJe#n%1DntoHkViDRoHoPN| z)U=$x>&vbT%tHv`->i_=&Yse{8T|;Juzlj%Q7;tbi;Lq>4X-t5ht0%vmXnsjW+tVQ z0g#^+!}|Mstq=JwSD*WOnazP3mX-CM9iL5dEpUyS?41vO_4T#OH5U{80|1o8lL zJ^R4h{1)kC?u|MS8B1;28wy0g@b(QUFhsJB`Nr>y72oyWu~RAiayI7hzt)*Ymas># zKW_@oeZSz0FiP<&wl8b+GPHYjGN5q8E*N-jh2slJ3w~Om3?v`javr6Nz)*}X_q=Te zeOY(mf?c3dI(fvOZuF&h_f)o<< zD;ha*Oa9~U8p*8k8ew)eCPeoM8v_KnGUA&F?K6Lsy)IXI}iZ;n$2GZv(YN^jyf>PrpwrR4vH)yUq9Dt{RzwO!6n|e@Xe=o$Qw$t}s2z;`; zfss&edh0alTlVZe$Ls^m-5{7V;n(`m3CG@Q12OteY>+5^&z}8a>?nWW0z}IHAhL*v}`t0ht(}Z?vt3<$y6v~Pbrb%ePQ%fHnZd0U6`asn*RPt#C z<3+-A!%_U1$k}Hnr4#(n>fs8_-mD?rL0hj)fmbP$&LaSfD5~n(o{c=8sfBX?vzpH- zD~7uVZ2`eX8ptxc5#1IwmVW{csk>S+{z!)jr@CdGrzs=fDXV8Ap@6Vcw}6ve(AzIn z%-j55L90KG zeE)dtH_4SNE+0-?&qra;D%m zib;R}Hn(X6rX{tzyvx!IWvORL&RrRdms87j9 zFTT@hajkB5N^4uPoLG<$U0y0(UIv|>RcKZOq-dhGr_6fx?~ypGjOESZyH=t!}p$biA#w_=0C^X#VBBB30UA?ckE3 zt-3jWN}AMrTJ5SEoWDuZ?rl*|v-}OiwN#szR!NJpr_Pd-j8~i1MqZK9idkCEE+s&d zNty~PqLkFc%P#uc)3mo{TD8^%nvr9FKa9U(m@cc1`YE!$YMP=d@!110T$DA|IF483 z`LfIrE2c|Lt+PGRs2o1tobCN10xg=oPm*W3hexf(*pvcSv9S^~ZCe*1(C5A6J>A+vB_NH3h+KQJUsIDsdOJ zGDg&tu<$&aR)sZQ@i{pR_5`1lb}L`zdc>SDq;8lkWoCSSK(4mgMBm%qVEhMe_=|1v zT&Gib8(XILe1YFeH!gt>!*jbkWmOvOHLA3*S-5yXfT4Z!`;P>%PRI()f*xoC=T2Jt zbF*(QxCB`7zll)+$Be;-1{G3gN#Ew;7i>NbbJ9!1UoV93_u=3k(!^YkAl+a^5I>ocJG0$8`_J^9`4Q2B}=redXa;wPw z44)uKwgh0Wb1nnkHj^}dGg?%>Acc)a#GF|7=T?a^97@*iepiMSv^h6lueV$7elYrQ z@84V;mV|jGF)vJy z1?(nwc1RQubvqJwUl4VRH0s>6eY_wY!TRo6H*Fh~{c8tqjaWORpKo{8v!#JBjUofD zTno;OuQ6e74+q7^p9w#@kqY2Yx9^Hq{)FAR*c_F><=qkW4Q13HaejcUqo5?K4v7FBNow-*Xs2Ah@fv8`LlRr9INGX>nM;n&l30oB-OaW=*fFZ7G6cCyWi9eUQ} zn9tm~ex8HofN0DBRK=Q_x zWxDY`cb{}yDMblJ3LZY==8-TCEL0DysX5i(-D>>iiU#>#A@dHS<7IQW1-QD-?yAlHf=#S{ct9Ic%pSz)vAy(Tta?fmz8poEa zmSNP4=Qmz8?q(W>TZWe^_WSVVgs|nq&)q5A)Cb7Gb90x0Ksu6h5{9$GZ}_Cc9HJYE zQT??8?U$=Nt&lC{RP7tA!gc%1jsX+3;MvGHzoaXps$|(k$kHK7E*+U!B@q<6vY<+r z?W~ah_{Nt;Vyx%sDmJ87`C!w0FX!6gM&#~xW2n|xTj!g1WsWPckXHwi%0Gv1j+tPi z5@)inZm_5b>y4MIi9Z6&;+d~gZ)S;APuHF6I5rQ=%}tk!R%J-sJ{Y!Ag_C~OA5v1zbgjSu;vJ1KwT%{qCF zCLWoo{t3O`zH&p=-Xr;Eqka2N-i^S-^_<`1m=ohs$`D$V8XK|p6tR>2#AkOzv7dHj z8pbS-vf#HIWvP6*KF{u1vF1X>b!qTq3(^eg*X&)XTX_OJk#+dOD|pg15xaRk#yf?& z!T5ZwJ=~o33_i>l<~18XyK+3wZEYGgMbCJ4i|GajtRKX;_{d(9A~tIj^=TUMY<=t? zsPz#xGZv-5?qv(VcF#DSO8ZLM#hG^<3wJ~Mcs%Ad;@OGW77K^1H0%!C9!gR@QJJ^$ zn^~dk+Ugz;6sMqn9eQc#&G1v7dP182`lwkUND&;Fe{XyBTOzxp)|Cp{5# zCY{8#KzAAJDsP`b-|p{OMzvPkD@jf(CMgsw%Sg7fWAZ8vOOc6NBw9Jdo)w2_oU-oa zn^Um?Q-2M7)aR>%(Ehk5p8mrzWA1;7{ITmRKP+u$&U-Zc79W@VIgB|BH@svIuzYCr z8#ewbGNxX)v;}k6Jrr4XsLNS5D^Smz|664BgJA&lxe!uO8n(JyFN*K0;sQ5hd z=*RIHF*d%MFMrG|&QVT*rJZc^Zmkr^mmXv=T)TOaXJg1y=HWAOFpV4L;9mPPt9ZVl zYbdTt=D_s8SK>k%_0lDMB8t~l65@3j;=hl?B@VvkcRsj`4h-i!?v*=WEcn-^RTH<% zz_{Ej%X7J};kYRHZz+V{>ja%oajB?LA9(pN1m;$Q7p72ShB-gm$i+EcmiU{S!-Lx1o{G6Raxw@G_Jq|Y`l?R&?v6XS zzsluEl?kbw-%Oj^xp7>C-Sm9E?9|XLTitWOkUAQC)4jA|%CoVr9c%JYh`~lP8}kIQ znw@W$eLEnb*UQ+QZMrlMqt!_H=5RTZcQ*PyKn8I`UG&WXv$cK;Pxz*nH+c5%4~^`= zAO5mGkc=tk9{GdFOy+{a{7-Gq999G56wVe#_uJGw^LOb}&VonpNy z)jeu<8NZ<+`ND7~T+Z=wZ{xV-rmp?*`7blNpfv@#<|{kIIk)lJh_~RCJ}UO2;OVG_ z24>myFo=iRYXCaN-|milvx9J{hE9d=Hlb&Hi^u?%1@NuuaVwA5@RFo7BIdBe!=>Vo>;Z7 zZcgfB>uRxjZj5`~w8=vq#}KzRzxn9D`NjU34Z4@U+66Xag@&507TVP+hTJ6Kwa+G$ zRyqw+S4T=HOH!UiI@CTx)Ccs4mxeZCWeFrGCwKO>wTpUx7Q5)~?iXMG@Pqdj1Xbbt zUF_Q}hK&Y~Xe*bbptg-td&>>a!ZbRCM7ngiLk?F)uc1><52ntchGRP1K0e8lPjv}b zXsV9RYjpX^#(`V;>?Qu-{??wkC^!7vs8vQ3U^@22GN~vZH$a>FtFAr`r?xKfS`DXbKG9~th8?W7l597*qAF5{iW z3dZJepVYi{pc6NFRz2@X&%=3AHBV0-Q>WYO;U_OBFRnv@coE{xdbnLSe zlo4eQ`t=`ZFM?#_pjCzhZEY6#yJ=546gQH0YE^rTON^}|0=6cS)Ij++t z-|*CO#LY7wLf>^HbwkQkvUol7Y&2uEpQclrXcxKET5C+uJnBOxw~H#RD?s&|=f!J8 zb;>n)Xw@4%MhFd(h)X|HJT-pVpp&QD!djwJ5YIU8s^Qs(6ENXi%~zpY@au_zaT{>+ zj^{49o^o@2#E%4|OF5+^v*6cGA!=WA4&iD=smqku@V4JX_G++1$?H1X@WkZW+9}~ zv3c+4kS9$8?Q|+9r3G`B8Daw0Ojnb@wYwgpRFd_z3oYJ%76Ga9CIvE49}g<(rQ2jW zofMMnVAr(jwmiCr$i{<0%)9C-kyLI8L+zHASd7dPKPpQ6kqO6B;9oQUx}EUi9PaD; zjBD*tC94ECOOfrr#q=1A8LF_3mdT$@uW`E94HT1_0uv`!jJ_FOno0DOSYd=QQB@*0 zC1)>7R_j-pt&BpBbu_Nl3H9nnl%Zv~*kB#)dbJ_*vL5fU#^qnj-&?Eg+OabH&M>!Y zuhR--1`^|Xb*YE+`#a*Qw2g}xY55}=;(7fbiflL}=GcpAGxLUJN>Y+m;i1BHv)|_% zx=m)kZ_GF0`hjliAwM4So~^GR*&|_R>*u?F$44#1rGue~=?3Fsyw$eofX4=hJK|$o zdpqJp22nfWN>yx4*y1c(g|({q+CdvdZ*2(5rVM5v;h2rGoMK0OHkdQk?fZ?Xvh?J0nBXp{)Jko6#VPCfzjCF@ztyLLLaUmwFha0~oc=g*1ZJioV4XF0nY=3iv zY+ASX+n~4V8^0mEP&QXvUB){}*~ut;1FZ2*W_A|ps%jBaW#O#^!H%d7VQ^;c8^!oU z#SsKH(A6ppZ(9gG6pE=*oMJ-|K%v0yV=K#;DI+@*)me22n|&cFi5RLPhRup?rlUHm ztBmXV{4odcZ$6N?!SmHBn<-(0g3T3d_UR@PH8uOrxUL_6t;*Tk0y1YqjXBtGQisez zsn-wEoZKLBL!VZwWQ1NIdTlykv;6cqDAifGvG=h2T9vZ5A|!4EGK3+VwQ1bSh#A1R zR*g1ZI(z#;nr-w}54xP*LevJz2W_xUP7t->U?ghMCZrF;HLKGoCfNK6QDif{dT``q z3>oR`Sw9$bl7@^7ln>d&IaxwRhRabHk=f%$G2zT))L~VBqnKnf3xe8O3pOi|nSrX> z>M=eUa2c@K-C8p~>38Y3S=^d3K0&#lY;Lwrj7j^xU|{A#;s|P60hphLw*rK~#%Jwd z*~u0{0QJGZ-Ux9cWU6Ny8B&M(F?&uf5Cv#efH^u$*gj* z!7QqHc9y$XWVW=pan@l1Jxe#yvL!enK5IC^Ts^IUwGB}i8d-RaMwH21aRpEuuW#{8 zm{rwlV4=IY*BNCB;_O$f}APApc9sE^np3sP;(a&u7L`KdN$ z`Ki!mb?&MP^%1C9fv)Xhu4!MJTx(iTxM9k+d~0%0oWIBg&au)7*+l7VT=C?rTCpIE z{9I5Z+?0ELv;u{9w1}}hqK6UsXB$TbYn8tXRxZDDRc9=6BnrcfZek)gd@xF*yZt(^ z+j;fKuihI!ISPlRjMA@`7ar?Twi=Yvom(~j+u(r-{xZTiyYx$km zNA)m*y!Ir=&;_1pnyXf0iX$=@LBS1+&)su{MwwB`e#TTs>V82v(MDT4-f0HLRZ@js z7|*YWdGZbIoj0CRpQ&wTDR zMb1}lye-Eyg!Sf?4tUAxC2fY5L#Am>WXg$~zRd4$7{WMm9Z_C#(+L+OP37~hqsOaF zd7G$g_=3XDV^7@1osA%js{AeoR@76bQR~+QDmzl*_0Ef<_pqV@vP4l_^qZZxo>q<3 zzf@NJbIDRg>4V_&A{#Q8VL4`YAEu_S^Jg2jFzVb))UhlxMDLRe%QSINsIlu&0xakk z59T~SE^#y5<;gTN+R)`zQ_TEpPoqZS(d|`;G&7IzU9{yiIh(~eI#&q z1x-`IyqhOSBl*TKjBV6p6(YsV>%(<^rxEqb1S6jp!X`|2Wz>ioMX#2>Msf<{2PMv@ zZ0x|SMmbPdOjn|flDTRL%|t;Z^OGCntL0Kih%jl;r+MF_bQr}iXunC+4vR2(P~E)O zhR15T0+L&pFeqo<`sfTMoXZ=Z`C*4kn9_vZhph=Qud=ZK6E3*uLx0%e_Tg?q&O2{h z!|DqN`c!1dk~3r5)Lrn;SsO)veO%pMbXqS_b%bc>-<~`lSfpTnqxY27O0Fea?iNz^OR`wp7=wO1k7dje0-t zlF0CDn;rEYy@M~(F{hG%+ltl}S(-z05(GDAuHJI$ML27gJ>MajpWzrWu)tGl4!V08fJ|37` zo<8*q@SU}OoWDCvB7Ep84N`RH0gxT2ny%IQw>Sb>QR84v*j7Vk-|o z`+&45K<|RII7ssXG#Nl+^MF{PK7eKeXy;^t8#FrzQUTBl3^KfcEYO6uAMRAaHzFaG)}PZUentKpGsM8KlX8-W4a% zLjpZ!AZ!7Ap+4S707*#zX#@coTxc_0V(|b^1VFZB0ZJ&qqYVhV&;(e$c)(2#1c?B! z0YL%)*vYN~0I{|bz`qm(V4WO6g)blgnK}S$f=oFGK&A}1->U?m zXs%p$o6RsoD?1tWlrt}20u-A6#g3K*dQ*t0=k000vJgtP#T zYG5h!fE;c>q4pG@Ck*tEV8%(HH!yox4lq$4KuuB(=oJBTdHn)(0+!H)0H_4kX9TPz zI6FvS3NJiB8Z6QXFojoVKy3SKAXXg6)C{Qeg(;XD=qLdKux!B~0H*l@2LS(7j2LhZ zNdPnmfI?qe0@7r_{9b_-BLfn>;sXH!0Cxcp2Q0;_CqQUBSVII55u6N!f)%-j0d_MM zK$;)4YXWvFK>8*Cpl_sro*t<006MV&PVV6NU?PN|w=Q6(029du)GENy9s`bQU?L=d z9SN?sub?AXUtv(l7O*dZv=JDV3521stJ3w!yIg zSO;qiF8u$>Cl2V}6ae%t__hPVcn%<55*%#=v_*k7P}>ZAU+;h(GguB8z-9(6fN+q8 zgES~$1<)bj0s{-&4lYSGU`byq0=kk<0Pk+lZV1rIz$D&817SDdltDpnu(%^&y6FIo z0Mi8*C=wi735ah8N23NE!3D|-CJ6rZY6r`q2hyOd zEroDu0Hg@so@6rU0fdo#2H4_Uz%3F4g#Z`;K|TQ90%kx^MhEcM22^E$I!R7|vML|| zP0k4jG z3)opeyEb4C2kl_q86ao`?O@KtfIdSWpwC9xaq~+Pa8v;8DS+J&6p8`BZ=j5Mz%(+) z0*W#LU<8}KE(LlnU`Al6I6!Y; z_Lx<{M0X!{+_*)8Jzy?7?LjAC36ViTrMIBcXCRgdq=6+wwhq$9APr1m_#u#q+j}6^ zAIuc2b1R_s3v>(u0a&&x5CF@J3>N@=V8y5b=Rd4~#yw47#BM;E2Ap58Vl*WHumC|h z0LVe`6#&XWs2f;A2rxCBoIq$am^ucqH%J4DR-pYeVDAB?u>gJg5$KhJ`jeoOJm9nf zIPn4Njf?{HE(7fBp!X|4&A0*>L=kXI0~4VK9f9>urUkw|u)Z#!&=4pD()D1N5D+#G zCJ9z74Ft5HT?Vj&tKZ@a5Viw`Jp&vE!E71A^qP^s*%p-NxmL|^&ax39xU0gZ*Ld-Z zJ|fra^(L{`XC_#m4bd>+rQL^9QcGMdgddCcs2=A0oOAOf+I_vu^)0+x%a@u??T@&x zSQwV&;Gx93ey!8{Pt`1NjdOk~#QPD^TO2+Vl3M3-`ZS_-N+YdiK^&d)Q*EFFKU$^|7mUgIe$pd z_kVHr)=^cp;rpk8bV@e{og&gDAl=;}NOwsK(hX9ggh(R|(jXv62vREDAT1>#AT{@X zzrR^)X4aZnzcqjGzRz`kuIs*^y=CviIp{g!-8>H2%Qu?UT(K958m}!CHQwk^a}{Ed z=w4kqCn3LmL6X+_kG103PEq5X*6d|P!oX%wzxu)Tk)UXTPy%g#!q9iiviE|csim>loKTpHPoBt2c1Ltzvx$=!svnr` z2S;Z};j%fQ^A{dl+BwS-RE@PbAgw{ljG=d+tc_q~A&QfW>Cb=(F~b)KKU!=la7 zxHWMARzEzs6t>H>1m?i1sNq7hE%ozWpYGJse&fr%3n7H}_ssB9VSzT0&8H zdcRwJFps2*FF_Y~%D>5ca*drtS|C9Kcfr5F9CN)o+AK4$lHx}ER_Bi@;n2BFR8x=rH0aKza)yy_KOirykVVkeB8 zl2HGMoETkJ@TVbg011&IZA*~0K9)j!Udti$^ej4#=jvg##u_~v|B!!(`Q1SYO^32m*>2ekXHAFJQ>$*-%)qkA z*N2?Zal#8FlZ}UJB-B1_D%I8NGo;kdFW;N5412Ngqg?QI_q+?Nm}L3GO+p>frd6G| zVamo&_B_ozZ?s+0LG<55be#N^Y&Fm30vkWug-CZ#!Je*z#lPd|IF&2O>e0x=A}JjbXrbjm>dgvO9i&<#v<)C&z zT~Z)UU2ux9RAZmJDwd%vXdnv7Sp(b41!pfiFf4@W01HG~wd=rSCnyExLci>MD9s`L zEFg1*jL1fUMX;H3Tg26jl#u;dBP9c*mo)Sm)`d3iDG)S9Hll`<^vrS3(G+8Y_TGP{ zIJwW*({Ze6j_dD?EHq$YiY&BX5eN$cbud4Kg=sOEV^SzkCFG-c_Q~0K&;zQ7o-RhP zz@ivgu)?Ad7IH`>9~Ruu?7RTxv@1g*4~ZJWA`POK*w8Tn;iqBiqm|@FNUiM#k2_!WrQth*1X?aY!QtXe59%B7^cm3B+cQ zSPQs|kXSP;tYNp8_y|W%#v3H21hEguZjE5!jx6+G;RTHX-a=vz**1MDG^zx(j`SCY z{1q}SP#2gfGNc{Y6*3Y7)YUss^l*~TQNSrt24y*@!XbPyx5L2hKb zq(~Xr+ZfU|4;B+hUKe;J!uJrjG$`aOUll^P1!V6tNLdak!@*xwAZ29lXHdR+2xWR0 z84vxE63zq+=TJ zcBIh+GDsH63&^pFfO`))H^)d>63SP|cR&K76yUr3E_}Ot!Bwya7mYYvdj4f_ZA8IE zQUpa)b+{^sz`w|2j%<@)ERPV27q%x9h}F=y#*DyG#`QiE-U251mUNM z9l5wMkh{Wdum={y7|LpzJ|8 z=K*s>oLPvo9Mle|OA5rP3r-Q1I^@O#w@VE~AvtScd%583We0|ZFdbllNUL@onCt|l zz+C8;oe!lsq@M+3u8SH>MwOV=6#yOm=W%LKYgZFhv$xun2?&fjXEU!osu|%rPlcaASIp+?e>_#-xed zm|#(iELdUD2n#u+k`D`RXa+Z?IJhxEA`gig!Xgc#m)OuT0pY2@=}V#Y0#YVG+=^h* zLlhNaf{mPe!$J+&NFDHOWFyXEl?MjDKexT*cCDo1Juq>P+5dgK6CVD5h>SOyk>QqW0_ z4f?Wzn;U8Q9pSkUvqoY9NE76oAtyIb72E?*Za0PnJHlI`tsas`17kaKx^xgDvO#WS zyQD}N+1nV>HV+mPNM09sCBpX*w=^i^EMFBuw*_SHGe}tuDZ{~ERUl<#?`KfHdI)8D z7#R=(WeLPB3qzcdg%vCUkwfML<9~k&YREJdNX#IO-b2C*`BUIUj1^$yMz|JmQ>0@W z@OGrp1Tsh#$_vP`iGX_#IXA~hSrW=u$ag>jq7+z9=`&PzPinV2Cqqw zoD)Q8?n~rDQC%JTGJ*&kEJaXV1xrpbED8`L31K!i2rvRKMp8N{&_WCQ5`z`0I!Lt; zs$)nh92)-6hGvFH)Ci(m$Sf1YgtR^alNmiIn|Gkjplw$GI7igM`Bx8esL*@qAs7VZ zp+tpDc#7C_!H&TW_S;~0DTXmL$WRqz=o@(EYEuDESn-i3?40nLQP)l6Ij%hNLW3qe zf2Bd5TN@(J#K)nY6NmUqp)`$@^5As?X+PwtaxByZb;0j}Jk9S#U_9bahWbVs_?zK% zrHB>ebp|Y?UJCUSq}fS1;y|7x_>rGa&lpdeSZA` zJanX^1QMzQA?WNI$w>&5Z$nuf$`mR=aF8AJl3I%i`Kpr{^bdCu!seVtG+JV34O2J~Ll0DJ!s^U>SYBSLk{x3xfkz)45@&ux( ze{6|6PZ(=xb05`9r}lZi2C8>w<|Y_4qa5T|6L)L?<~^!^3NVvsDjpyfK#eE|W`Guq zHCd3<0+>!Tr3#P|pjMQ_MM~eeX_NzMN*}*^l!G;EqT@@VsUh7vGw=~LB6?8{A*p@* zkD?sbp@%bH*AIn4ttS-VjZ3frk_z>`o7$ z9YENfJ-{rYsS1F20AY6m0Ie8n<{)VVFoS5y2_P*%*qs+ZCxDRj1DH)TwF?kc(ZUaA z5&$$~tPz8xTx#E6I3sibi2=e)HGsANA!!W|&d6JUH~?WLH$Y3qnvamw0|;m2F+gg7 zFw+^JBS1)c0enj|H4hL&(c%nd(gS?TSo0i`Y5?Il#Q~B7gqfxQ?Eym486X@d&Bvp* zM-}tFrgyBJKXNCwG|Z>o$BHVhXsd z6FV)26T#O__=2@8A$)=6x;5Kj0uA8folw1aAWQ_|0tgL2C=HAih(Q4i(O}>M0~HwR zz_1O52{1T;VGijK1qNO)kb$8b3^QP80K+a~Ksvx4y#&BOm+KcKa!fRbGuxD~@py6Q z;?XgR7u~I9^2WnkqaQo6A|iLuc14vvxLww7BGv@N3ZID$))mD1_CG5FVlDd5s)AT4 z5$o`O)_BBvh*%&0XT5`1(-3Rxe_crtYvq5|IK;Y*Sm8~%U;|8uwc$VOe_d%2>mCvI zxnC&Cm3U4^;6s*udXRD;c|c0B>}P|t1}Owml4ai%q#j5u(7lS$n)cMVV=p(8+5|s28d+&0QTcS3-IM@HXHh!03Rb0mE@Gz-(to3jodlJP4Q! zuo7T6?uB&q#fIA?CyrQX0U}aC3vbmIy>5}5(1K(J`359V6OaNRv(y)lfr^3T2AKg8 z=yQ+~AhXpM34o$vp z_Z`_vZ2KV!XaSh8lw;dpPsTo1*9@YUW!vw9>W%ju2@IqsIPz$hQkp^Sk=l#gOr$4D zAT>e8f@CH=VF#%QGFp4F5~w{$Ly++xfl`B%1sSEi=nT{dq%O!fkU&L1s)B?~?E&=z z`50sZNT3)XB{hQrVJJjYTr;y^U>NOpe_S-CeHnpmt-fd3OMK95c7xFb=x4IYVwAQ z%y&5ViId4r6rgE7(EC7zY=g3c0V^0T76H}*Yzw#+urOdTz(KVg!;rQH%nR56a2a5J zz#@P{07H5musdKMz^#DA0ZZ5hnZBs);D$6gU>v|QfO7%!d_!p$1PrseA)N+T39u#L z8o)w;MFGR?N=WMgW(TYTxCAgCU}3;8yAsk9fb9W41KbQ)46wLu&;rbMhO_`+YQQRh z3jy;2hT~p<+0Kw|0Bi)`;r#h1?VRsBoZ%aO1|&YnyYD;p92Ee8k%NL6@20c0Xb5|AqJ zS^&sukTf9G*!G!0Mu8-POAxX}Am4+e0ts1bkZ<4$PS9LD)51Q#rWiyo4?i|)V4vSo z43fyuTpZ3JIdNx23%FO%K>*7`7Wk%JbyF_3s5m00&DKpufaE$CQ)tN_SCkT@VA+W>M0BnC*xdV!n+ zNdOYE#~?3KP_C{ObVxv!0Av?POpuUG0J#G421v-Nf&2~<7bIkdK^}rcDd=d2EH}sj zkk}w0TM2R-BsxgQI)j`6i4PL8dmzt1!tn+|mL6m;NI2d=$Yz6F2MNa;2w78*6CmMu z10lNr@)#r>?-gVvKn{b1>G!5<8#V88(b85lUBgAweZ0TT=wU@!+mHyD(_ z@Cq?N2P4=+11=a0z~BakRWPuFK^F|=NC((M12!0Rz+eZ4F)-MJVH`0a9bgX)_+T&r zgD)74z(5TKelR#fhZ$rK$a&BLgB2JC!C(Z2dc*)7X3{km8{i^vgzG^>5gwv77ro%S zpB5xD$TuK?nt&7lnWedS3{(sxH%Pdaj)6W0DFHHDbCCcjDl0rhE5buG>pqanCvee) z0x5upXt>f`Kn82V(?WQN25AE_93;>cklrAJG~rnxJVb-E02u}n=y#AFAVc8#1sd>& zW&dJRV-aH{51tju!Gkm%S^%LKJW2ythhnx;0*b_IC}Kj<2Pu9BXMr3%QUk~Ya07t6 zZ;z>UNQN-+>|*xS)s@%3EFr)4e$mIUzb?|- z-hRG`_Co38P8_bTqknpEh#M7_G1(69P5V0)kvn$j(|pwAt8R0$-930=KP$-bL!O6q zm;2gR8ExUBXT3H37a+0WrARQnP{C!&b$T)WZihgL&zYrv=TlxO_U5>a;GeVG&e(P# zZ<+%}Hp8*U^WM>V+BTB?38|8jHhY@qt@p{;y0+6oY~w5=Z;m$5yLV=D^u88-ZR@;= zGew^mf62p7Q6pm)0dn`#%>*X3SU$3T3y)`-RObC-xWLznAuQmhcki#ixeAe?N)@Z- zJN(F_oC#`$qx8o z&FwmC|A){&JfApkMI1KveTcoo=2ESi-qwlMDp#o!EEt6{&-^H4QT(&5UE#H-#&jd; z4{~dn${Fs-JtvFO!>w}2)HuH$xPqF#&YFkcZYHJhQ=a-Xb$0fqs_57`ru=CyDx)%C z`Zd?P3$7Xw>bbf2;@@OsL(T7T`;XzD_r10euWzIXS&wfO(o?n%F*7k=RxtinGNe>)RuU*4J|G!?%!~Z`%RN#@VqotEOe5Qc= z|6Iy(8Y)WE8YE)Q_rJUrX{U5}x8CCK5f?^?C>M5SZ1 z_~fCS*maF{u0|E%o`fS6?oUZ2`zqZf?P}_Es;1?vPv|#zS=F72^)FkuYAuc**vN!x zQwihdT8-$;7QLIhD%coGlPwkrFxvKHxL9alb2>}2UT>N4Ym1d`o;YeRjgR$H?EP4Y zQc(YkzOC`Aj{OmdZ*}?*al$5pqv{_WffNann6!m>CzBf!K`{jSUOd6MF+>p>_*~H_ z^Jf=Wv4=bo*f!h6&u(|M@l1W@7yBR`_(?WQrnsak{!5;%r^=A@%QT*7%dOofH&MR& z1>SBAyUyY4`XaO8!HXT0Db%0zHg;y2Uh=5=x8ro0Yh?w-d7|*XE)g@?)MOanDNyLp z{`Kf}^hfddY;tg1J=WU`7_k*OP$6i9V&O1nQ-1mc6cxe2`FD?D!l!| zFwNuD{eRx1U*6W* zM%mKS(n02bK6B!Kz9+H_u%2j-ja?39tPUzOEiwMQX_fTwVJO4P8#hp~?D-j}P#CY{ z>VJ8Odyn5J87orf7twpe^5yYhoFrXyqjGHi&v-lLbs3K3j^(;WssxHQa_TKspiyddW4|}dOsEPT~bojI4za#2Z5vAt$tW$I;6=cfxhfk)c+h+>(BB7M~1xjm0VE}0d^+_ESt=^&lQ$Xo> zKvBmYDg3pytAdX2Tg8=Z@qyZlDg~q2DYrx~+YhXX0}qxe#m`j^PW`T}FMDy_Xqc56 zxjz*V$l`PPzT@g-|JC$a(FoPO{tw8fBY|vC2=^9f;tVjo)XCa0Nqps9_TlNlNk3U@8qZjK{pTBKdtyPvJ6W{8yh3s< z)VZ#YDZISvcjM*W*Ey_m51B^XDn?tXADi~C`1^LJ-{NT|xeX<$&b@UB4dq2@p|JST zuJ6)&Lhot>#@8su$H-Q%f0Mb2l;e&Q_~Z2Kk&mkJ|~K7XEJQhh^F z=*^c_|ET4M&yRbH@}qqh!C_yHbIZOFUbt{$<;K|C_on96zc~FgmqRH}+U+zYIVx;q z6y>y>P?#-BXS6j?_KkLLE1%`W4m`JP{>Cm>k1Kug?(NHZ z#Qu~vad$4*_B4ate)v|&?*Jjwto&J-FuK(vdn^)b;@IEX5savJr)lkPex>cwTUf{R zBB#9ntG=hcH$^I$X6vuKznp@lgP)_EXtRmwyN0}mj}E)WmTmKYo4y|ZxIeBn=s3GN zRLS=4BDnf(bbSSF;*p8T=!i>zOguFQEeN{%#0H4#R&$i#~lf#2^a7w zPB>XtmD12TZpQU`${tbb#D8?}X+H`!OeT}w)#o5Nz7g>x;%WH};b$Cf>+wV+PpOV@ zHB<}lq4Ti#JD-+9v*5@}8?eUF9i0KJT zv~mf(-hC9%z3uSk%QkjD$1HoFU&1bR%hNvvqp^&yA1_R4VUMPP?Ty&=ZsFgaveV|}K69mw<3n6z=W@~Xu5o1d4Jz|Ql*c_BIDXibYxB)Uva+PP~#m#JwurhJg+ zD`1`Tjdfk?_wdW7+SFD|zS8Loo&GbUB{fgS{8GhDLN3Y_#iGu#QcR6R3WNL)hHldD zm$!czP36SMHC_{qHq}@4IZ5b9r_I+fe@M z|Dh(CP_;A7l&F_qQQV4o7Hb^Rz*o;(xb^Ja-DdkAsKZnTIlMoe*=C70UG6w}!ud8?8CvnFshiZh` zjdxNVrF>FcUT0h?jhtXwS|@H_H2L#vFW2;f>)$^Hf4qY_g%ga(N~KQfNCBp$?I>sY zP649!dsxnQ+E}p`l+SY+&O<(Pt9CXJS}(5%mbqnL)-$w~M{&ncwv)X#KxyJFd_1py zfwIUditZ!-p*d9jqjZp3N1V8SWZpaJQ2yG(ZD|Z)1xfS@HX9e>0ReL6mA5arVm12Olxg#bk9|8(`SDSGYDKI)OR-X>(i zU-Z#?|Gp|fbYSYX#jAe~*{Qymyt0vE1xy4wM*em&|M=5<(OpUl8 z%Io7lzMExq_Ct4KL%02|&3nDLqrZ5WZ+Sx%3a*Q|Tzl+g`*76f*TchGHMK;nIVmd^ zZ)`I#?%hsVc59(=bck=V$iRNKefN*J8|`EL2a#V0N_uPCa#mPwiz?4746t9I)aYLn zRiBX8ET>gza+|kQ;mWChiqD}6@z{OpQ7pHCo$&iNy)=#56N08+-N}turd{PH!n^Qe zhL5NU*TT;V>&9(^-4ims_PD*@3*`G^t>NqY)c*8=odo;j=Y)a136m`!Z?T?4Su7V3 zb;cxxq~&9BD^Wg9q&n9We=(7NvvNST^)~qj+xSI-=~D5y2mKl0T>h`$)`v8EXo)BL z56KY};J+LY6-(>HJgvB0&-@VQ3iQ+7G}oB`@z ziTq1$#*zb^$^LdGgWuVHIv9UR#2C9zOTXF|li=#d$CUZ#RaC-yR_BBI0->ekdp{Wz zPX|(B6`0LjQ=FHHH@jw+c}K06*@*p`WVESch(!;QfBr1QUB90+IWP2S&FS5ZSkgSr zZbf|5g3MimtpaXRs~M}qyO@;kl6~9dr;ddKoxZtJEUPUsJ1!7*p7DePWO@mFlcHlU z%XEFnMKJ1B9zC8xQ)_b5>buF8tVdJ6o+qk&8C?bmZwFniB)*tcP=$-iy|h1DWA-Lt z@NPY>!unU$*Jma#Pf91WNn5j6$D^h~f2Iw8ty)d{P)l`q;jJLUTBU?4wmBQM0_Ilk!7B{B}zKdNeY$6e{Y&W-7nUWMiL+2?!Ez~qk+;MNjAWkl5 zYkPr_`s9++pH zOyU>aVv?*q7`(Y||1?dxBh`G=_PcAj#iFn5T)BCkDbo_&m!6B*| z%rHGm^vhek2TU1Pf%lT;&9(4YNysy{Nb1Lu3tm^op8E51+~P>>u2FyW<&FWXr6&98 z@9RSk`iYw4U-gq2aPb)2ZpoLb_=&T-qRBX+SZB<={-wM|@!u*+lbr6rg(kOJpP^55 zOLpqB-?RqY!(Y&SB>DT*3KSkEsr-(1cqPzxr1o1UKZp`JbC`nrwn>@-Op%FwT)MND+>FZr$lGp-G3RaYxRoy8H=uYHdm9K z2eDi@ozNSZIH&P9j88Z^IWrG$4eEE$6x>&8<{@Z!ugq9kg&QcF{TChQgbvvUu7IKT>bruVnHM;B)o6r|6yzX{DO6&+L5eq^Yn=aQ7liE zoQ6f~+pewqJbI+$Ud{H|D~4L`9L{>?Tk$uYS5DaYhPaMgP6;c1i|w)=TdhBsd8-?C z{Exf_o5zjAS)x$oKIg)2*cyWtdE46QCdItFjz!MYdQoNDmLkbl*4vdk*%nsj{~{{e zY(LV~GTS^R@JVPfBAwgm!)+p6LV4z&9q9e!WKcZ8>xp;e;3G5koBtBEZ2XRH7g+T< zW=x-+wMGw1=Y>^K3*m+&ba1D2y%Ot7WKZO#?-Fgo#`&4dl2%%6T=D7DjT7FVu1ce# ztJ_UXSZFtux=POJbCCtT)0%httnzw08o_T7mWG38SCpb$82e?j@$0MjuWC^_EWK=* zx1`xb+CJ1}oEZ2PGRk^=ug)B`t5eZOFIu^4o6qvY7=3pG!NsT9Sf@hYHd>ya9^IaX~*&}{xjDJ12I(4eI_83~vC$ECn z8I0|MFI`{Ww+l>k796CGuR;CJ_hn|yY5ZA~7k?<_>f`p{!X2yoA9;Sd;w?MatH$p* z(RO~-%$|0`{ZQu9N^WK7_2FN2gn0&Uq<=m8>SeF`2npP2&3tbC#6pvrm;6findW&i zzTxN8hkZ1U4lb8WH)a(u%wDz9dfrSn!%og=`%B{6NAK8RH#&>jWl}`D=x?E(Dy?0a zJ+T8^s697pZ5DAABJnVKZG0Tj<4Ur`H<@X^gvYl4w8f*ATr$uoCGn zWBSYT!58trT3c?K>itgU3A_C1lU4M~GG|ljrY{2gRU@WH6Wc=a5=%vdeV@q@Pkjo* zI0|b@9LiGl#2n=lSL1rDy!us)=FLB0rA5lMlr4@&+ERcjj4x^3npeKl3{oiO&U0-r!v|M{DPXEg`jfk)4M0&P>g zo&_J@s3%%F?fK-YFP`<;ty6?Eu|#NIfUI|x*X4Zt%(XQzWu@>&FQwT)AmNl5y9=S` zq~ch8-}m}S-nX1>X&zr=y{65hpT=;n1br52Ulw8;`_cG{OgxzAQ_U~UhMl3E-e9Sj zod@!CN59^*(0@PjSIxft+(~0)X(79ilH$^5$W}6%^3F^0Hx2o%KXOpnreC<(^NY3+z_WVHu&e0S7iDZreo=eCot!s zSxI@#aFe4ZEGp=1TdXygB4kNk{SNJHp?#KS#XVq2)RKR1VpRI0pkqR6KhvnEeR)yI zkxRDRKjY4&ed@e?)GlteZ_=1Qtr}|X&0G8Jnl}iXkFbQ9^X$E_L%En0yLV1W^p^jd za5T;-Z|Rk(O@4dL*$H*c&ppfm33ZMui}(NNUzIedGhIpH#rS2l#-UU8goQu(uq0Kw zB$Hv5`+Yxe2J_v7JSCq68Na=B^ASB^{6_A>0y&jt5i`wXMk}?>e3R*yT#kKF_ZAA( zMMsHPmHC)!v`6CQ4yq12tm{17aax~w*OX63aao-!ej|G)Cr9@6KBHJ98ix8g#gL;SNm{JtD3BQ@mq*C(-@Gxb4YN*XutUJ&4O%*>ro0mt5W& z^>j<~n~sQJ)*JDcHTrYPzq{Nb6WpK6ortY#H#Oby7jf&{tY{0E{P5ibLuVUgZwyhs!<{x+9CmB~Vi9$SkBdB2ij* zR53E9MIsDmMH4Ny~w#PS1*HIPxBpfqR6OH-3 z+`JRl9)0OiY3RN0=_)ox*2Jnc*jOLR3PO|1W3Z&TPzv2U9r(U#+?p8kCQ%|r;nqdr z)rDNQU^FS`; z^EmuXIs5U*uLIu>Mth&j@h~0?4(f}ClFH>g{?$XsW*pNcSM|qRqUIE9*fi-m`MGgF zzCifg;29YK?p5@ddy2~&=|+c?dje7WCMI;guNS$KS^OG3+aCKJ@H7Q~G^VdeR68W~ z!=XMMUKZxxn5a5#33@&s=Z1SWnK1jgZOO_f{N$L@wtoV9iRt+Z8v2mF$31&^H1Fpv zEp~$vg?0id_ur;`OnQd0rXW85BdzVY@e*f{_v`u=C|x!1hdy4PL?ePBC1%Ik;X z;rJH9H)VCXtYQcBZ!}>#VQ;)`VSM+I1=B+>{jIgYIc0pwD<8e22n-rgE`wchufo$|L{CSK62a<|FAgmHsz!=ZD1 zmMmxc^~MnC^PUgm&A;_jWT!%O%D+8)m7-0YzJf`?H^U8og_5hEQk{#v_tptp z>+M4hkBm#-WZdf9nLliQiRG+X)XaMI%2fs)lK0?^^gm=aNB4DA=s3T6h31>D+U9id z!`Nr6VnlP;BF#0%YwVNJkC!k1vE`y=n_ad%c_GGY_~h{luTwzCy=08h=Qf3H1Q#)E zLc@GPgcIz>5eD9*Vib}Bycd$Uk6j)<@ z0Y6QqeW{FVP61iLcbRADE4G_$j+;HGb83;Ho;SZqu%TYWelo$H7kLW5VEBA1{<`tn zCc}z`O|QquT?&%cT};hoeMNLXlU>U%gzGn7wyr!}^$-8^{>LIdy7J*E-5<>jM(fw- z(Ib8)zv!++yRi#}zO)rhjxlI@=kF`8F?Qa|@mO_15zgO7nFzI03igyb!&9L-fPbrU zmot-qGqaZFtC`#CEn%gq*(LmcZme&V7`KU)u($Mf-7`u|pOd+3XBYLNyk8TFHqZEa zYuhGw>l|HjIv76h{P16-V{QB&) zaCB}(7=l6{Bwevaqq¥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≪aOh0n>eKEPRcs+2oly_qV_t`0~^6A-xq-dYDB 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