Git Product home page Git Product logo

edx-app-android's Introduction

Warning

This is repository is scheduled for deprecation and removal, please use this instead.

edX Android

Get it on Google Play

This is the source code for the edX mobile Android app. It is changing rapidly and its structure should not be relied upon. See http://code.edx.org for other parts of the edX code base.

It has been tested with the "Koa" release of open edX and may not function correctly with previous versions. See https://openedx.atlassian.net/wiki/display/COMM/Open+edX+Releases for more information.

License

This software is licensed under version 2 of the Apache License unless otherwise noted. Please see LICENSE.txt for details.

Building

This project is meant to be built using Android Studio. It can also be built from the gradle command line.

  1. Check out the source code:

     git clone https://github.com/openedx/edx-app-android
    
  2. Setup the Android Studio. The latest tested Android Studio version is Flamingo | 2022.2.1 Patch 2, you can download it from the previous versions archive.

  3. Open Android Studio and choose Open an Existing Android Studio Project

  4. Choose edx-app-android.

  5. Click the Run button.

Configuration

The edX mobile Android app is designed to connect to an Open edX instance. You must configure the app with the correct server address and supply appropriate OAuth credentials. We use a configuration file mechanism similar to that of the Open edX platform. This mechanism is also used to make other values available to the app at runtime and store secret keys for third party services.

There is a default configuration that points to an edX devstack instance running on localhost. See the default_config directory. For the default configuration to work, you must add OAuth credentials specific to your installation.

Setup

To use a custom configuration in place of the default configuration, you will need to complete these tasks:

  1. Create your own configuration directory somewhere else on the file system. For example, create my_config as a sibling of the edx-app-android repository.

  2. Create an edx.properties file inside the OpenEdXMobile directory of edx-app-android. In this edx.properties file, set the edx.dir property to the path to your configuration directory relative to the OpenEdXMobile directory. For example, if I stored my configuration side by side with the edx-app-android repository at my_config then I'd have the following edx.properties:

     edx.dir = '../../my_config'
    
  3. In the configuration directory that you added in step 1, create another edx.properties file. This properties file contains a list of filenames. The files should be in YAML format and are for storing specific keys. These files are specified relative to the configuration directory. Keys in files earlier in the list will be overridden by keys from files later in the list. For example, if I had two files, one shared between ios and android called shared.yaml and one with Android specific keys called android.yaml, I would have the following edx.properties:

    edx.android {
        configFiles = ['shared.yaml', 'android.yaml']
    }
    

The full set of known keys can be found in the org/edx/mobile/util/Config.java file or see additional documentation.

Build Variants

There are 3 Build Variants in this project:

  • prodDebug: Uses prod flavor for debug builds.
  • prodDebuggable: Uses prod flavor for debug builds with debugging enabled.
  • prodRelease: Uses prod flavor for release builds that'll work on devices with Android 5.0.x (Lollipop) and above.

Building For Release

To build an APK for release, you have to specify an application ID and signing key.

Specifying your own Application ID

Application ID is the package identifier for your app.
Edit the constants.gradle file inside the edx-app-android directory. For example:

APPLICATION_ID=com.example.yourapp

Specifying the Signing Key

Place your keystore file inside the OpenEdXMobile/signing directory of edx-app-android & then create a keystore.properties file inside the same directory with the following configurations:

RELEASE_STORE_FILE=signing/your_keystore_file.keystore
RELEASE_STORE_PASSWORD=your store password here
RELEASE_KEY_PASSWORD=your key password here
RELEASE_KEY_ALIAS=your key alias here

Now you can build a release build from Android Studio. Or, in the directory of edx-app-android you can build a release build with this gradle command:

./gradlew assembleProdRelease

Note: For release branch naming convention take a look at this PR #774 that creates the versionCode automatically based on branch name. The output APK will be named with the version.

Customization

Resources

To customize images, colors, and layouts, you can specify a custom resource directory. Create or edit the gradle.properties file inside the OpenEdXMobile directory of edx-app-android. For example:

RES_DIR = ../../path/to/your/res

Any resources placed here will override resources of the same name in the OpenEdXMobile/res directory.

To remove all edX branding, override the drawables for: edx_logo, edx_logo_login, ic_launcher, ic_new_cert, and profile_photo_placeholder. These come in a number of resolutions, be sure to replace them all.

If you need to make more in depth UI changes, most of the user interface is specified in standard Android XML files, which you can also override by placing new versions in your RES_DIR.

Assets

To customize assets such as the End User License Agreement (EULA) you can specify a custom assets directory. Create or edit the gradle.properties file inside the OpenEdXMobile directory of edx-app-android. For example:

ASSETS = ../../path/to/your/assets

Any assets placed here will override resources of the same name in the OpenEdXMobile/assets directory.

Third Party Services

The app relies on the presence of several third party services: Facebook, Google+, SegmentIO, and Crashlytics. You may need to remove services you choose not to use. You can comment out the lines of code that mention these services.

We're working on making it easier for Open edX installations to apply customizations and select third party services without modifying the repository itself.

Frequently Asked Questions

Q: I want to use Firebase in my project, where do I place my google-services.json file?

A: You don’t need to place the google-services.json into the project, we are generating it through gradle script (AndroidHelper.gradle) that picks keys and values required in the google-services.json file from the app's configuration file. For configuration details see

edx-app-android's People

Contributors

1zaman avatar adzuci avatar ahmad-hsn avatar aleffert avatar bilalawan321 avatar brianguertin avatar dependabot[bot] avatar e0d avatar estute avatar farhan avatar farhan-arshad-dev avatar feanil avatar hamzaisrar12 avatar hanningni avatar iamjazzar avatar ian2012 avatar jeffxtang avatar jlim6329 avatar kdmccormick avatar mdinino avatar miankhalid avatar mikekatz avatar omerhabib26 avatar rohan-dhamal-clarice avatar saeedbashir avatar sarina avatar shahidtamboli avatar swapnali-clarice avatar syedimranhassan avatar tlindaliu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

