Skip to content
This repository has been archived by the owner on Jan 11, 2021. It is now read-only.

Runtime Permissions #42

Merged
merged 13 commits into from
Sep 17, 2016
Merged
4 changes: 4 additions & 0 deletions mobile/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ android {
abortOnError false
}

testOptions {
unitTests.returnDefaultValues = true
}

}

repositories {
Expand Down
8 changes: 5 additions & 3 deletions mobile/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@
<!-- Activities -->
<activity
android:name="com.alexstyl.specialdates.ui.activity.MainActivity"
android:windowSoftInputMode="adjustPan"
android:exported="true"
android:launchMode="singleTop">
android:launchMode="singleTop"
android:windowSoftInputMode="adjustPan">

<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand Down Expand Up @@ -68,8 +68,8 @@
<activity
android:name="com.alexstyl.specialdates.search.SearchActivity"
android:exported="false"
android:theme="@style/Search.Theme"
android:parentActivityName="com.alexstyl.specialdates.ui.activity.MainActivity"
android:theme="@style/Search.Theme"
android:windowSoftInputMode="stateVisible|adjustResize">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
Expand Down Expand Up @@ -131,6 +131,8 @@
</intent-filter>
</activity>


<activity android:name=".permissions.ContactPermissionActivity" />
<!-- Services -->
<service
android:name="com.alexstyl.specialdates.service.DailyReminderIntentService"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

public class MementoApplication extends Application {

private static final String TAG = "Memento";
private static Context context;

public static String getVersionName(Context context) {
Expand All @@ -33,7 +32,7 @@ public static String getVersionName(Context context) {

public static final String MARKET_LINK_SHORT = "http://goo.gl/ZQiAsi";

public static Context getAppContext() {
public static Context getContext() {
return context;
}

Expand Down
48 changes: 28 additions & 20 deletions mobile/src/main/java/com/alexstyl/specialdates/Navigator.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.alexstyl.specialdates;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
Expand All @@ -11,6 +12,7 @@
import com.alexstyl.specialdates.analytics.Analytics;
import com.alexstyl.specialdates.analytics.Screen;
import com.alexstyl.specialdates.contact.actions.IntentAction;
import com.alexstyl.specialdates.permissions.ContactPermissionActivity;
import com.alexstyl.specialdates.search.SearchActivity;
import com.alexstyl.specialdates.settings.MainPreferenceActivity;
import com.alexstyl.specialdates.support.SupportDonateDialog;
Expand All @@ -20,11 +22,11 @@ public class Navigator {

public static final Uri GOOGLE_PLUS_COMMUNITY = Uri.parse("https://plus.google.com/u/0/communities/112144353599130693487");

private final Context context;
private final Activity activity;
private final Analytics analytics;

public Navigator(Context context, Analytics analytics) {
this.context = context;
public Navigator(Activity activity, Analytics analytics) {
this.activity = activity;
this.analytics = analytics;
}

Expand All @@ -34,13 +36,13 @@ public boolean canGoToPlayStore() {
}

private boolean canResolveIntent(Intent intent) {
return context.getPackageManager().resolveActivity(intent, 0) != null;
return activity.getPackageManager().resolveActivity(intent, 0) != null;
}

public void toPlayStore() {
try {
Intent intent = buildPlayStoreIntent();
context.startActivity(intent);
activity.startActivity(intent);
} catch (ActivityNotFoundException e) {
ErrorTracker.track(e);
}
Expand All @@ -49,15 +51,15 @@ public void toPlayStore() {
@NonNull
private Intent buildPlayStoreIntent() {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=" + context.getPackageName()));
intent.setData(Uri.parse("market://details?id=" + activity.getPackageName()));
return intent;
}

public void toGooglePlusCommunityBrowser() {
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(GOOGLE_PLUS_COMMUNITY);
context.startActivity(intent);
activity.startActivity(intent);
} catch (ActivityNotFoundException e) {
ErrorTracker.track(e);
}
Expand All @@ -68,18 +70,18 @@ public void toGooglePlusCommunityApp() {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setPackage("com.google.android.apps.plus");
intent.setData(GOOGLE_PLUS_COMMUNITY);
context.startActivity(intent);
activity.startActivity(intent);
} catch (ActivityNotFoundException e) {
ErrorTracker.track(e);
}
}

public boolean canGoToEmailSupport() {
return canResolveIntent(Utils.getSupportEmailIntent(context));
return canResolveIntent(Utils.getSupportEmailIntent(activity));
}

public void toEmailSupport() {
Utils.openIntentSafely(context, new IntentAction() {
Utils.openIntentSafely(activity, new IntentAction() {
@Override
public void onStartAction(Context context) throws ActivityNotFoundException {
Intent intent = Utils.getSupportEmailIntent(context);
Expand All @@ -94,30 +96,36 @@ public String getName() {
}

public void toAddBirthday() {
Intent intent = new Intent(context, AddBirthdayActivity.class);
context.startActivity(intent);
Intent intent = new Intent(activity, AddBirthdayActivity.class);
activity.startActivity(intent);
}

public void toSearch() {
Intent intent = new Intent(context, SearchActivity.class);
context.startActivity(intent);
Intent intent = new Intent(activity, SearchActivity.class);
activity.startActivity(intent);
}

public void toAbout() {
Intent intent = new Intent(context, AboutActivity.class);
context.startActivity(intent);
Intent intent = new Intent(activity, AboutActivity.class);
activity.startActivity(intent);
analytics.trackScreen(Screen.ABOUT);
}

public void toDonateDialog() {
Intent intent = new Intent(context, SupportDonateDialog.class);
context.startActivity(intent);
Intent intent = new Intent(activity, SupportDonateDialog.class);
activity.startActivity(intent);
analytics.trackScreen(Screen.DONATE);
}

public void toSettings() {
Intent intent = new Intent(context, MainPreferenceActivity.class);
context.startActivity(intent);
Intent intent = new Intent(activity, MainPreferenceActivity.class);
activity.startActivity(intent);
analytics.trackScreen(Screen.SETTINGS);
}

public void toContactPermissionRequired(int requestCode) {
Intent intent = new Intent(activity, ContactPermissionActivity.class);
activity.startActivityForResult(intent, requestCode);
analytics.trackScreen(Screen.CONTACT_PERMISSION_REQUESTED);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

public enum Screen {
HOME("home"),
ADD_BIRTHDAY("add birthday"),
ADD_BIRTHDAY("add_birthday"),
SEARCH("search"),
SETTINGS("settings"),
DATE_DETAILS("date details"),
DATE_DETAILS("date_details"),
DONATE("donate"),
ABOUT("about");
ABOUT("about"),
CONTACT_PERMISSION_REQUESTED("contact_permission");

private final String screenName;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ private boolean isSingleDigit(int number) {

public String fullyFormattedBirthday(Birthday birthday) {
DayDate dayDate = DayDate.newInstance(birthday.getDayOfMonth(), birthday.getMonth(), birthday.getYear());
Context appContext = MementoApplication.getAppContext();
Context appContext = MementoApplication.getContext();

int format_flags = DateUtils.FORMAT_NO_NOON_MIDNIGHT | DateUtils.FORMAT_CAP_AMPM | DateUtils.FORMAT_SHOW_DATE;

Expand All @@ -76,7 +76,7 @@ public String fullyFormattedBirthday(Birthday birthday) {

public String fullyFormattedDate(Date date) {
DayDate dayDate = DayDate.newInstance(date.getDayOfMonth(), date.getMonth(), date.getYear());
Context appContext = MementoApplication.getAppContext();
Context appContext = MementoApplication.getContext();

int format_flags = DateUtils.FORMAT_NO_NOON_MIDNIGHT | DateUtils.FORMAT_CAP_AMPM | DateUtils.FORMAT_SHOW_DATE;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ public class DateDetailsActivity extends ThemedActivity {
private static final String EXTRA_DAY = BuildConfig.APPLICATION_ID + ".dayOfMonth";
private static final String EXTRA_MONTH = BuildConfig.APPLICATION_ID + ".month";
private static final String EXTRA_YEAR = BuildConfig.APPLICATION_ID + ".year";

private static final String EXTRA_SOURCE = BuildConfig.APPLICATION_ID + ".source";
/**
* The activity was lauched because the user tapped on a notification
Expand All @@ -32,25 +31,18 @@ public class DateDetailsActivity extends ThemedActivity {

private DayDate displayingDate;

private void setHeaderTitle(String str) {
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle(str);
}
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_date_details);
MementoToolbar toolbar = Views.findById(this, R.id.memento_toolbar);

toolbar.displayAsUp();
setSupportActionBar(toolbar);

Optional<DayDate> receivedDate = getCalendarFromIntent(getIntent());
if (!receivedDate.isPresent()) {
finish();
ErrorTracker.track(new RuntimeException("Tried to open DateDetails with no date in the intent:[" + getIntent() + "]"));
ErrorTracker.track(new NullPointerException("Tried to open DateDetails with no date in the intent:[" + getIntent() + "]"));
return;
}
this.displayingDate = receivedDate.get();
Expand All @@ -76,6 +68,11 @@ public void onCreate(Bundle savedInstanceState) {

}

String titleDate = DateFormatUtils.formatTimeStampString(
DateDetailsActivity.this, displayingDate.toMillis(),
true
);
setTitle(titleDate);
}

private Optional<DayDate> getCalendarFromIntent(Intent intent) {
Expand Down Expand Up @@ -107,18 +104,6 @@ public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}

@Override
protected void onResume() {
super.onResume();
// update date?
String titleDate = DateFormatUtils.formatTimeStampString(
DateDetailsActivity.this, displayingDate.toMillis(),
true
);

setHeaderTitle(titleDate);
}

/**
* Starts the {@link DateDetailsActivity}, that will display details about
* the given date
Expand All @@ -127,7 +112,8 @@ protected void onResume() {
*/
public static void startActivity(Context context, int month,
int dayOfMonth, int year) {
context.startActivity(getStartIntent(context, dayOfMonth, month, year));
Intent startIntent = getStartIntent(context, dayOfMonth, month, year);
context.startActivity(startIntent);
}

/**
Expand All @@ -151,11 +137,4 @@ public static Intent getStartIntentFromExternal(Context context, int dayOfMonth,
return startIntent;
}

public static void startActivity(Context context, DayDate date) {
startActivity(
context, date.getMonth(), date.getDayOfMonth(),
date.getYear()
);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import com.alexstyl.specialdates.ui.base.MementoFragment;
import com.alexstyl.specialdates.analytics.Action;
import com.alexstyl.specialdates.ui.dialog.ProgressFragmentDialog;
import com.alexstyl.specialdates.upcoming.ContactPermissionRequest;
import com.alexstyl.specialdates.util.ShareNamedaysIntentCreator;

import java.util.List;
Expand All @@ -60,6 +61,7 @@ public class DateDetailsFragment extends MementoFragment implements LoaderManage
private GridWithHeaderSpacesItemDecoration spacingDecoration;

private Navigator navigator;
private ContactPermissionRequest permissions;

public static Fragment newInstance(int year, int month, int dayofMonth) {
Fragment fragment = new DateDetailsFragment();
Expand Down Expand Up @@ -149,16 +151,39 @@ public void onSaveInstanceState(Bundle outState) {
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);

getLoaderManager().initLoader(LOADER_ID_EVENTS, null, this);
if (permissions.permissionIsPresent()) {
getLoaderManager().initLoader(LOADER_ID_EVENTS, null, this);
} else {
permissions.requestForPermission();
}
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
permissions.onActivityResult(requestCode, resultCode, data);
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
navigator = new Navigator(getActivity(), analytics);
analytics = Firebase.get(getActivity());
navigator = new Navigator(getActivity(), analytics);
permissions = new ContactPermissionRequest(getActivity(), navigator, permissionCallbacks);
}

private final ContactPermissionRequest.PermissionCallbacks permissionCallbacks = new ContactPermissionRequest.PermissionCallbacks() {
@Override
public void onPermissionGranted() {
getLoaderManager().initLoader(LOADER_ID_EVENTS, null, DateDetailsFragment.this);
}

@Override
public void onPermissionDenied() {
getActivity().finishAffinity();
}
};

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_upcoming_light, menu);
Expand Down
Loading