Ver código fonte

Merge branch 'master' of git.knacki.info:isundil/mimouchat-android

B Thibault 8 anos atrás
pai
commit
7bffa93f6a

+ 3 - 0
.idea/misc.xml

@@ -2,6 +2,9 @@
 <project version="4">
   <component name="EntryPointsManager">
     <entry_points version="2.0" />
+    <list size="1">
+      <item index="0" class="java.lang.String" itemvalue="android.webkit.JavascriptInterface" />
+    </list>
   </component>
   <component name="NullableNotNullManager">
     <option name="myDefaultNullable" value="android.support.annotation.Nullable" />

+ 95 - 5
app/src/main/java/com/knacki/mimou/activity/MainActivity.java

@@ -13,6 +13,8 @@ import android.support.annotation.NonNull;
 import android.support.v4.app.ActivityCompat;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.app.AppCompatActivity;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.webkit.WebChromeClient;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
@@ -22,6 +24,7 @@ import com.knacki.mimou.bridge.JavascriptFunction;
 import com.knacki.mimou.preference.CredentialHolder;
 import com.knacki.mimou.bridge.JsInterface;
 import com.knacki.mimou.R;
+import com.knacki.mimou.preference.PreferenceHolder;
 import com.knacki.mimou.preference.UserSettings;
 
 import java.util.List;