edx-app-android's Issues

How to integrate Find Courses Module in Android ?

Hi ,

I am new to openedx and is trying to integrate the Find Courses module. At Android end, it seems link the custom web view is opened for FindCoursesActivity with the url which is from the config file with the Tag "COURSE_SEARCH_URL". Can you tell me the url that i need to pass in the following Tag value
or if i had to create a native Find Courses Module at Android end . Do we have the REST APIs for Find Courses and CourseDetails .
Thanks in Advance

Data on SD card

I am prefacing my comment with the fact that I am a general consumer.

The edx videos can take up A LOT of data, so is there a way to save these to the SD card? This would mean that large videos wouldn't take up all the internal storage.

Updated course contents not shown

It seems like that edx android app does not refresh itself when course contents is added or updated from the studio (New sections, subsections for example). To force refreshing, the app is needed to be unloaded from task manager or the user enters another course and reenter the updated course. When the app is resides on memory and the user is clicking one course only, there is no way to get the updated contents.
The IOS app shows the updated contents correctly within 1 hour.
(In the manual, the contents in the app is refreshed within 1 hour after the course contents update.)

Cant login /Cant create user

Hi Team,
I am building the openedx android app,I face issues while trying login and create new user.Below are the errors I got from android studio.Note I followed http://edx.readthedocs.io/projects/edx-installing-configuring-and-running/en/latest/mobile.html for implementation .Can you please help?

05-02 08:53:15.105 2493-2493/org.edx.mobile E/org.edx.mobile.util.images.ErrorUtils: java.lang.IllegalArgumentException: Unexpected char 0xe9 at 89 in User-Agent value: Dalvik/2.1.0 (Linux; U; Android 5.1.1; Android SDK built for x86_64 Build/LMY48X) /org.edx.mobile/2.6.0
at okhttp3.Headers$Builder.checkNameAndValue(Headers.java:283)
at okhttp3.Headers$Builder.set(Headers.java:263)
at okhttp3.Request$Builder.header(Request.java:165)
at org.edx.mobile.http.interceptor.UserAgentInterceptor.intercept(UserAgentInterceptor.java:22)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187)
at org.edx.mobile.http.interceptor.JsonMergePatchInterceptor.intercept(JsonMergePatchInterceptor.java:30)
at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160)
at okhttp3.RealCall.execute(RealCall.java:57)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:89)
at org.edx.mobile.authentication.LoginAPI.register(LoginAPI.java:180)
at org.edx.mobile.authentication.LoginAPI.registerUsingEmail(LoginAPI.java:153)
at org.edx.mobile.task.RegisterTask.call(RegisterTask.java:37)
at org.edx.mobile.task.RegisterTask.call(RegisterTask.java:13)
at roboguice.util.SafeAsyncTask$SafeAsyncTaskAndroidCallable.doInBackground(SafeAsyncTask.java:163)
at roboguice.util.AndroidCallableWrapper.doDoInBackgroundThread(AndroidCallableWrapper.java:113)
at roboguice.util.AndroidCallableWrapper.run(AndroidCallableWrapper.java:41)
at roboguice.util.AndroidCallable.run(AndroidCallable.java:20)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
at dalvik.system.VMStack.getThreadStackTrace(Native Method)
at java.lang.Thread.getStackTrace(Thread.java:580)
at roboguice.util.AndroidCallable.(AndroidCallable.java:12)
at roboguice.util.SafeAsyncTask$SafeAsyncTaskAndroidCallable.(SafeAsyncTask.java:160)
at roboguice.util.SafeAsyncTask.newTask(SafeAsyncTask.java:156)
at roboguice.util.SafeAsyncTask.future(SafeAsyncTask.java:66)
at roboguice.util.SafeAsyncTask.execute(SafeAsyncTask.java:94)
at roboguice.util.SafeAsyncTask.execute(SafeAsyncTask.java:90)
at org.edx.mobile.view.RegisterActivity.createAccount(RegisterActivity.java:334)
at org.edx.mobile.view.RegisterActivity.access$000(RegisterActivity.java:59)
at org.edx.mobile.view.RegisterActivity$1.onClick(RegisterActivity.java:124)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

org.edx.mobile.module.db.impl.DbOperationBase: java.lang.IllegalArgumentException: the bind value at index 1 is null

hi
I'm sorry to bother again. --__--#.
i find a issue,when i use network to request some data .In my logcat have very mach err Log :
like this :

05-19 16:03:26.444 21343-21343/org.edx.mobile D/org.edx.mobile.util.NetworkUtil: Wifi is connected 05-19 16:03:26.448 21343-21343/org.edx.mobile E/org.edx.mobile.module.db.impl.DbOperationBase: java.lang.IllegalArgumentException: the bind value at index 1 is null at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:169) at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:205) at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47) at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1344) at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1186) at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1057) at com.newrelic.agent.android.instrumentation.SQLiteInstrumentation.query(SQLiteInstrumentation.java:25) at org.edx.mobile.module.db.impl.DbOperationSelect.getCursor(DbOperationSelect.java:29) at org.edx.mobile.module.db.impl.DbOperationExists.execute(DbOperationExists.java:15) at org.edx.mobile.module.db.impl.DbOperationExists.execute(DbOperationExists.java:6) at org.edx.mobile.module.db.impl.DbOperationBase.requestExecute(DbOperationBase.java:25) at org.edx.mobile.module.db.impl.IDatabaseBaseImpl.execute(IDatabaseBaseImpl.java:56) at org.edx.mobile.module.db.impl.IDatabaseBaseImpl.enqueue(IDatabaseBaseImpl.java:74) at org.edx.mobile.module.db.impl.IDatabaseImpl.enqueue(IDatabaseImpl.java:21) at org.edx.mobile.module.db.impl.IDatabaseImpl.isAnyVideoDownloading(IDatabaseImpl.java:51) at org.edx.mobile.base.BaseVideosDownloadStateActivity$2.run(BaseVideosDownloadStateActivity.java:42) at android.os.Handler.handleCallback(Handler.java:743) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:150) at android.app.ActivityThread.main(ActivityThread.java:5546) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684) 05-19 16:03:26.452 21343-21343/org.edx.mobile D/org.edx.mobile.util.NetworkUtil: Wifi is connected
image

