diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a1698f89..f53bbafe 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -90,6 +90,11 @@
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize|keyboardHidden" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d2e245e5..36202a82 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -35,6 +35,9 @@
Exit
Settings >
Settings
+
+ Welcome to the latest version of the Graphene OS Messaging App!
+ Please note that SMS/MMS are a non-private and insecure form of communication. We highly recommend using a more secure and private service, such as Molly/Signal.
Messaging needs permission to SMS, Phone and Contacts.
You can change permissions in Settings > Apps > Messaging > Permissions.
diff --git a/src/com/android/messaging/ui/BaseBugleActivity.java b/src/com/android/messaging/ui/BaseBugleActivity.java
index 43ba1d1d..e493a39f 100644
--- a/src/com/android/messaging/ui/BaseBugleActivity.java
+++ b/src/com/android/messaging/ui/BaseBugleActivity.java
@@ -32,7 +32,7 @@ public class BaseBugleActivity extends AppCompatActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (UiUtils.redirectToPermissionCheckIfNeeded(this)) {
+ if (UiUtils.checkToShowWelcomeAndPermissionScreens(this)) {
return;
}
}
diff --git a/src/com/android/messaging/ui/BugleActionBarActivity.java b/src/com/android/messaging/ui/BugleActionBarActivity.java
index b7e72cd7..59c39812 100644
--- a/src/com/android/messaging/ui/BugleActionBarActivity.java
+++ b/src/com/android/messaging/ui/BugleActionBarActivity.java
@@ -61,7 +61,7 @@ public class BugleActionBarActivity extends AppCompatActivity implements ImeUtil
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (UiUtils.redirectToPermissionCheckIfNeeded(this)) {
+ if (UiUtils.checkToShowWelcomeAndPermissionScreens(this)) {
return;
}
diff --git a/src/com/android/messaging/ui/UIIntents.java b/src/com/android/messaging/ui/UIIntents.java
index 9d7e8bcd..702f047f 100644
--- a/src/com/android/messaging/ui/UIIntents.java
+++ b/src/com/android/messaging/ui/UIIntents.java
@@ -115,6 +115,12 @@ public static UIIntents get() {
*/
public abstract void launchPermissionCheckActivity(final Context context);
+ /**
+ * Launch the welcome and warning activity
+ */
+
+ public abstract void launchWelcomeSMSWarningActivity(final Context context);
+
public abstract void launchConversationListActivity(final Context context);
/**
diff --git a/src/com/android/messaging/ui/UIIntentsImpl.java b/src/com/android/messaging/ui/UIIntentsImpl.java
index 9c5d18f0..9c645cec 100644
--- a/src/com/android/messaging/ui/UIIntentsImpl.java
+++ b/src/com/android/messaging/ui/UIIntentsImpl.java
@@ -137,6 +137,14 @@ private Intent getConversationActivityIntent(final Context context,
@Override
public void launchPermissionCheckActivity(final Context context) {
final Intent intent = new Intent(context, PermissionCheckActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ context.startActivity(intent);
+ }
+
+ @Override
+ public void launchWelcomeSMSWarningActivity(final Context context) {
+ final Intent intent = new Intent(context, WelcomeSMSWarningActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(intent);
}
diff --git a/src/com/android/messaging/ui/WelcomeSMSWarningActivity.java b/src/com/android/messaging/ui/WelcomeSMSWarningActivity.java
new file mode 100644
index 00000000..5566b1d1
--- /dev/null
+++ b/src/com/android/messaging/ui/WelcomeSMSWarningActivity.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.messaging.ui;
+
+import static com.android.messaging.util.BuglePrefs.KEY_LAST_VERSION;
+
+import android.os.Bundle;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.activity.OnBackPressedCallback;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.android.messaging.BuildConfig;
+import com.android.messaging.R;
+import com.android.messaging.util.BuglePrefs;
+import com.android.messaging.util.UiUtils;
+
+/**
+ * Activity to warn user that sms/mms is insecure and should not be used.
+ */
+public class WelcomeSMSWarningActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.welcome_sms_warning);
+ UiUtils.setStatusBarColor(this, getColor(R.color.permission_check_activity_background));
+
+ // Remove title bar added by AppCompatActivity
+ if (getSupportActionBar() != null) {
+ getSupportActionBar().hide();
+ }
+
+ findViewById(R.id.exit).setOnClickListener(view -> finish());
+
+ final BuglePrefs prefs = BuglePrefs.getApplicationPrefs();
+
+ TextView mNextView = findViewById(R.id.next);
+ mNextView.setVisibility(View.VISIBLE);
+
+ mNextView.setOnClickListener(v -> {
+ UIIntents.get().launchPermissionCheckActivity(this);
+ prefs.putInt(KEY_LAST_VERSION, BuildConfig.VERSION_CODE);
+ finish();
+ });
+
+ OnBackPressedCallback callback = new OnBackPressedCallback(true) {
+ @Override
+ public void handleOnBackPressed() {
+ finish();
+ }
+ };
+ getOnBackPressedDispatcher().addCallback(this, callback);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ }
+}
diff --git a/src/com/android/messaging/ui/conversation/LaunchConversationActivity.java b/src/com/android/messaging/ui/conversation/LaunchConversationActivity.java
index c869839e..67b6eb16 100644
--- a/src/com/android/messaging/ui/conversation/LaunchConversationActivity.java
+++ b/src/com/android/messaging/ui/conversation/LaunchConversationActivity.java
@@ -57,7 +57,7 @@ public class LaunchConversationActivity extends Activity implements
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (UiUtils.redirectToPermissionCheckIfNeeded(this)) {
+ if (UiUtils.checkToShowWelcomeAndPermissionScreens(this)) {
return;
}
diff --git a/src/com/android/messaging/util/BuglePrefs.java b/src/com/android/messaging/util/BuglePrefs.java
index 74a0d468..1571649c 100644
--- a/src/com/android/messaging/util/BuglePrefs.java
+++ b/src/com/android/messaging/util/BuglePrefs.java
@@ -41,6 +41,8 @@ public abstract class BuglePrefs {
*/
public static final int NO_SHARED_PREFERENCES_VERSION = -1;
+ public static final String KEY_LAST_VERSION = "last_version";
+
/**
* Returns the shared preferences file name to use.
* Subclasses should override and return the shared preferences file.
diff --git a/src/com/android/messaging/util/UiUtils.java b/src/com/android/messaging/util/UiUtils.java
index ac7e3f9d..17ece8aa 100644
--- a/src/com/android/messaging/util/UiUtils.java
+++ b/src/com/android/messaging/util/UiUtils.java
@@ -16,6 +16,9 @@
package com.android.messaging.util;
+import static com.android.messaging.util.BuglePrefs.KEY_LAST_VERSION;
+import static com.android.messaging.util.BuglePrefs.NO_SHARED_PREFERENCES_VERSION;
+
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
@@ -40,6 +43,7 @@
import android.widget.RemoteViews;
import android.widget.Toast;
+import com.android.messaging.BuildConfig;
import com.android.messaging.Factory;
import com.android.messaging.R;
import com.android.messaging.ui.SnackBar;
@@ -302,6 +306,23 @@ public static boolean isRtlMode() {
.getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
}
+ /**
+ * Check if app has just been updated, so we can show the launchWelcomeSMSWarningActivity
+ */
+
+ public static boolean isFirstRunAfterUpdate(final Activity activity) {
+ final BuglePrefs prefs = BuglePrefs.getApplicationPrefs();
+
+ final int savedVersion = prefs.getInt(KEY_LAST_VERSION, NO_SHARED_PREFERENCES_VERSION);
+ final int currentVersion = BuildConfig.VERSION_CODE;
+
+ if (currentVersion != savedVersion) {
+ UIIntents.get().launchWelcomeSMSWarningActivity(activity);
+ return true;
+ }
+ return false;
+ }
+
/**
* Check if the activity needs to be redirected to permission check
* @return true if {@link Activity#finish()} was called because redirection was performed
@@ -319,6 +340,19 @@ public static boolean redirectToPermissionCheckIfNeeded(final Activity activity)
return true;
}
+ /**
+ * Checks whether or not to show the welcome/warning activity,
+ * and then checks whether or not to show the permission activity
+ * @param activity The current activity context
+ * @return true if either the welcome screen or permission check screen is shown
+ */
+ public static boolean checkToShowWelcomeAndPermissionScreens (Activity activity) {
+ if (UiUtils.isFirstRunAfterUpdate(activity)) {
+ return true;
+ }
+ return UiUtils.redirectToPermissionCheckIfNeeded(activity);
+ }
+
/**
* Called to check if all conditions are nominal and a "go" for some action, such as deleting
* a message, that requires this app to be the default app. This is also a precondition