@@ -31,6 +34,8 @@ public class MainActivity extends AppCompatActivity {
     public final static int SMS_PERMISSION_CALLBACK = 42;
     protected WebView web;
     protected JsInterface interfaceMimouDroid;
+    protected MainActivityMenu menu;
+    protected String currentChannel = null;
     public static boolean needReload = true;
     private static Logger log = Logger.getLogger(MainActivity.class.getName());
     private JsInterface.TypedCallback<Boolean> currentCallback = null;
@@ -47,12 +52,12 @@ public class MainActivity extends AppCompatActivity {
             public boolean shouldOverrideUrlLoading(WebView view, String url) {
                 Uri uri = Uri.parse(url);
 
-                log.severe("Loading url " +url);
+                log.fine("Loading url " +url);
                 if (uri.getHost().equals(getString(R.string.mimouHost))) {
                     List<String> pathSegments = uri.getPathSegments();
                     if (pathSegments.size() > 0) {
                         if (pathSegments.get(0).equals("login") && !url.contains("?phoneAccess=")) {
-                            CredentialHolder.reset(MainActivity.this);
+                            PreferenceHolder.reset(MainActivity.this);
                             showLogin();
                             return true;
                         }
@@ -82,10 +87,26 @@ public class MainActivity extends AppCompatActivity {
         reload();
     }
 
+    @Override
+    public boolean onCreateOptionsMenu(Menu m) {
+        getMenuInflater().inflate(R.menu.title_opt, m);
+        menu = new MainActivityMenu(m);
+        menu.setFavoriteEnabled(false);
+        return true;
+    }
+
+    public void uiThread(Runnable e) {
+        new Handler(Looper.getMainLooper()).post(e);
+    }
+
     public void reload() {
         if (needReload && web != null) {
             if (CredentialHolder.hasCredential(this)) {
-                final String url = getString(R.string.mimouUrl) + (CredentialHolder.isLocal(this) ? getString(R.string.localUrl) : (getString(R.string.loginUrl) + "/android?phoneAccess=" +CredentialHolder.getToken(this)));
+                final String url;
+                if (CredentialHolder.isLocal(this))
+                    url = getString(R.string.mimouUrl) + getString(R.string.localUrl);
+                else
+                    url = getString(R.string.mimouUrl) + getString(R.string.loginUrl) + "/android?phoneAccess=" + CredentialHolder.getToken(this);
                 log.fine("Loading URL: " +url);
                 web.loadUrl(url);
             } else {
@@ -107,6 +128,13 @@ public class MainActivity extends AppCompatActivity {
         else
             reload();
         interfaceMimouDroid.setActivity(this);
+        runJavascript(new JavascriptFunction(JsInterface.ON_APPLICATION_RESUMED));
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        runJavascript(new JavascriptFunction(JsInterface.ON_APPLICATION_PAUSED));
     }
 
     @Override
@@ -125,7 +153,7 @@ public class MainActivity extends AppCompatActivity {
     }
 
     private void runJavascript(final String js) {
-        (new Handler(Looper.getMainLooper())).post(new Runnable() {
+        uiThread(new Runnable() {
             @Override
             public void run() {
                 if (web != null)
@@ -153,6 +181,27 @@ public class MainActivity extends AppCompatActivity {
         }
     }
 
+    public void setCurrentChannel(String channelId) {
+        currentChannel = channelId;
+        UserSettings.previousChanel(this, channelId);
+    }
+
+    public void setTitle(final CharSequence title, final Boolean isFavorite) {
+        uiThread(new Runnable() {
+            @Override
+            public void run() {
+                setTitle(title);
+
+                if (isFavorite == null) {
+                    menu.setFavoriteEnabled(false);
+                } else {
+                    menu.setFavoriteEnabled(true);
+                    menu.setFavorite(isFavorite);
+                }
+            }
+        });
+    }
+
     private void promptAndroidPermission() {
         ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.READ_SMS, Manifest.permission.SEND_SMS}, SMS_PERMISSION_CALLBACK);
     }
@@ -194,8 +243,49 @@ public class MainActivity extends AppCompatActivity {
     @Override
     public void onBackPressed() {
         if (UserSettings.backShowMenu(this))
-            runJavascript(new JavascriptFunction("onNativeBackPressed"));
+            runJavascript(new JavascriptFunction(JsInterface.TOGGLE_MENU));
         else
             moveTaskToBack(true);
     }
+
+    class MainActivityMenu {
+        protected MenuItem favoriteButton;
+        protected MenuItem menuButton;
+        protected boolean favoriteEnabled;
+        protected boolean isFavorite;
+
+        MainActivityMenu(Menu menu) {
+            favoriteButton = menu.getItem(0);
+            menuButton = menu.getItem(1);
+
+            favoriteButton.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
+                @Override
+                public boolean onMenuItemClick(MenuItem menuItem) {
+                    if (favoriteEnabled && currentChannel != null) {
+                        runJavascript(new JavascriptFunction(JsInterface.SET_CHANNEL_FAVORITE).addArgument(currentChannel).addArgument(!isFavorite));
+                    }
+                    return true;
+                }
+            });
+
+            menuButton.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
+                @Override
+                public boolean onMenuItemClick(MenuItem menuItem) {
+                    runJavascript(new JavascriptFunction(JsInterface.TOGGLE_MENU));
+                    return true;
+                }
+            });
+        }
+
+        public void setFavoriteEnabled(boolean enabled) {
+            favoriteButton.setVisible(enabled);
+            favoriteEnabled = enabled;
+        }
+
+        public void setFavorite(boolean isFav) {
+            isFavorite = isFav;
+            favoriteButton.setTitle(isFav ? "STARRED" : "NOT STARRED");
+            //favoriteButton.setIcon(MainActivity.this.getDrawable(R.drawable.favorite));
+        }
+    }
 }

+ 1 - 1
app/src/main/java/com/knacki/mimou/bridge/JavascriptFunction.java

@@ -31,7 +31,7 @@ public class JavascriptFunction {
         if (!immutable) {
             if (!firstArg)
                 fncStr.append(',');
-            fncStr.append(escapeStr(arg));
+            fncStr.append('"').append(escapeStr(arg)).append('"');
             firstArg = false;
         }
         return this;

+ 31 - 0
app/src/main/java/com/knacki/mimou/bridge/JsInterface.java

@@ -6,6 +6,7 @@ import com.knacki.mimou.activity.MainActivity;
 import com.knacki.mimou.contact.Contact;
 import com.knacki.mimou.contact.ContactReader;
 import com.knacki.mimou.preference.CredentialHolder;
+import com.knacki.mimou.preference.UserSettings;
 import com.knacki.mimou.sms.Conversation;
 import com.knacki.mimou.sms.ConversationList;
 import com.knacki.mimou.sms.Sms;
@@ -28,6 +29,13 @@ import java.util.logging.Logger;
  */
 public class JsInterface {
     private final Logger log = Logger.getLogger(JsInterface.class.getName());
+
+    public static final String TOGGLE_MENU = "toggleMenu";
+    public static final String ON_APPLICATION_PAUSED = "onApplicationPaused";
+    public static final String ON_APPLICATION_RESUMED = "onApplicationResumed";
+    public static final String ON_SMS_PERMISSION_UPDATED = "onSmsPermissionUpdated";
+    public static final String SET_CHANNEL_FAVORITE = "setChannelFavorite";
+
     MainActivity mainActivity;
 
     public void setActivity(MainActivity mainActivity) {
@@ -41,11 +49,19 @@ public class JsInterface {
     }
 
     @JavascriptInterface
+<<<<<<< HEAD
     public void readSmsPermission(final number callbackId) {
         mainActivity.requestSmsPermission(new TypedCallback<Boolean>() {
             @Override
             public void onResult(Boolean result) {
                 mainActivity.runJavascript(new JavascriptFunction(callbackId).addArgument(result));
+=======
+    public void readSmsPermission() {
+        mainActivity.requestSmsPermission(new TypedCallback<Boolean>() {
+            @Override
+            public void onResult(Boolean result) {
+                mainActivity.runJavascript(new JavascriptFunction(JsInterface.ON_SMS_PERMISSION_UPDATED).addArgument(result));
+>>>>>>> db2b417f1ecb71380c1577978914febf20fcde40
             }
         });
     }
@@ -101,6 +117,21 @@ public class JsInterface {
         // FIXME
     }
 
+    @JavascriptInterface
+    public void setTitle(final String title, boolean favEnabled, boolean isFavorite) {
+        mainActivity.setTitle(title, favEnabled ? isFavorite : null);
+    }
+
+    @JavascriptInterface
+    public void setCurrentChannel(final String channelId) {
+        mainActivity.setCurrentChannel(channelId);
+    }
+
+    @JavascriptInterface
+    public String getPreviousChannel() {
+        return UserSettings.previousChanel(mainActivity);
+    }
+
     private void getStaticUsers(JSONObject staticContent) {
         JSONArray jsonUsers = new JSONArray();
         JSONObject genericContent = new JSONObject();

+ 1 - 3
app/src/main/java/com/knacki/mimou/preference/CredentialHolder.java

@@ -59,10 +59,8 @@ public abstract class CredentialHolder extends PreferenceHolder {
         return null;
     }
 
-    public static void reset(Context c) {
-        SharedPreferences.Editor p = getSharedPreferences(c).edit();
+    static void reset(SharedPreferences.Editor p) {
         p.remove(PREF_SECURITY_TOKEN);
         p.remove(USE_SMS);
-        p.commit();
     }
 }

+ 7 - 1
app/src/main/java/com/knacki/mimou/preference/PreferenceHolder.java

@@ -6,11 +6,17 @@ import android.content.SharedPreferences;
 /**
  * Created by isundil on 1/4/18.
  */
-class PreferenceHolder {
+public class PreferenceHolder {
     private static final String PREF_FILENAME = "prefs";
 
     protected static SharedPreferences getSharedPreferences(Context c) {
         return c.getSharedPreferences(PREF_FILENAME, Context.MODE_PRIVATE);
     }
 
+    public static void reset(Context c) {
+        SharedPreferences.Editor p = getSharedPreferences(c).edit();
+        UserSettings.reset(p);
+        CredentialHolder.reset(p);
+        p.commit();
+    }
 }

+ 14 - 0
app/src/main/java/com/knacki/mimou/preference/UserSettings.java

@@ -8,8 +8,22 @@ import android.content.SharedPreferences;
  */
 public class UserSettings extends PreferenceHolder {
     public static final String BACK_SHOW_MENU = "BACK_SHOW_MENU";
+    public static final String PREVIOUS_CHANNEL = "PREVIOUS_CHAN";
 
     public static boolean backShowMenu(Context c) {
         return getSharedPreferences(c).getBoolean(BACK_SHOW_MENU, true);
     }
+
+    public static String previousChanel(Context c, String s) {
+        getSharedPreferences(c).edit().putString(PREVIOUS_CHANNEL, s).commit();
+        return s;
+    }
+
+    public static String previousChanel(Context c) {
+        return getSharedPreferences(c).getString(PREVIOUS_CHANNEL, null);
+    }
+
+    static void reset(SharedPreferences.Editor p) {
+        p.remove(PREVIOUS_CHANNEL);
+    }
 }

+ 9 - 0
app/src/main/res/menu/title_opt.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android" >
+    <item android:id="@+id/action_fav"
+        android:title="fav"
+        android:showAsAction="ifRoom"/>
+    <item android:id="@+id/action_settings"
+        android:title="..."
+        android:showAsAction="ifRoom"/>
+</menu>