Gradle Sync

Error:Execution failed for task ':OpenEdXMobile:transformClassesWithJarMergingForProdRelease'. > com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com/segment/analytics/Analytics$1.class

help me

sdk not found

i just begin working with android and i clone this project and this error shows up :
"Error:SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable."
but when i create a new project or open my own project it works fine

Distribute app on F-droid

Hi, would you consider adding the app to the F-Droid store? See here for how to do that. One key requirement is having no proprietary dependencies like google play services or analytics

Direct APK Download on EDX

Dear app authors,

not everyone is using appstore and google services generally.

It would be very convenient to have a direct download on Edx or here.

Could you, please, be so kind and give a link to a recent stable apk?

BUILD FAILED

When i start android studio, i get this error during build up
Error:Execution failed for task ':buildSrc:plugins/edx-app-gradle-plugin:compileGroovy'.

ANY HELP ??

mobile app and Insights

Hello.
We are using open edx mobile app and Insights.
But I understand that the actions on mobile app related with video or board are not reflected on Insights.

So is there any plan to fix it?

I am always grateful for your works.

Unknown error in Native Find Courses

Hello,

I tried to use the Native Find Courses activity, but I got a 403 response. I also tried to curl /api/courses/v1/courses/?username=staff&mobile=true&page=1 using command line with the provided Authorization: Bearer f7a30affaa193813354137eb47c59cb3f9ac974e, but the same thing happened. However, it works perfectly in the website. Any recommendations?

Here's the logs:

