diff --git a/.travis.yml b/.travis.yml index 3fe0e8dd5..f69de24f1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,7 +22,7 @@ android: - platform-tools # Use the desired build tools - - build-tools-25.0.2 + - build-tools-25.0.3 # Project target SDK - android-25 diff --git a/README.md b/README.md index b37f841c5..a7180772c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [![Build Status](https://travis-ci.org/bitstadium/HockeySDK-Android.svg?branch=develop)](https://travis-ci.org/bitstadium/HockeySDK-Android) [![Slack Status](https://slack.hockeyapp.net/badge.svg)](https://slack.hockeyapp.net) -## Version 4.1.3 +## Version 4.1.4 ## Introduction @@ -53,7 +53,7 @@ This document contains the following sections: ## 1. Requirements 1. We assume that you already have an Android project in Android Studio or another Android IDE. -2. The SDK runs on devices with Android 2.3 or later, but you need to build your app with Android SDK 3.0 (Level 11) or later for the integration with HockeySDK. +2. The SDK runs on devices with Android 2.3 or later, but you need to build your app with Android SDK 3.0 (Level 11) or later. ## 2. Setup @@ -75,7 +75,7 @@ Please see the "[How to create a new app](http://support.hockeyapp.net/kb/about- Add the SDK to your app module's dependencies in Android Studio by adding the following line to your `dependencies { ... }` configuration: ```groovy -compile 'net.hockeyapp.android:HockeySDK:4.1.3' +compile 'net.hockeyapp.android:HockeySDK:4.1.4' ``` @@ -314,7 +314,7 @@ If you don't want to use Gradle or Maven dependency management you can also down 4. Configure your development tools to use the .aar/.jar file. 5. In Android Studio, create a new module via `File > New > New Module` 6. Select **Import .JAR/.AAR Package** and click **Next**. -7. In the next menu select the .aar/.jar file you just copied to the libs folder. You can rename the module to whatever you want, but we in general recommend leaving it as is. If you don't rename the module, it will match the name of the .aar/.jar file, in this case **HockeySDK-4.1.3**. This way you'll quickly know which version of the SDK you are using in the future. +7. In the next menu select the .aar/.jar file you just copied to the libs folder. You can rename the module to whatever you want, but we in general recommend leaving it as is. If you don't rename the module, it will match the name of the .aar/.jar file, in this case **HockeySDK-4.1.4**. This way you'll quickly know which version of the SDK you are using in the future. 8. Make sure Android Studio added the necessary code to integrate the HockeySDK: Head over to your app's `build.gradle` to verify the dependency was added correctly. It should look like this: @@ -324,19 +324,19 @@ dependencies { //your other dependencies //... - compile project(':HockeySDK-4.1.3') + compile project(':HockeySDK-4.1.4') } ``` Next, make sure your `settings.gradle` contains the new module: ```groovy -include ':app', ':HockeySDK-4.1.3' +include ':app', ':HockeySDK-4.1.4' ``` Finally, check the `build.gradle` of the newly added module: ```groovy configurations.maybeCreate("default") -artifacts.add("default", file('HockeySDK-4.1.3.aar')) +artifacts.add("default", file('HockeySDK-4.1.4.aar')) ``` Once you have verified that everything necessary has been added, proceed with [SDK integration](#integrate-sdk). @@ -527,7 +527,7 @@ However, if you provide a custom user interface fragment for the update distribu ## 5. Documentation -Our documentation can be found on [HockeyApp](http://hockeyapp.net/help/sdk/android/4.1.3/index.html). +Our documentation can be found on [HockeyApp](http://hockeyapp.net/help/sdk/android/4.1.4/index.html). ## 6.Troubleshooting @@ -536,7 +536,7 @@ Our documentation can be found on [HockeyApp](http://hockeyapp.net/help/sdk/andr 2. Check if the `applicationId` in your `build.gradle` file matches the Bundle Identifier of the app in HockeyApp. HockeyApp accepts crashes only if both the App ID and the bundle identifier match their corresponding values in your app. Please note that the package value in your `AndroidManifest.xml` file might differ from the bundle identifier. -3. If your app crashes and you start it again, does the dialog show up which asks the user to send the crash report? If not, please crash your app again, then connect the debugger and set a break point in `CrashManager.java`'s [register](https://github.com/bitstadium/HockeySDK-Android/blob/master/src/main/java/net/hockeyapp/android/CrashManager.java#L100)-method to see why the dialog is not shown. +3. If your app crashes and you start it again, does the dialog show up which asks the user to send the crash report? If not, please crash your app again, then connect the debugger and set a break point in `CrashManager.java`'s [register](https://github.com/bitstadium/HockeySDK-Android/blob/master/src/main/java/net/hockeyapp/android/CrashManager.java#L100) method to see why the dialog is not shown. 4. If you continue to encouter issues, please [contact us](http://support.hockeyapp.net/discussion/new). diff --git a/build.gradle b/build.gradle index a05e20ea6..0a6d7a4ec 100644 --- a/build.gradle +++ b/build.gradle @@ -35,14 +35,14 @@ allprojects { ext { ARTIFACT_ID = 'HockeySDK' - VERSION_NAME = '4.1.3' - VERSION_CODE = 10 + VERSION_NAME = '4.1.4' + VERSION_CODE = 11 SITE_URL = 'https://github.com/bitstadium/hockeysdk-android' GIT_URL = 'https://github.com/bitstadium/HockeySDK-Android.git' BINTRAY_USER = HOCKEYAPP_BINTRAY_USER GROUP_NAME = 'net.hockeyapp.android' COMPILE_SDK = 25 - BUILD_TOOLS = '25.0.2' + BUILD_TOOLS = '25.0.3' IS_UPLOADING = project.getGradle().startParameter.taskNames.any{it.contains('bintrayUpload')} DESCRIPTION = 'HockeySDK-Android implements support for using HockeyApp in your Android application. The following features are currently supported:\n' + '\n' + diff --git a/hockeysdk/build.gradle b/hockeysdk/build.gradle index 20579ea34..b1eb6c93a 100644 --- a/hockeysdk/build.gradle +++ b/hockeysdk/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.library' apply plugin: 'com.novoda.bintray-release' // must be applied after your artifact generating plugin (eg. java / com.android.library) -def supportLibVersion = "25.2.0" +def supportLibVersion = "25.3.1" android { compileSdkVersion COMPILE_SDK diff --git a/hockeysdk/src/main/java/net/hockeyapp/android/CrashManager.java b/hockeysdk/src/main/java/net/hockeyapp/android/CrashManager.java index 752c45758..86c6e4a49 100644 --- a/hockeysdk/src/main/java/net/hockeyapp/android/CrashManager.java +++ b/hockeysdk/src/main/java/net/hockeyapp/android/CrashManager.java @@ -79,12 +79,23 @@ public class CrashManager { */ public static void register(Context context) { String appIdentifier = Util.getAppIdentifier(context); - if (TextUtils.isEmpty(appIdentifier)) { - throw new IllegalArgumentException("HockeyApp app identifier was not configured correctly in manifest or build configuration."); - } register(context, appIdentifier); } + /** + * Registers new crash manager and handles existing crash logs. + * HockeyApp App Identifier is read from configuration values in AndroidManifest.xml + * + * @param context The context to use. Usually your Activity object. If + * context is not an instance of Activity (or a subclass of it), + * crashes will be sent automatically. + * @param listener Implement for callback functions. + */ + public static void register(Context context, CrashManagerListener listener) { + String appIdentifier = Util.getAppIdentifier(context); + register(context, appIdentifier, listener); + } + /** * Registers new crash manager and handles existing crash logs. If * context is not an instance of Activity (or a subclass of it), @@ -575,6 +586,9 @@ private static void sendCrashes(final WeakReference weakContext, final Context ctx = weakContext.get(); if (ctx != null && !Util.isConnectedToNetwork(ctx)) { // Not connected to network, not trying to submit stack traces + if(listener != null) { + listener.onCrashesNotSent(); + } return; } diff --git a/hockeysdk/src/main/java/net/hockeyapp/android/FeedbackActivity.java b/hockeysdk/src/main/java/net/hockeyapp/android/FeedbackActivity.java index 477b250c1..6a4368257 100644 --- a/hockeysdk/src/main/java/net/hockeyapp/android/FeedbackActivity.java +++ b/hockeysdk/src/main/java/net/hockeyapp/android/FeedbackActivity.java @@ -58,7 +58,6 @@ *

