Skip to content
This repository has been archived by the owner on Jul 27, 2022. It is now read-only.

Commit

Permalink
Adding permissions for Android M Release
Browse files Browse the repository at this point in the history
  • Loading branch information
ulukaya committed Aug 24, 2015
1 parent 6b63713 commit 4ed03b2
Show file tree
Hide file tree
Showing 10 changed files with 145 additions and 32 deletions.
15 changes: 8 additions & 7 deletions app/build.gradle
@@ -1,32 +1,33 @@
apply plugin: 'com.android.application'

android {
compileSdkVersion 19
buildToolsVersion "19.1"
compileSdkVersion 23
buildToolsVersion "23.0.0"

defaultConfig {
applicationId "com.google.android.apps.watchme"
minSdkVersion 16
targetSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
}

buildTypes {
release {
runProguard false
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.google.android.gms:play-services:+'
compile 'com.android.support:support-v13:20.0.0'
compile 'com.google.android.gms:play-services-plus:7.8.0'
compile 'com.android.support:support-v4:23.0.0'
compile 'com.android.support:design:23.0.0'
compile 'com.google.apis:google-api-services-youtube:v3-rev120-1.19.0'
compile 'com.google.http-client:google-http-client-android:+'
compile 'com.google.api-client:google-api-client-android:+'
compile 'com.google.api-client:google-api-client-gson:+'
compile 'com.google.code.gson:gson:2.2.4'
compile 'com.google.code.gson:gson:2.3'
}
13 changes: 3 additions & 10 deletions app/src/main/AndroidManifest.xml
Expand Up @@ -18,17 +18,14 @@
package="com.google.android.apps.watchme">

<uses-permission android:name="android.permission.INTERNET" />
<!-- Access network state to check Google Play Services availability. -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- For authorization. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.NETWORK" />
<!-- For recording audio and video without going to lock. -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-feature
android:name="android.hardware.camera"
Expand All @@ -42,12 +39,8 @@
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />

<activity
android:name=".MainActivity"
android:name="com.google.android.apps.watchme.MainActivity"
android:configChanges="orientation|screenSize"
android:label="@string/app_name">
<intent-filter>
Expand All @@ -57,11 +50,11 @@
</intent-filter>
</activity>
<activity
android:name=".StreamerActivity"
android:name="com.google.android.apps.watchme.StreamerActivity"
android:label="@string/app_name"
android:screenOrientation="landscape"></activity>

<service android:name=".StreamerService" />
<service android:name="com.google.android.apps.watchme.StreamerService" />
</application>

</manifest>
Expand Up @@ -32,7 +32,8 @@
import com.google.android.apps.watchme.util.ImageFetcher;
import com.google.android.apps.watchme.util.ImageWorker;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.plus.Plus;
import com.google.android.gms.plus.PlusOneButton;
Expand All @@ -46,7 +47,7 @@
* Left side fragment showing user's uploaded YouTube videos.
*/
public class EventsListFragment extends Fragment implements
ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks {
ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

private static final String TAG = EventsListFragment.class.getName();
private Callbacks mCallbacks;
Expand Down Expand Up @@ -142,10 +143,6 @@ public void onConnectionSuspended(int i) {

}

@Override
public void onDisconnected() {
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
if (connectionResult.hasResolution()) {
Expand Down
Expand Up @@ -14,15 +14,19 @@

package com.google.android.apps.watchme;

import android.Manifest;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.IBinder;
import android.os.PowerManager;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
Expand All @@ -31,6 +35,9 @@
import com.google.android.apps.watchme.util.Utils;
import com.google.android.apps.watchme.util.YouTubeApi;

import java.util.ArrayList;
import java.util.List;

/**
* @author Ibrahim Ulukaya <ulukaya@google.com>
* <p/>
Expand All @@ -41,6 +48,8 @@ public class StreamerActivity extends Activity {
// TODO: Stop hardcoding this and read values from the camera's supported sizes.
public static final int CAMERA_WIDTH = 640;
public static final int CAMERA_HEIGHT = 480;
private static final int REQUEST_CAMERA_MICROPHONE = 0;


// Member variables
private StreamerService streamerService;
Expand Down Expand Up @@ -160,10 +169,72 @@ private void startStreaming() {
wakeLock.acquire();

if (!streamerService.isStreaming()) {
streamerService.startStreaming(rtmpUrl);

String cameraPermission = Manifest.permission.CAMERA;
String microphonePermission = Manifest.permission.RECORD_AUDIO;
int hasCamPermission = checkSelfPermission(cameraPermission);
int hasMicPermission = checkSelfPermission(microphonePermission);
List<String> permissions = new ArrayList<String>();
if (hasCamPermission != PackageManager.PERMISSION_GRANTED) {
permissions.add(cameraPermission);
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)) {
// Provide rationale in Snackbar with button to request permission
Snackbar.make(preview, R.string.permission_camera_rationale,
Snackbar.LENGTH_INDEFINITE).show();
}
}
if (hasMicPermission != PackageManager.PERMISSION_GRANTED) {
permissions.add(microphonePermission);
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.RECORD_AUDIO)) {
// Provide rationale in Snackbar with button to request permission
Snackbar.make(preview, R.string.permission_microphone_rationale,
Snackbar.LENGTH_INDEFINITE).show();
}
}
if (!permissions.isEmpty()) {
String[] params = permissions.toArray(new String[permissions.size()]);
ActivityCompat.requestPermissions(this, params, REQUEST_CAMERA_MICROPHONE);
} else {
// We already have permission, so handle as normal
streamerService.startStreaming(rtmpUrl);
}
}
}

/**
* Callback received when a permissions request has been completed.
*/
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_CAMERA_MICROPHONE: {
Log.i(MainActivity.APP_NAME, "Received response for camera with mic permissions request.");

// We have requested multiple permissions for contacts, so all of them need to be
// checked.
if (Utils.verifyPermissions(grantResults)) {
// permissions were granted, yay! do the
// streamer task you need to do.
streamerService.startStreaming(rtmpUrl);
} else {
Log.i(MainActivity.APP_NAME, "Camera with mic permissions were NOT granted.");
Snackbar.make(preview, R.string.permissions_not_granted,
Snackbar.LENGTH_SHORT)
.show();
}
break;
}

// other 'switch' lines to check for other
// permissions this app might request
}
return;
}


private void stopStreaming() {
Log.d(MainActivity.APP_NAME, "stopStreaming");

Expand Down
Expand Up @@ -14,20 +14,28 @@

package com.google.android.apps.watchme;

import android.Manifest;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.os.Binder;
import android.os.IBinder;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import android.view.View;

import com.google.android.apps.watchme.util.Utils;

import java.util.ArrayList;
import java.util.List;

/**
* @author Ibrahim Ulukaya <ulukaya@google.com>
* <p/>
Expand Down Expand Up @@ -66,11 +74,10 @@ public boolean onUnbind(Intent intent) {

public void startStreaming(String streamUrl) {
Log.d(MainActivity.APP_NAME, "startStreaming");

showForegroundNotification();
connection = new VideoStreamingConnection();
// TODO Pass an actual preview surface.
connection.open(streamUrl, camera, null);
showForegroundNotification();
connection = new VideoStreamingConnection();
// TODO Pass an actual preview surface.
connection.open(streamUrl, camera, null);
}

public void stopStreaming() {
Expand Down
22 changes: 22 additions & 0 deletions app/src/main/java/com/google/android/apps/watchme/util/Utils.java
Expand Up @@ -16,6 +16,7 @@
package com.google.android.apps.watchme.util;

import android.app.Activity;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.hardware.Camera;
import android.os.Build;
Expand Down Expand Up @@ -149,4 +150,25 @@ private static String getErrorMessage(Activity activity, String message) {
}
return resources.getString(R.string.error_format, message);
}

/**
* Check that all given permissions have been granted by verifying that each entry in the
* given array is of the value {@link PackageManager#PERMISSION_GRANTED}.
*
* @see Activity#onRequestPermissionsResult(int, String[], int[])
*/
public static boolean verifyPermissions(int[] grantResults) {
// At least one result must be checked.
if(grantResults.length < 1){
return false;
}

// Verify that each required permission has been granted, otherwise return false.
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
}
3 changes: 3 additions & 0 deletions app/src/main/res/values/strings.xml
Expand Up @@ -38,4 +38,7 @@
<string name="startingEvent">Starting event. Please wait…</string>
<string name="endingEvent">Ending event. Please wait…</string>
<string name="videoThumbnail">video thumbnail</string>
<string name="permission_camera_rationale">App needs camera for video stream.</string>
<string name="permission_microphone_rationale">App needs microphone for audio stream.</string>
<string name="permissions_not_granted">Streaming service won\'t be able to work without camera and microphone permissions.</string>
</resources>
2 changes: 1 addition & 1 deletion build.gradle
Expand Up @@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.2'
classpath 'com.android.tools.build:gradle:1.3.0'
}
}

Expand Down
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
#Wed Apr 10 15:27:10 PDT 2013
#Thu Aug 20 11:12:54 EDT 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip
19 changes: 19 additions & 0 deletions yt-watchme.iml
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="yt-watchme" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="java-gradle" name="Java-Gradle">
<configuration>
<option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
<option name="BUILDABLE" value="false" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.gradle" />
</content>
<orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

0 comments on commit 4ed03b2

Please sign in to comment.