05-10 14:30:04.328 30710-30710/org.edx.mobile D/org.edx.mobile.view.NativeFindCoursesActivity: created
05-10 14:30:04.390 30710-30880/org.edx.mobile W/EGL_emulation: eglSurfaceAttrib not implemented
05-10 14:30:04.390 30710-30880/org.edx.mobile W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x9e833160, error=EGL_SUCCESS
05-10 14:30:04.448 30710-30710/org.edx.mobile D/org.edx.mobile.util.NetworkUtil: Mobile data is connected
05-10 14:30:04.459 30710-17647/org.edx.mobile D/OkHttp: --> GET http://localhost:8000/api/courses/v1/courses/?username=staff&mobile=true&page=1 HTTP/1.1
05-10 14:30:04.459 30710-17647/org.edx.mobile D/OkHttp: User-Agent: Dalvik/2.1.0 (Linux; U; Android 6.0; Android SDK built for x86 Build/MASTER) edx/org.edx.mobile/0.7.8
05-10 14:30:04.459 30710-17647/org.edx.mobile D/OkHttp: Authorization: Bearer f7a30affaa193813354137eb47c59cb3f9ac974e
05-10 14:30:04.459 30710-17647/org.edx.mobile D/OkHttp: --> END GET
05-10 14:30:04.618 30710-30716/org.edx.mobile W/art: Suspending all threads took: 53.842ms
05-10 14:30:04.634 30710-30880/org.edx.mobile E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa0ac2e70
05-10 14:30:04.673 30710-30720/org.edx.mobile I/art: Background sticky concurrent mark sweep GC freed 47791(2MB) AllocSpace objects, 3(376KB) LOS objects, 25% free, 8MB/11MB, paused 8.031ms total 204.170ms
05-10 14:30:04.680 30710-17647/org.edx.mobile D/OkHttp: <-- 403 FORBIDDEN http://localhost:8000/api/courses/v1/courses/?username=staff&mobile=true&page=1 (220ms)
05-10 14:30:04.680 30710-17647/org.edx.mobile D/OkHttp: Allow: GET, HEAD, OPTIONS
05-10 14:30:04.680 30710-17647/org.edx.mobile D/OkHttp: Content-Language: ar
05-10 14:30:04.680 30710-17647/org.edx.mobile D/OkHttp: Content-Type: application/json
05-10 14:30:04.680 30710-17647/org.edx.mobile D/OkHttp: Date: Tue, 10 May 2016 11:30:48 GMT
05-10 14:30:04.680 30710-17647/org.edx.mobile D/OkHttp: Server: nginx
05-10 14:30:04.680 30710-17647/org.edx.mobile D/OkHttp: Set-Cookie: sessionid=wfng21dv3woz2rqrlh15mj72btjlvi2v; Domain=.edxbeta.org; expires=Tue, 24-May-2016 11:30:48 GMT; httponly; Max-Age=1209600; Path=/; secure
05-10 14:30:04.680 30710-17647/org.edx.mobile D/OkHttp: Vary: Accept-Encoding
05-10 14:30:04.680 30710-17647/org.edx.mobile D/OkHttp: Vary: Accept, Accept-Language, Cookie
05-10 14:30:04.680 30710-17647/org.edx.mobile D/OkHttp: X-Frame-Options: SAMEORIGIN
05-10 14:30:04.680 30710-17647/org.edx.mobile D/OkHttp: Connection: keep-alive
05-10 14:30:04.681 30710-17647/org.edx.mobile D/OkHttp: OkHttp-Sent-Millis: 1462879804460
05-10 14:30:04.681 30710-17647/org.edx.mobile D/OkHttp: OkHttp-Received-Millis: 1462879804679
05-10 14:30:04.681 30710-17647/org.edx.mobile D/OkHttp: {"detail":"You do not have permission to perform this action."}
05-10 14:30:04.681 30710-17647/org.edx.mobile D/OkHttp: <-- END HTTP (79-byte body)
05-10 14:30:04.681 30710-17647/org.edx.mobile W/org.edx.mobile.http.RetroHttpExceptionHandler: url = http://localhost:8000/api/courses/v1/courses/?username=staff&mobile=true&page=1
05-10 14:30:04.683 30710-17647/org.edx.mobile W/org.edx.mobile.http.RetroHttpExceptionHandler: kind = HTTP
05-10 14:30:04.683 30710-17647/org.edx.mobile W/org.edx.mobile.http.RetroHttpExceptionHandler: body = {"detail":"You do not have permission to perform this action."}
05-10 14:30:04.683 30710-17647/org.edx.mobile W/org.edx.mobile.http.RetroHttpExceptionHandler: status and reason = 403:FORBIDDEN
05-10 14:30:04.683 30710-30710/org.edx.mobile E/org.edx.mobile.util.images.ErrorUtils: org.edx.mobile.http.RetroHttpException: retrofit.RetrofitError: 403 FORBIDDEN
                                                                                                 at org.edx.mobile.http.RetroHttpExceptionHandler.handleError(RetroHttpExceptionHandler.java:23)
                                                                                                 at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:242)
                                                                                                 at java.lang.reflect.Proxy.invoke(Proxy.java:393)
                                                                                                 at $Proxy24.getCourseList(Unknown Source)
                                                                                                 at org.edx.mobile.course.CourseAPI.getCourseList(CourseAPI.java:35)
                                                                                                 at org.edx.mobile.course.GetCourseListTask.call(GetCourseListTask.java:26)
                                                                                                 at org.edx.mobile.course.GetCourseListTask.call(GetCourseListTask.java:11)
                                                                                                 at roboguice.util.SafeAsyncTask$SafeAsyncTaskAndroidCallable.doInBackground(SafeAsyncTask.java:163)
                                                                                                 at roboguice.util.AndroidCallableWrapper.doDoInBackgroundThread(AndroidCallableWrapper.java:113)
                                                                                                 at roboguice.util.AndroidCallableWrapper.run(AndroidCallableWrapper.java:41)
                                                                                                 at roboguice.util.AndroidCallable.run(AndroidCallable.java:20)
                                                                                                 at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
                                                                                                 at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                                 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                                                 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                                                 at java.lang.Thread.run(Thread.java:818)
                                                                                                 at dalvik.system.VMStack.getThreadStackTrace(Native Method)
                                                                                                 at java.lang.Thread.getStackTrace(Thread.java:580)
                                                                                                 at roboguice.util.AndroidCallable.<init>(AndroidCallable.java:12)
                                                                                                 at roboguice.util.SafeAsyncTask$SafeAsyncTaskAndroidCallable.<init>(SafeAsyncTask.java:160)
                                                                                                 at roboguice.util.SafeAsyncTask.newTask(SafeAsyncTask.java:156)
                                                                                                 at roboguice.util.SafeAsyncTask.future(SafeAsyncTask.java:66)
                                                                                                 at roboguice.util.SafeAsyncTask.execute(SafeAsyncTask.java:94)
                                                                                                 at roboguice.util.SafeAsyncTask.execute(SafeAsyncTask.java:90)
                                                                                                 at org.edx.mobile.view.dialog.NativeFindCoursesFragment$2.loadNextPage(NativeFindCoursesFragment.java:84)
                                                                                                 at org.edx.mobile.view.adapters.InfiniteScrollUtils$PageLoadController.onLoadMore(InfiniteScrollUtils.java:159)
                                                                                                 at org.edx.mobile.view.adapters.InfiniteScrollUtils$PageLoadController.onLoadMore(InfiniteScrollUtils.java:144)
                                                                                                 at org.edx.mobile.view.adapters.InfiniteScrollUtils$PageLoadController.access$000(InfiniteScrollUtils.java:119)
                                                                                                 at org.edx.mobile.view.adapters.InfiniteScrollUtils.configureListViewWithInfiniteList(InfiniteScrollUtils.java:43)
                                                                                                 at org.edx.mobile.view.dialog.NativeFindCoursesFragment.onViewCreated(NativeFindCoursesFragment.java:55)
                                                                                                 at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
                                                                                                 at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
                                                                                                 at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742)
                                                                                                 at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
                                                                                                 at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:339)
                                                                                                 at android.support.v4.app.FragmentActivity.onResume(FragmentActivity.java:484)
                                                                                                 at org.edx.mobile.base.RoboAppCompatActivity.onResume(RoboAppCompatActivity.java:87)
                                                                                                 at org.edx.mobile.base.BaseFragmentActivity.onResume(BaseFragmentActivity.java:102)
                                                                                                 at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1258)
                                                                                                 at android.app.Activity.performResume(Activity.java:6312)
                                                                                                 at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3092)
                                                                                                 at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
                                                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
                                                                                                 at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                                 at android.os.Looper.loop(Looper.java:148)
                                                                                                 at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
05-10 14:30:04.684 30710-30710/org.edx.mobile D/Event: No subscribers registered for event class org.edx.mobile.logger.Logger$CrashReportEvent
05-10 14:30:04.684 30710-30710/org.edx.mobile D/Event: No subscribers registered for event class de.greenrobot.event.NoSubscriberEvent
05-10 14:30:58.898 30710-30716/org.edx.mobile W/art: Suspending all threads took: 5.154ms
05-10 14:37:04.972 30710-30716/org.edx.mobile W/art: Suspending all threads took: 24.946ms
05-10 14:44:38.295 30710-30716/org.edx.mobile W/art: Suspending all threads took: 11.793ms
05-10 14:48:21.699 30710-30716/org.edx.mobile W/art: Suspending all threads took: 10.982ms