Description

* * Activity to show the feedback form. - * **/ public class FeedbackActivity extends Activity implements OnClickListener { @@ -496,6 +495,8 @@ protected void configureFeedbackView(boolean haveToken) { mSubjectInput = (EditText) findViewById(R.id.input_subject); mTextInput = (EditText) findViewById(R.id.input_message); + configureHints(); + /** Check to see if the Name and Email are saved in {@link SharedPreferences} */ if (!mFeedbackViewInitialized) { String nameEmailSubject = PrefsUtil.getInstance().getNameEmailFromPrefs(mContext); @@ -596,6 +597,17 @@ private boolean addAttachment(int request) { } else return false; } + private void configureHints() { + if (FeedbackManager.getRequireUserName() == FeedbackUserDataElement.REQUIRED) { + mNameInput.setHint(getString(R.string.hockeyapp_feedback_name_hint_required)); + } + if (FeedbackManager.getRequireUserEmail() == FeedbackUserDataElement.REQUIRED) { + mEmailInput.setHint(getString(R.string.hockeyapp_feedback_email_hint_required)); + } + mSubjectInput.setHint(getString(R.string.hockeyapp_feedback_subject_hint_required)); + mTextInput.setHint(getString(R.string.hockeyapp_feedback_message_hint_required)); + } + private void configureAppropriateView() { /** Try to retrieve the Feedback Token from {@link SharedPreferences} */ if (!mForceNewThread || mInSendFeedback) { @@ -671,6 +683,7 @@ public void run() { try { date = format.parse(mFeedbackMessages.get(0).getCreatedAt()); mLastUpdatedTextView.setText(String.format(getString(R.string.hockeyapp_feedback_last_updated_text), formatNew.format(date))); + mLastUpdatedTextView.setContentDescription(mLastUpdatedTextView.getText()); mLastUpdatedTextView.setVisibility(View.VISIBLE); } catch (ParseException e1) { e1.printStackTrace(); diff --git a/hockeysdk/src/main/java/net/hockeyapp/android/FeedbackManager.java b/hockeysdk/src/main/java/net/hockeyapp/android/FeedbackManager.java index 10f364f1f..afa821514 100644 --- a/hockeysdk/src/main/java/net/hockeyapp/android/FeedbackManager.java +++ b/hockeysdk/src/main/java/net/hockeyapp/android/FeedbackManager.java @@ -105,12 +105,21 @@ public class FeedbackManager { */ public static void register(Context context) { String appIdentifier = Util.getAppIdentifier(context); - if (appIdentifier == null || appIdentifier.length() == 0) { - throw new IllegalArgumentException("HockeyApp app identifier was not configured correctly in manifest or build configuration."); - } register(context, appIdentifier); } + /** + * Registers new Feedback manager. + * HockeyApp App Identifier is read from configuration values in AndroidManifest.xml + * + * @param context The context to use. Usually your Activity object. + * @param listener Implement for callback functions. + */ + public static void register(Context context, FeedbackManagerListener listener) { + String appIdentifier = Util.getAppIdentifier(context); + register(context, appIdentifier, listener); + } + /** * Registers new Feedback manager. * diff --git a/hockeysdk/src/main/java/net/hockeyapp/android/LoginManager.java b/hockeysdk/src/main/java/net/hockeyapp/android/LoginManager.java index 0e860e334..26840b4f9 100644 --- a/hockeysdk/src/main/java/net/hockeyapp/android/LoginManager.java +++ b/hockeysdk/src/main/java/net/hockeyapp/android/LoginManager.java @@ -95,20 +95,32 @@ public class LoginManager { */ public static void register(final Context context, String appSecret, int mode) { String appIdentifier = Util.getAppIdentifier(context); - if (TextUtils.isEmpty(appIdentifier)) { - throw new IllegalArgumentException("HockeyApp app identifier was not configured correctly in manifest or build configuration."); - } register(context, appIdentifier, appSecret, mode, (Class) null); } + /** + * Registers new login manager. + * HockeyApp App Identifier is read from configuration values in AndroidManifest.xml. + * + * @param context The context to use. Usually your Activity object. Has to be + * of class Activity or subclass for interactive login. + * @param appSecret The App Secret of your app on HockeyApp. + * @param mode The login mode to use. + * @param listener Instance of LoginListener + */ + public static void register(final Context context, String appSecret, int mode, LoginManagerListener listener) { + String appIdentifier = Util.getAppIdentifier(context); + register(context, appIdentifier, appSecret, mode, listener); + } + /** * Registers new LoginManager. * - * @param context the context to use. Usually your Activity object. - * @param appIdentifier the App ID of your app on HockeyApp. - * @param appSecret the App Secret of your app on HockeyApp. - * @param mode the login mode. - * @param listener instance of LoginListener + * @param context The context to use. Usually your Activity object. + * @param appIdentifier The App ID of your app on HockeyApp. + * @param appSecret The App Secret of your app on HockeyApp. + * @param mode The login mode. + * @param listener Instance of LoginListener */ public static void register(final Context context, String appIdentifier, String appSecret, int mode, LoginManagerListener listener) { LoginManager.listener = listener; diff --git a/hockeysdk/src/main/java/net/hockeyapp/android/UpdateActivity.java b/hockeysdk/src/main/java/net/hockeyapp/android/UpdateActivity.java index 9ce66fe3c..437bf5093 100644 --- a/hockeysdk/src/main/java/net/hockeyapp/android/UpdateActivity.java +++ b/hockeysdk/src/main/java/net/hockeyapp/android/UpdateActivity.java @@ -223,6 +223,7 @@ public void onClick(View v) { protected void configureView() { TextView nameLabel = (TextView) findViewById(R.id.label_title); nameLabel.setText(getAppName()); + nameLabel.setContentDescription(getAppName()); final TextView versionLabel = (TextView) findViewById(R.id.label_version); final String versionString = "Version " + mVersionHelper.getVersionString(); @@ -240,6 +241,7 @@ public void downloadSuccessful(DownloadFileTask task) { long appSize = ((GetFileSizeTask) task).getSize(); String appSizeString = String.format(Locale.US, "%.2f", appSize / (1024.0f * 1024.0f)) + " MB"; versionLabel.setText(getString(R.string.hockeyapp_update_version_details_label, versionString, fileDate, appSizeString)); + versionLabel.setContentDescription(versionLabel.getText()); } } }); diff --git a/hockeysdk/src/main/java/net/hockeyapp/android/UpdateManager.java b/hockeysdk/src/main/java/net/hockeyapp/android/UpdateManager.java index 6af871f1e..fb466d7b8 100644 --- a/hockeysdk/src/main/java/net/hockeyapp/android/UpdateManager.java +++ b/hockeysdk/src/main/java/net/hockeyapp/android/UpdateManager.java @@ -46,12 +46,21 @@ public class UpdateManager { */ public static void register(Activity activity) { String appIdentifier = Util.getAppIdentifier(activity); - if (TextUtils.isEmpty(appIdentifier)) { - throw new IllegalArgumentException("HockeyApp app identifier was not configured correctly in manifest or build configuration."); - } register(activity, appIdentifier); } + /** + * Registers new update manager. + * HockeyApp app identifier is read from AndroidManifest.xml. + * + * @param activity The parent activity to return to. + * @param listener Implement for callback functions. + */ + public static void register(Activity activity, UpdateManagerListener listener) { + String appIdentifier = Util.getAppIdentifier(activity); + register(activity, appIdentifier, listener); + } + /** * Registers new update manager. * diff --git a/hockeysdk/src/main/java/net/hockeyapp/android/metrics/Sender.java b/hockeysdk/src/main/java/net/hockeyapp/android/metrics/Sender.java index 4c6e753dd..294f15145 100644 --- a/hockeysdk/src/main/java/net/hockeyapp/android/metrics/Sender.java +++ b/hockeysdk/src/main/java/net/hockeyapp/android/metrics/Sender.java @@ -138,10 +138,10 @@ protected void sendAvailableFiles() { protected void send(HttpURLConnection connection, File file, String persistedData) { // TODO Why does this get the file and persistedData reference, even though everything is in the connection? // TODO Looks like this will have to be rewritten for its own AsyncTask subclass. - logRequest(connection, persistedData); if (connection != null && file != null && persistedData != null) { - mRequestCount.getAndIncrement(); try { + mRequestCount.getAndIncrement(); + logRequest(connection, persistedData); // Starts the query connection.connect(); // read the response code while we're ready to catch the IO exception @@ -149,13 +149,21 @@ protected void send(HttpURLConnection connection, File file, String persistedDat // process the response onResponse(connection, responseCode, persistedData, file); } catch (IOException e) { - //Probably offline - HockeyLog.debug(TAG, "Couldn't send data with IOException: " + e.toString()); + // Probably offline + HockeyLog.debug(TAG, "Couldn't send data with " + e.toString()); mRequestCount.getAndDecrement(); if (this.getPersistence() != null) { HockeyLog.debug(TAG, "Persisting because of IOException: We're probably offline."); this.getPersistence().makeAvailable(file); //send again later } + } catch (SecurityException e) { + // Permission denied + HockeyLog.debug(TAG, "Couldn't send data with " + e.toString()); + mRequestCount.getAndDecrement(); + if (this.getPersistence() != null) { + HockeyLog.debug(TAG, "Persisting because of SecurityException: Missing INTERNET permission or the user might have removed the internet permission."); + this.getPersistence().makeAvailable(file); //send again later + } } } } @@ -309,11 +317,11 @@ protected void onUnexpected(HttpURLConnection connection, int responseCode, Stri * @param connection the connection * @param payload the payload of telemetry data */ - private void logRequest(HttpURLConnection connection, String payload) { + private void logRequest(HttpURLConnection connection, String payload) throws IOException, SecurityException { // TODO Rename this to reflect the true nature of this method: Sending the payload Writer writer = null; try { - if ((connection != null) && (payload != null)) { + if (connection != null && payload != null) { HockeyLog.debug(TAG, "Sending payload:\n" + payload); HockeyLog.debug(TAG, "Using URL:" + connection.getURL().toString()); //the following 3 lines actually appends the payload to the connection @@ -321,8 +329,6 @@ private void logRequest(HttpURLConnection connection, String payload) { writer.write(payload); writer.flush(); } - } catch (IOException e) { - HockeyLog.debug(TAG, "Couldn't log data with: " + e.toString()); } finally { if (writer != null) { try { diff --git a/hockeysdk/src/main/java/net/hockeyapp/android/metrics/TelemetryContext.java b/hockeysdk/src/main/java/net/hockeyapp/android/metrics/TelemetryContext.java index 5d9bc027e..62803bdfa 100644 --- a/hockeysdk/src/main/java/net/hockeyapp/android/metrics/TelemetryContext.java +++ b/hockeysdk/src/main/java/net/hockeyapp/android/metrics/TelemetryContext.java @@ -161,23 +161,11 @@ protected void configApplicationContext() { // App version String version = "unknown"; mPackageName = ""; - - try { - final PackageManager manager = mContext.getPackageManager(); - final PackageInfo info = manager - .getPackageInfo(mContext.getPackageName(), 0); - - if (info.packageName != null) { - mPackageName = info.packageName; - } - - String appBuild = Integer.toString(info.versionCode); - version = String.format("%s (%S)", info.versionName, appBuild); - } catch (PackageManager.NameNotFoundException e) { - HockeyLog.debug(TAG, "Could not get application context"); - } finally { - setAppVersion(version); + if (Constants.APP_PACKAGE != null) { + mPackageName = Constants.APP_PACKAGE; } + version = String.format("%s (%S)", Constants.APP_VERSION_NAME, Constants.APP_VERSION); + setAppVersion(version); // Hockey SDK version String sdkVersionString = BuildConfig.VERSION_NAME; diff --git a/hockeysdk/src/main/java/net/hockeyapp/android/utils/Util.java b/hockeysdk/src/main/java/net/hockeyapp/android/utils/Util.java index 4ae4785f4..59bbd99ef 100644 --- a/hockeysdk/src/main/java/net/hockeyapp/android/utils/Util.java +++ b/hockeysdk/src/main/java/net/hockeyapp/android/utils/Util.java @@ -236,7 +236,11 @@ private static Notification buildNotificationWithBuilder(Context context, Pendin * @return the HockeyApp AppIdentifier */ public static String getAppIdentifier(Context context) { - return getManifestString(context, APP_IDENTIFIER_KEY); + String appIdentifier = getManifestString(context, APP_IDENTIFIER_KEY); + if (TextUtils.isEmpty(appIdentifier)) { + throw new IllegalArgumentException("HockeyApp app identifier was not configured correctly in manifest or build configuration."); + } + return appIdentifier; } /** @@ -264,10 +268,15 @@ private static Bundle getBundle(Context context) { } public static boolean isConnectedToNetwork(Context context) { - ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); - if (connectivityManager != null) { - NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo(); - return activeNetwork != null && activeNetwork.isConnected(); + try { + ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); + if (connectivityManager != null) { + NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo(); + return activeNetwork != null && activeNetwork.isConnected(); + } + } catch (Exception e) { + HockeyLog.error("Exception thrown when check network is connected:"); + e.printStackTrace(); } return false; } diff --git a/hockeysdk/src/main/java/net/hockeyapp/android/views/AttachmentView.java b/hockeysdk/src/main/java/net/hockeyapp/android/views/AttachmentView.java index 005fb840a..31d2a7254 100644 --- a/hockeysdk/src/main/java/net/hockeyapp/android/views/AttachmentView.java +++ b/hockeysdk/src/main/java/net/hockeyapp/android/views/AttachmentView.java @@ -79,6 +79,7 @@ public AttachmentView(Context context, ViewGroup parent, Uri attachmentUri, bool initializeView(context, removable); mTextView.setText(mFilename); + mTextView.setContentDescription(mFilename); new AsyncTask() { @Override protected Bitmap doInBackground(Void... args) { @@ -112,6 +113,7 @@ public AttachmentView(Context context, ViewGroup parent, FeedbackAttachment atta mOrientation = ImageUtils.ORIENTATION_PORTRAIT; mTextView.setText(R.string.hockeyapp_feedback_attachment_loading); + mTextView.setContentDescription(mTextView.getText()); configureViewForPlaceholder(false); } diff --git a/hockeysdk/src/main/java/net/hockeyapp/android/views/FeedbackMessageView.java b/hockeysdk/src/main/java/net/hockeyapp/android/views/FeedbackMessageView.java index 742e5f5b8..443b73be7 100644 --- a/hockeysdk/src/main/java/net/hockeyapp/android/views/FeedbackMessageView.java +++ b/hockeysdk/src/main/java/net/hockeyapp/android/views/FeedbackMessageView.java @@ -61,12 +61,15 @@ public void setFeedbackMessage(FeedbackMessage feedbackMessage) { try { Date date = DATE_FORMAT_IN.parse(mFeedbackMessage.getCreatedAt()); mDateTextView.setText(DATE_FORMAT_OUT.format(date)); + mDateTextView.setContentDescription(DATE_FORMAT_OUT.format(date)); } catch (ParseException e) { e.printStackTrace(); } mAuthorTextView.setText(mFeedbackMessage.getName()); + mAuthorTextView.setContentDescription(mFeedbackMessage.getName()); mMessageTextView.setText(mFeedbackMessage.getText()); + mMessageTextView.setContentDescription(mFeedbackMessage.getText()); mAttachmentListView.removeAllViews(); for (FeedbackAttachment feedbackAttachment : mFeedbackMessage.getFeedbackAttachments()) { diff --git a/hockeysdk/src/main/res/layout-land/hockeyapp_activity_update.xml b/hockeysdk/src/main/res/layout-land/hockeyapp_activity_update.xml index 0f10daf2b..2a4574466 100644 --- a/hockeysdk/src/main/res/layout-land/hockeyapp_activity_update.xml +++ b/hockeysdk/src/main/res/layout-land/hockeyapp_activity_update.xml @@ -61,6 +61,7 @@ android:background="@drawable/hockeyapp_btn_background" android:minWidth="120dp" android:text="@string/hockeyapp_update_button" + android:contentDescription="@string/hockeyapp_update_button" android:textColor="@color/hockeyapp_text_white" android:textSize="16sp"/> diff --git a/hockeysdk/src/main/res/layout/hockeyapp_activity_feedback.xml b/hockeysdk/src/main/res/layout/hockeyapp_activity_feedback.xml index 131672611..9d11fadbb 100644 --- a/hockeysdk/src/main/res/layout/hockeyapp_activity_feedback.xml +++ b/hockeysdk/src/main/res/layout/hockeyapp_activity_feedback.xml @@ -65,7 +65,8 @@ style="@style/HockeyApp.ButtonStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/hockeyapp_feedback_attachment_button_text" /> + android:text="@string/hockeyapp_feedback_attachment_button_text" + android:contentDescription="@string/hockeyapp_feedback_attachment_button_text"/>