Failed to generate Signed APK.

Error:Execution failed for task ':OpenEdXMobile:transformClassesWithJarMergingForProdRelease'.

com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com/segment/analytics/Analytics$1.class

Crashes when navigating back from the edit profile screen

To reproduce, go to Edit profile, then navigate back.

Stacktrace:

org.edx.mobile E/org.edx.mobile.profiles.UserProfileFragment: java.lang.NullPointerException: Attempt to invoke interface method 'boolean org.edx.mobile.profiles.ScrollingPreferenceChild.prefersScrollingHeader()' on a null object reference
                                                                  at org.edx.mobile.profiles.UserProfileFragment.onChildScrollingPreferenceChanged(UserProfileFragment.java:250)
                                                                  at org.edx.mobile.profiles.UserProfileBioFragment$2.showBio(UserProfileBioFragment.java:73)
                                                                  at org.edx.mobile.profiles.UserProfileBioPresenter$1.onData(UserProfileBioPresenter.java:55)
                                                                  at org.edx.mobile.profiles.UserProfileBioPresenter$1.onData(UserProfileBioPresenter.java:52)
                                                                  at org.edx.mobile.util.observer.MainThreadObservable$2$1.run(MainThreadObservable.java:41)
                                                                  at android.os.Handler.handleCallback(Handler.java:739)
                                                                  at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                  at android.os.Looper.loop(Looper.java:148)
                                                                  at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Cannot sign in through google+

I am trying to get Google+ sign in working from the android app, but I ended up with a "Sign-in Error" from the app (Unknown error. Please try again later) while the Facebook and username/email sign in works properly.

The server respond to the app's request with a 400 Bad request error: {"error_description": "access_token is not valid", "error": "invalid_grant"}

However, When I try to sign in with Google+ through the web interface, it works perfectly.

I did all of these :

I'm not sure what to try next. Is there something I'm missing?
Thanks!

UPDATE

And here's the app's log:

10-06 10:39:44.042 19154-19154/org.edx.mobile D/org.edx.mobile.social.ISocial: Scopes= oauth2:https://www.googleapis.com/auth/plus.login https://www.googleapis.com/auth/userinfo.email
10-06 10:39:44.042 19154-19154/org.edx.mobile D/org.edx.mobile.view.LoginActivity: network state changed
10-06 10:39:44.043 19154-19957/org.edx.mobile D/org.edx.mobile.social.ISocial: Fetching google oauth2 token ...
10-06 10:39:44.043 19154-19154/org.edx.mobile D/org.edx.mobile.util.NetworkUtil: Wifi is connected
10-06 10:39:44.063 19154-19154/org.edx.mobile I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@391f5fb5 time:189812637
10-06 10:39:45.113 19154-19154/org.edx.mobile D/org.edx.mobile.social.ISocial: Google oauth2: accessToken: *****
10-06 10:39:45.113 19154-19154/org.edx.mobile D/org.edx.mobile.social.SocialLoginDelegate: Google logged in; token= ****
10-06 10:39:45.157 19154-8984/org.edx.mobile D/OkHttp: --> POST https://courses.edraak.org/oauth2/exchange_access_token/google-oauth2/ HTTP/1.1
10-06 10:39:45.157 19154-8984/org.edx.mobile D/OkHttp: Content-Type: application/x-www-form-urlencoded
10-06 10:39:45.157 19154-8984/org.edx.mobile D/OkHttp: Content-Length: 189
10-06 10:39:45.157 19154-8984/org.edx.mobile D/OkHttp: User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.1.1; C6602 Build/10.7.A.0.222) Edraak/org.edx.mobile/0.8.2
10-06 10:39:45.157 19154-8984/org.edx.mobile D/OkHttp: Authorization: ******
10-06 10:39:45.157 19154-8984/org.edx.mobile D/OkHttp: access_token=****&client_id=******
10-06 10:39:45.157 19154-8984/org.edx.mobile D/OkHttp: --> END POST (189-byte body)
10-06 10:39:48.362 19154-8984/org.edx.mobile D/OkHttp: <-- 400 BAD REQUEST https://courses.edraak.org/oauth2/exchange_access_token/google-oauth2/ (3204ms)
10-06 10:39:48.362 19154-8984/org.edx.mobile D/OkHttp: Cache-Control: no-store
10-06 10:39:48.362 19154-8984/org.edx.mobile D/OkHttp: Content-Language: ar
10-06 10:39:48.362 19154-8984/org.edx.mobile D/OkHttp: Content-Type: application/json
10-06 10:39:48.362 19154-8984/org.edx.mobile D/OkHttp: Date: Thu, 06 Oct 2016 07:39:38 GMT
10-06 10:39:48.362 19154-8984/org.edx.mobile D/OkHttp: Pragma: no-cache
10-06 10:39:48.362 19154-8984/org.edx.mobile D/OkHttp: Server: nginx
10-06 10:39:48.362 19154-8984/org.edx.mobile D/OkHttp: Set-Cookie: sessionid=*******; Domain=.edraak.org; expires=Thu, 20-Oct-2016 07:39:38 GMT; httponly; Max-Age=1209600; Path=/; secure
10-06 10:39:48.363 19154-8984/org.edx.mobile D/OkHttp: Vary: Accept-Language, Cookie
10-06 10:39:48.363 19154-8984/org.edx.mobile D/OkHttp: X-Frame-Options: SAMEORIGIN
10-06 10:39:48.363 19154-8984/org.edx.mobile D/OkHttp: Content-Length: 76
10-06 10:39:48.363 19154-8984/org.edx.mobile D/OkHttp: Connection: keep-alive
10-06 10:39:48.363 19154-8984/org.edx.mobile D/OkHttp: OkHttp-Sent-Millis: 1475739587778
10-06 10:39:48.363 19154-8984/org.edx.mobile D/OkHttp: OkHttp-Received-Millis: 1475739588362
10-06 10:39:48.363 19154-8984/org.edx.mobile D/OkHttp: {"error_description": "access_token is not valid", "error": "invalid_grant"}
10-06 10:39:48.363 19154-8984/org.edx.mobile D/OkHttp: <-- END HTTP (76-byte body)
10-06 10:39:48.374 19154-19154/org.edx.mobile E/org.edx.mobile.view.LoginActivity: org.edx.mobile.http.HttpResponseStatusException
                                                                                          at org.edx.mobile.authentication.LoginAPI.finishSocialLogIn(LoginAPI.java:112)
                                                                                          at org.edx.mobile.authentication.LoginAPI.logInUsingGoogle(LoginAPI.java:100)
                                                                                          at org.edx.mobile.social.SocialLoginDelegate$ProfileTask.call(SocialLoginDelegate.java:202)
                                                                                          at org.edx.mobile.social.SocialLoginDelegate$ProfileTask.call(SocialLoginDelegate.java:161)
                                                                                          at roboguice.util.SafeAsyncTask$SafeAsyncTaskAndroidCallable.doInBackground(SafeAsyncTask.java:163)
                                                                                          at roboguice.util.AndroidCallableWrapper.doDoInBackgroundThread(AndroidCallableWrapper.java:113)
                                                                                          at roboguice.util.AndroidCallableWrapper.run(AndroidCallableWrapper.java:41)
                                                                                          at roboguice.util.AndroidCallable.run(AndroidCallable.java:20)
                                                                                          at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
                                                                                          at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                                          at java.lang.Thread.run(Thread.java:818)
                                                                                          at dalvik.system.VMStack.getThreadStackTrace(Native Method)
                                                                                          at java.lang.Thread.getStackTrace(Thread.java:580)
                                                                                          at roboguice.util.AndroidCallable.<init>(AndroidCallable.java:12)
                                                                                          at roboguice.util.SafeAsyncTask$SafeAsyncTaskAndroidCallable.<init>(SafeAsyncTask.java:160)
                                                                                          at roboguice.util.SafeAsyncTask.newTask(SafeAsyncTask.java:156)
                                                                                          at roboguice.util.SafeAsyncTask.future(SafeAsyncTask.java:66)
                                                                                          at roboguice.util.SafeAsyncTask.execute(SafeAsyncTask.java:94)
                                                                                          at roboguice.util.SafeAsyncTask.execute(SafeAsyncTask.java:90)
                                                                                          at org.edx.mobile.social.SocialLoginDelegate.onSocialLoginSuccess(SocialLoginDelegate.java:133)
                                                                                          at org.edx.mobile.social.SocialLoginDelegate$1.onLogin(SocialLoginDelegate.java:53)
                                                                                          at org.edx.mobile.social.google.GoogleOauth2$FetchGoogleTokenTask.onPostExecute(GoogleOauth2.java:117)
                                                                                          at android.os.AsyncTask.finish(AsyncTask.java:636)
                                                                                          at android.os.AsyncTask.access$500(AsyncTask.java:177)
                                                                                          at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
                                                                                          at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                          at android.os.Looper.loop(Looper.java:211)
                                                                                          at android.app.ActivityThread.main(ActivityThread.java:5389)
                                                                                          at java.lang.reflect.Method.invoke(Native Method)
                                                                                          at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
                                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)

Video is always not available on mobile

I'm trying to play some videos with the integrated player but I can't. The app always shows the following screen:
screenshot_2017-06-05-10-05-28-048_org edx mobile

I execute "gradlew assembleDebug" to try the app with my config.

Download Fail

Not able to download large video file in android application. I get some KB file instead of full file.

Redistribution Legal Considerations

Hi,

We have an Edx platform instance and have been offering courses for some time. Now we are going to modify the Edx Android app and distribute it on Play Store. Regarding this app's license and Edx trademark, would you please help us to see what legal and technical issues should we consider to avoid copyright problems?

Thanks

In Android App, Courseware API is invalid

Hi ,

I am using Latest Code of edx In mobile (2.1.1 version).
In server side I am using cypress version of edx.

Courseware API is not working, and getting 404 response

"/api/courses/v1/blocks/?course_id={course_id}&username={username}&depth=all&requested_fields=graded%2Cformat%2Cstudent_view_multi_device&student_view_data=video&block_counts=video&nav_depth=3"

Could someone help me to sort out this issue.
For some reason I am unable to upgrade from Cypress to Dogwood. Is there any other way ?

Which API / endpoint I've to use to get Courseware data in Cypress version.

invalid cookie in android app when get courses content

Request:

GET /xblock/block-v1:edX+DemoX+Demo_Course+type@html+block@030e35c4756a4ddc8d40b95fbbfff4d4 HTTP/1.1
Host: lms.*.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Google Nexus 7 2013 - 6.0.0 - API 23 - 1200x1920 Build/MRA58K) AppleWebKit/537.36 (KH
TML, like Gecko) Version/4.0 Chrome/40.0.0.0 Safari/537.36 Edx/org.edx.mobile/2.0.0
authorization: Bearer 5df7d6b72ab7238d3a95ad9469a98e05a76911d1
Accept-Encoding: gzip, deflate
Accept-Language: en-US;q=0.8
Cookie: csrftoken=hko11cvTqQH6J5yyv6ThCdcms06Lw0nG; sessionid=delui6bc07eqlr0s3zxvk57kjyax7z3a
X-Requested-With: org.edx.mobile
X-Forwarded-For: *
X-Forwarded-Host: lms.*.com
X-Forwarded-Server: lms.*.com
Connection: Keep-Alive

This request returns 404 Not found,
But SAME request with another cookie from iOS app always return 200 OK

Why are there not more issues?

Hi fellow coders,

I'm new to open source and would love to contribute to Open edX for Android. However, there's only 5 issues in the issue tracker. Is this project in full development or is it new, what's the deal? Is this project beginner-friendly?

Thanks so much for your time,

Jing

Issues in upgarding to Android Studio v2.3

Problem

After upgrading Android Studio to v2.3.x and with it the various libraries, we have been encountering the following error:

Error:Execution failed for task ':OpenEdXMobile:validateSigningDevRelease'.

Keystore file /$HOME/edx-app-android/OpenEdXMobile/edx-android-release-key.keystore not found for signing config 'releasekey'.

Solution

  1. Change the build variant to devDebuggable.

screen shot 2017-07-25 at 4 31 37 pm

  1. Following any steps from the ones mentioned below would work:

    • Sync project with gradle files. (Press the Try Again button) screen shot 2017-07-25 at 4 32 38 pm

    • Clean the project (Build --> Clean from Android Studio's top menu bar) screen shot 2017-07-26 at 4 00 33 pm

    • Adding a gradle.properties file with no content at the root of project i.e. under the OpenEdXMobile folder with nothing in it also solves this problem.

  2. Refresh all Gradle projects. (View -- > Tool Windows --> Gradle from Android Studio's top menu bar) [By pressing the blue recycle icon in the snapshot below]

screen shot 2017-07-25 at 4 32 58 pm

Not login in my EDX

Hi,

I have installed an Open EDX Eucalyptus.2. I am preparing the application connection for Android and for IOS.

I have rigorously followed the steps of Github:

File edx.properties in OpenEdXMobile:

edx.dir = '../../my_config'

In folder my_config:

#file edx.properties edx.android { 
  configFiles = ['config.yaml', 'local.yaml'] 
}
#file local.yaml 
OAUTH_CLIENT_ID: 'xxxxxxxxxxxxxxx'
#file config.yaml 
API_HOST_URL: 'http://my_server/' # localhost is 10.0.2.2 in Android 
ENVIRONMENT_DISPLAY_NAME: 'PRO' 
PLATFORM_NAME: 'Mooc' 
PLATFORM_DESTINATION_NAME: 'my_server' 
FEEDBACK_EMAIL_ADDRESS: 'edx@my_server'

The app compiles perfectly and starts. The problem is that when I try to login, it does nothing.

In Open EDX everything is set correctly. I have compiled the app for IOS with the same parameters and it works correctly.

Any idea??

Thanks!!!

Deprecated API version

As per the Open Edx Plateform API document, the latest version of API is v1.0 while this project still uses v0.5 version of API which is Deprecated.

Hence please let me know if there is any other branch that points to latest API version v1.0?

Support for the Peer Instruction XBlock?

Hi,

We (at the University of British Columbia) have developed the Peer Instruction XBlock

https://github.com/ubc/ubcpi

which is integrated into the edx-platform and in use by many courses (for example, courses that are part of the Software Development Micromasters Program).

Is there support for this XBlock in the Android app? Students accessing their courses on mobile would greatly benefit from this, and we would love to see Peer Instruction supported in the app.

Thanks,

Justin

AlertDialog crush

Hello
When I try to login without internet connection my app crush

http://prntscr.com/ghb4z6

actually I have solved this by change
import android.support.v7.app.AlertDialog
to
import android.app.AlertDialog;

but it is very weird

Analytics integration

Hello,

I'm currently working on integrating Fabric analytics in the app, and I saw that you are working on Google Firebase Integration in #879 and this is really cool. The problem is that all events are fired in each screen using segment, regardless of the integration type.

I tried to make something generic but that leaded to a huge code change (around 57 files) which I prefer not to do because of the merge conflicts I'll face later. I actually have no questions here, but I wanted to check if you are interested in having such a change so may be I can introduce my changes in a pull request.

"Authentication credentials were not provided."

09-26 18:05:59.761 10449-12484/org.edx.mobile D/OkHttp: --> POST https://WEBSITE.org/oauth2/access_token/ HTTP/1.1
09-26 18:05:59.761 10449-12484/org.edx.mobile D/OkHttp: Content-Type: application/x-www-form-urlencoded
09-26 18:05:59.761 10449-12484/org.edx.mobile D/OkHttp: Content-Length: 102
09-26 18:05:59.761 10449-12484/org.edx.mobile D/OkHttp: User-Agent: Dalvik/2.1.0 (Linux; U; Android 6.0.1; SM-N920C Build/MMB29K) Salalem/org.edx.mobile/0.0.1
09-26 18:05:59.761 10449-12484/org.edx.mobile D/OkHttp: grant_type=password&client_id=CLIENT_ID&username=USERNAME&password=PASSWORD
09-26 18:05:59.761 10449-12484/org.edx.mobile D/OkHttp: --> END POST (102-byte body)
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: <-- 200 OK https://WEBSITE.org/oauth2/access_token/ (482ms)
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: Server: nginx/1.1.19
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: Date: Mon, 26 Sep 2016 15:09:54 GMT
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: Content-Type: application/json
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: Transfer-Encoding: chunked
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: Connection: keep-alive
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: Vary: Accept-Encoding
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: Content-Language: ar
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: Vary: Accept-Language, Cookie
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: Pragma: no-cache
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: Cache-Control: no-store
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: X-Frame-Options: ALLOW
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: Strict-Transport-Security: max-age=31536000; includeSubDomains
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: OkHttp-Sent-Millis: 1474902359779
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: OkHttp-Received-Millis: 1474902360250
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: {"access_token": "75d633496392dae912ac63753fdcd2ccced65a97", "token_type": "Bearer", "expires_in": 2591999, "scope": ""}
09-26 18:06:00.241 10449-12484/org.edx.mobile D/OkHttp: <-- END HTTP (120-byte body)
09-26 18:06:00.271 10449-12484/org.edx.mobile D/OkHttp: --> GET https://WEBSITE.org/api/mobile/v0.5/my_user_info HTTP/1.1
09-26 18:06:00.271 10449-12484/org.edx.mobile D/OkHttp: User-Agent: Dalvik/2.1.0 (Linux; U; Android 6.0.1; SM-N920C Build/MMB29K) Salalem/org.edx.mobile/0.0.1
09-26 18:06:00.271 10449-12484/org.edx.mobile D/OkHttp: Authorization: Bearer 75d633496392dae912ac63753fdcd2ccced65a97
09-26 18:06:00.271 10449-12484/org.edx.mobile D/OkHttp: --> END GET
09-26 18:06:00.951 10449-12484/org.edx.mobile W/org.edx.mobile.http.OauthRefreshTokenAuthenticator: Response{protocol=http/1.1, code=401, message=UNAUTHORIZED, url=https://WEBSITE.org/api/mobile/v0.5/users/USER}
09-26 18:06:00.951 10449-12484/org.edx.mobile D/OkHttp: <-- 401 UNAUTHORIZED https://WEBSITE.org/api/mobile/v0.5/users/ghadeersa (685ms)
09-26 18:06:00.951 10449-12484/org.edx.mobile D/OkHttp: Server: nginx/1.1.19
09-26 18:06:00.951 10449-12484/org.edx.mobile D/OkHttp: Date: Mon, 26 Sep 2016 15:09:55 GMT
09-26 18:06:00.951 10449-12484/org.edx.mobile D/OkHttp: Content-Type: application/json
09-26 18:06:00.951 10449-12484/org.edx.mobile D/OkHttp: Transfer-Encoding: chunked
09-26 18:06:00.951 10449-12484/org.edx.mobile D/OkHttp: Connection: keep-alive
09-26 18:06:00.951 10449-12484/org.edx.mobile D/OkHttp: Content-Language: ar
09-26 18:06:00.951 10449-12484/org.edx.mobile D/OkHttp: Vary: Accept, Accept-Language, Cookie
09-26 18:06:00.951 10449-12484/org.edx.mobile D/OkHttp: Allow: GET, HEAD, OPTIONS
09-26 18:06:00.951 10449-12484/org.edx.mobile D/OkHttp: X-Frame-Options: ALLOW
09-26 18:06:00.951 10449-12484/org.edx.mobile D/OkHttp: WWW-Authenticate: Bearer realm="api"
09-26 18:06:00.951 10449-12484/org.edx.mobile D/OkHttp: OkHttp-Sent-Millis: 1474902360867
09-26 18:06:00.951 10449-12484/org.edx.mobile D/OkHttp: OkHttp-Received-Millis: 1474902360956
09-26 18:06:00.951 10449-12484/org.edx.mobile D/OkHttp: {"detail":"Authentication credentials were not provided."}

Status on removing accounts permissions

What is the status of switching to the new Google Sign In and being able to take out the permissions here?

    <!-- Required by legacy Google Sign In (TODO: Switch to new Google Sign In) -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />

Thanks!

Download location?

Where does the edx app download videos to?
Since the app doesn't allow video speed changes, I'd like to use vlc to play the videos, but I can't find the files.

MyAllVideosFragment: java.lang.NullPointerException:

hi
when i download a course successful, in MyAllVideosFragment

ArrayList coursesList = environment.getStorage()
.getDownloadedCoursesWithVideoCountAndSize();

coursesList all with is null. I don‘t konw how to fix it . this is my log ...

Forgive my English is poor.

org.edx.mobile.view.MyAllVideosFragment: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.Iterator java.util.ArrayList.iterator()' on a null object reference at org.edx.mobile.view.MyAllVideosFragment.addMyAllVideosData(MyAllVideosFragment.java:81) at org.edx.mobile.view.MyAllVideosFragment.onResume(MyAllVideosFragment.java:66) at android.support.v4.app.Fragment.performResume(Fragment.java:2020) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1107) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617) at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570) at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) at android.support.v4.view.ViewPager.populate(ViewPager.java:1177) at android.support.v4.view.ViewPager.populate(ViewPager.java:1025) at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1545) at android.view.View.measure(View.java:18930) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5976) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1486) at android.widget.LinearLayout.measureVertical(LinearLayout.java:765) at android.widget.LinearLayout.onMeasure(LinearLayout.java:647) at android.view.View.measure(View.java:18930) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5976) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at android.view.View.measure(View.java:18930) at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1075) at android.view.View.measure(View.java:18930) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5976) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) at android.view.View.measure(View.java:18930) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5976) at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:391) at android.view.View.measure(View.java:18930) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5976) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at android.view.View.measure(View.java:18930) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5976) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1486) at android.widget.LinearLayout.measureVertical(LinearLayout.java:765) at android.widget.LinearLayout.onMeasure(LinearLayout.java:647) at android.view.View.measure(View.java:18930) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5976) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2705) at android.view.View.measure(View.java:18930) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2153) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1247) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1483) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1138) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6227) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:884) at android.view.Choreographer.doCallbacks(Choreographer.java:696) at android.view.Choreographer.doFrame(Choreographer.java:631) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:870) at android.os.Handler.handleCallback(Handler.java:743) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:150) at android.app.ActivityThread.main(ActivityThread.java:5546) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteIni 05-18 18:50:56.694 30888-30888/org.edx.mobile D/org.edx.mobile.view.MyRecentVideosFragment: reloading adapter...

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.