From 33356660c0bd712a02ee7fd05ba77dcf871b0027 Mon Sep 17 00:00:00 2001 From: massimiliano <massimiliano@disroot.org> Date: Sun, 25 Nov 2018 11:54:36 +0100 Subject: [PATCH] State page using api's instead of webview --- .idea/caches/build_file_checksums.ser | Bin 534 -> 534 bytes app/build.gradle | 4 + app/src/main/AndroidManifest.xml | 32 +-- .../disroot/disrootapp/ui/MainActivity.java | 8 +- .../disroot/disrootapp/ui/StateActivity.java | 203 ++++++++++++++++++ .../disroot/disrootapp/utils/HttpHandler.java | 66 ++++++ app/src/main/res/layout/activity_state.xml | 35 +++ app/src/main/res/layout/list_item.xml | 38 ++++ app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-sr/strings.xml | 1 + app/src/main/res/values/strings.xml | 4 +- app/src/main/res/values/styles.xml | 12 +- 16 files changed, 384 insertions(+), 24 deletions(-) create mode 100644 app/src/main/java/org/disroot/disrootapp/ui/StateActivity.java create mode 100644 app/src/main/java/org/disroot/disrootapp/utils/HttpHandler.java create mode 100644 app/src/main/res/layout/activity_state.xml create mode 100644 app/src/main/res/layout/list_item.xml diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 4eeba38c66b08b55b0ce8de5ffd3305e2242821a..c83edae13c0e9cb50e4622f8bd7551f9d70d30be 100644 GIT binary patch delta 33 rcmV++0N($W1eOGlm;_20+o7?XX#o+9<doh7k?t$D`ss&-(7il(`gjn3 delta 33 rcmV++0N($W1eOGlm;^GH)()|pX#o-N%YoptL-c8Y`4s;Os;v8X`|l8> diff --git a/app/build.gradle b/app/build.gradle index ee2693a..a9b8807 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,3 +44,7 @@ dependencies { repositories { mavenCentral() } + +dependencies { + implementation 'com.android.support.constraint:constraint-layout:+' +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f7fa6ce..d15645f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,20 +4,19 @@ <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> - <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> - <uses-permission android:name="android.permission.CAMERA"/> - + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + <uses-permission android:name="android.permission.CAMERA" /> <application + android:allowBackup="true" + android:fullBackupContent="@xml/backup_descriptor" android:hardwareAccelerated="true" android:icon="@mipmap/ic_disroot" android:label="@string/app_name" - android:theme="@style/DisTheme" android:supportsRtl="true" - android:allowBackup="true" - android:fullBackupContent="@xml/backup_descriptor"> + android:theme="@style/DisTheme"> <activity - android:name="org.disroot.disrootapp.ui.SplashScreenActivity" + android:name=".ui.SplashScreenActivity" android:configChanges="orientation|screenSize" android:label="@string/app_name"> <intent-filter> @@ -27,7 +26,7 @@ </intent-filter> </activity> <activity - android:name="org.disroot.disrootapp.ui.MainActivity" + android:name=".ui.MainActivity" android:configChanges="orientation|screenSize" android:hardwareAccelerated="true" android:label="@string/app_name"> @@ -43,23 +42,24 @@ </intent-filter> </activity> <activity - android:name="org.disroot.disrootapp.ui.AboutActivity" + android:name=".ui.AboutActivity" android:label="@string/title_activity_about" android:theme="@style/DisTheme" /> - <activity android:name="org.disroot.disrootapp.ui.WelcomeActivity" /> - - + <activity android:name=".ui.WelcomeActivity" /> <activity android:name="wsdfhjxc.taponium.MainActivity" - android:screenOrientation="portrait" - android:label="@string/title_activity_tap"> + android:label="@string/title_activity_tap" + android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> - - + <activity + android:name=".ui.StateActivity" + android:label="@string/title_activity_state" + android:theme="@style/DisTheme"></activity> </application> </manifest> \ No newline at end of file diff --git a/app/src/main/java/org/disroot/disrootapp/ui/MainActivity.java b/app/src/main/java/org/disroot/disrootapp/ui/MainActivity.java index 1ef56f7..27e914d 100644 --- a/app/src/main/java/org/disroot/disrootapp/ui/MainActivity.java +++ b/app/src/main/java/org/disroot/disrootapp/ui/MainActivity.java @@ -518,6 +518,7 @@ public class MainActivity extends AppCompatActivity implements View.OnLongClickL }); button.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { + Intent goState = new Intent(MainActivity.this, StateActivity.class); //first time tap check if (firstStart.getBoolean("firsttap", true)){ showFirstTap(); @@ -525,9 +526,10 @@ public class MainActivity extends AppCompatActivity implements View.OnLongClickL return; } else - webView.loadUrl(Constants.URL_DisApp_STATE); - webView.setVisibility(View.VISIBLE); - dashboard.setVisibility(View.GONE); + MainActivity.this.startActivity(goState); + //webView.loadUrl(Constants.URL_DisApp_STATE); + //webView.setVisibility(View.VISIBLE); + //dashboard.setVisibility(View.GONE); } }); diff --git a/app/src/main/java/org/disroot/disrootapp/ui/StateActivity.java b/app/src/main/java/org/disroot/disrootapp/ui/StateActivity.java new file mode 100644 index 0000000..2289324 --- /dev/null +++ b/app/src/main/java/org/disroot/disrootapp/ui/StateActivity.java @@ -0,0 +1,203 @@ +package org.disroot.disrootapp.ui; + +import android.annotation.SuppressLint; +import android.app.ProgressDialog; +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.View; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.SimpleAdapter; +import android.widget.Toast; + +import org.disroot.disrootapp.R; +import org.disroot.disrootapp.utils.HttpHandler; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.HashMap; + +public class StateActivity extends AppCompatActivity { + + private String TAG = MainActivity.class.getSimpleName(); + + private ProgressDialog pDialog; + private ListView lv; + + // URL to get data JSON + static String url = "https://state.disroot.org/api/v1/components"; + static String url1 = "https://state.disroot.org/api/v1/components?page=2"; + + ArrayList<HashMap<String, String>> stateList; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_state); + + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + toolbar.setNavigationIcon(R.drawable.ic_arrow_back); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + onBackPressed(); + } + }); + + stateList = new ArrayList<>(); + + lv = findViewById(R.id.list); + + new GetList().execute(); + } + + /** + * Async task class to get json by making HTTP call + */ + @SuppressLint("StaticFieldLeak") + class GetList extends AsyncTask<Void, Void, Void> { + + @Override + protected void onPreExecute() { + super.onPreExecute(); + // Showing progress dialog + pDialog = new ProgressDialog(StateActivity.this); + pDialog.setMessage("Please wait..."); + pDialog.setCancelable(false); + pDialog.show(); + } + + @Override + protected Void doInBackground(Void... arg0) { + HttpHandler sh = new HttpHandler(); + + // Making a request to url and getting response + String jsonStr0 = sh.makeServiceCall(url); + String jsonStr1 = sh.makeServiceCall(url1); + + Log.e(TAG, "Response from url: " + jsonStr0); + + if (jsonStr0 != null) { + try { + JSONObject jsonObj = new JSONObject(jsonStr0); + + // Getting JSON Array node + JSONArray data = jsonObj.getJSONArray("data"); + + // looping through All data + for (int i = 0; i < data.length(); i++) { + JSONObject c = data.getJSONObject(i); + + String id = c.getString("id"); + String name = c.getString("name"); + String description = c.getString("description"); + String updated_at = c.getString("updated_at"); + String status_name = c.getString("status_name"); + + // tmp hash map for single service + HashMap<String, String> service = new HashMap<>(); + + // adding each child node to HashMap key => value + service.put("id", id); + service.put("name", name); + service.put("description", description); + service.put("updated_at", updated_at); + service.put("status_name", status_name); + + // adding service to service list + stateList.add(service); + } + } catch (final JSONException e) { + Log.e(TAG, "Json parsing error: " + e.getMessage()); + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(getApplicationContext(), + "Json parsing error: " + e.getMessage(), + Toast.LENGTH_LONG) + .show(); + } + }); + } + }if (jsonStr1 != null) {//next page + try { + JSONObject jsonObj = new JSONObject(jsonStr1); + + // Getting JSON Array node + JSONArray data = jsonObj.getJSONArray("data"); + + // looping through All data + for (int i = 0; i < data.length(); i++) { + JSONObject c = data.getJSONObject(i); + + String id = c.getString("id"); + String name = c.getString("name"); + String description = c.getString("description"); + String updated_at = c.getString("updated_at"); + String status_name = c.getString("status_name"); + + // tmp hash map for single service + HashMap<String, String> service = new HashMap<>(); + + // adding each child node to HashMap key => value + service.put("id", id); + service.put("name", name); + service.put("description", description); + service.put("updated_at", updated_at); + service.put("status_name", status_name); + + // adding service to service list + stateList.add(service); + } + } catch (final JSONException e) { + Log.e(TAG, "Json parsing error: " + e.getMessage()); + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(getApplicationContext(), + "Json parsing error: " + e.getMessage(), + Toast.LENGTH_LONG) + .show(); + } + }); + } + } else { + Log.e(TAG, "Couldn't get json from server."); + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(getApplicationContext(), + "Couldn't get json from server. Check LogCat for possible errors!", + Toast.LENGTH_LONG) + .show(); + } + }); + } + return null; + } + + @Override + protected void onPostExecute(Void result) { + super.onPostExecute(result); + // Dismiss the progress dialog + if (pDialog.isShowing()) + pDialog.dismiss(); + + + //Updating parsed JSON data into ListView + + ListAdapter adapter = new SimpleAdapter( + StateActivity.this, stateList, + R.layout.list_item, new String[]{"name", "description", "updated_at", + "status_name"}, new int[]{R.id.name, + R.id.description,R.id.updated_at, R.id.status_name}); + lv.setAdapter(adapter); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/disroot/disrootapp/utils/HttpHandler.java b/app/src/main/java/org/disroot/disrootapp/utils/HttpHandler.java new file mode 100644 index 0000000..b8ffdbd --- /dev/null +++ b/app/src/main/java/org/disroot/disrootapp/utils/HttpHandler.java @@ -0,0 +1,66 @@ +package org.disroot.disrootapp.utils; +import android.util.Log; + +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.ProtocolException; +import java.net.URL; + +/** + * Created by Ravi Tamada on 01/09/16. + * www.androidhive.info + */ +public class HttpHandler { + + private static final String TAG = HttpHandler.class.getSimpleName(); + + public HttpHandler() { + } + + public String makeServiceCall(String reqUrl) { + String response = null; + try { + URL url = new URL(reqUrl); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + // read the response + InputStream in = new BufferedInputStream(conn.getInputStream()); + response = convertStreamToString(in); + } catch (MalformedURLException e) { + Log.e(TAG, "MalformedURLException: " + e.getMessage()); + } catch (ProtocolException e) { + Log.e(TAG, "ProtocolException: " + e.getMessage()); + } catch (IOException e) { + Log.e(TAG, "IOException: " + e.getMessage()); + } catch (Exception e) { + Log.e(TAG, "Exception: " + e.getMessage()); + } + return response; + } + + private String convertStreamToString(InputStream is) { + BufferedReader reader = new BufferedReader(new InputStreamReader(is)); + StringBuilder sb = new StringBuilder(); + + String line; + try { + while ((line = reader.readLine()) != null) { + sb.append(line).append('\n'); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return sb.toString(); + } +} diff --git a/app/src/main/res/layout/activity_state.xml b/app/src/main/res/layout/activity_state.xml new file mode 100644 index 0000000..f08a549 --- /dev/null +++ b/app/src/main/res/layout/activity_state.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:orientation="vertical" + tools:context=".ui.StateActivity"> + + <android.support.design.widget.AppBarLayout + android:id="@+id/appbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingTop="@dimen/appbar_padding_top" + android:theme="@style/DisTheme.AppBarOverlay"> + + <android.support.v7.widget.Toolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + android:layout_weight="1" + android:background="?attr/colorPrimary" + app:layout_scrollFlags="scroll|enterAlways" + app:popupTheme="@style/DisTheme.PopupOverlay" + app:title="@string/app_name"> + + </android.support.v7.widget.Toolbar> + </android.support.design.widget.AppBarLayout> + <ListView + android:id="@+id/list" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="#203140"/> + +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/list_item.xml b/app/src/main/res/layout/list_item.xml new file mode 100644 index 0000000..31c1078 --- /dev/null +++ b/app/src/main/res/layout/list_item.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="@dimen/activity_horizontal_margin"> + + <TextView + android:id="@+id/name" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:paddingBottom="2dip" + android:paddingTop="6dip" + android:textColor="@color/bg_primary_blue_dark" + android:textSize="16sp" + android:textStyle="bold" /> + + <TextView + android:id="@+id/description" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:paddingBottom="2dip" + android:textColor="#ffffff" /> + + <TextView + android:id="@+id/updated_at" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:paddingBottom="2dip" + android:textColor="#ffffff"/> + + <TextView + android:id="@+id/status_name" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="#49e13f" + android:textStyle="bold" /> +</LinearLayout> diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 561ed82..4b8167d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -135,5 +135,6 @@ <string name="MailDialog">Para continuar, primero necesitas instalar K9-Mail.\nPor favor, selecciona Instalar para continuar desde F-Droid.</string> <string name="CloudDialog">Para continuar, primero necesitas instalar la app de Nextcloud.\nPor favor, selecciona Instalar para continuar desde F-Droid.</string> <string name="ChatDialog">Para continuar, primero necesitas instalar Conversations.\nPor favor, selecciona Instalar para continuar desde F-Droid.</string> + <string name="app_state">Disroot state</string> </resources> diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 6ed74d7..4f1a5b6 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -164,5 +164,6 @@ <string name="MailDialog">Pour continuer, vous devez d\'abord installer K9-Mail.\nVeuillez sélectionner Installer pour continuer l\'installation avec F-Droid.</string> <string name="CloudDialog">Pour continuer, vous devez d\'abord installer l\'application Nextcloud.\nVeuillez sélectionner Installer pour continuer l\'installation avec F-Droid.</string> <string name="ChatDialog">Pour continuer, vous devez d\'abord installer Conversations.\nVeuillez sélectionner Installer pour continuer l\'installation avec F-Droid.</string> + <string name="app_state">Disroot state</string> </resources> diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 85cec92..d786ea6 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -134,5 +134,6 @@ <string name="MailDialog">Per continuare è necessario installare K9-Mail.\nSelezionate installa per continuare con l\'installazione su F-Droid.</string> <string name="CloudDialog">Per continuare è necessario installare la app di Nextcloud.\nSelezionate installa per continuare con l\'installazione su F-Droid.</string> <string name="ChatDialog">Per continuare è necessario installare Conversations.\nSelezionate installa per continuare con l\'installazione su F-Droid.</string> + <string name="app_state">Disroot state</string> </resources> diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 254bb80..23e36a9 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -135,5 +135,6 @@ <string name="MailDialog">Om verder te gaan moet u eerst K9-Mail installeren.\nSelecteer Installeren om verder te gaan met de installatie op F-Droid.</string> <string name="CloudDialog">Om verder te gaan moet u eerst Nextcloud app installeren.\nSelecteer Installeren om verder te gaan met de installatie op F-Droid.</string> <string name="ChatDialog">Om verder te gaan moet u eerst Conversations installeren.\nSelecteer Installeren om verder te gaan met de installatie op F-Droid.</string> + <string name="app_state">Disroot state</string> </resources> diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 2e85bf3..6636e99 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -134,5 +134,6 @@ <string name="MailDialog">To continue you need to install K9-Mail first.\nPlease select install to continue with the installatin on F-Droid.</string> <string name="CloudDialog">To continue you need to install the Nextcloud app first.\nPlease select install to continue with the installatin on F-Droid.</string> <string name="ChatDialog">To continue you need to install Conversations first.\nPlease select install to continue with the installatin on F-Droid.</string> + <string name="app_state">Disroot state</string> </resources> diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 8e39f3a..6703ec5 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -135,5 +135,6 @@ <string name="MailDialog">To continue you need to install K9-Mail first.\nPlease select install to continue with the installatin on F-Droid.</string> <string name="CloudDialog">To continue you need to install the Nextcloud app first.\nPlease select install to continue with the installatin on F-Droid.</string> <string name="ChatDialog">To continue you need to install Conversations first.\nPlease select install to continue with the installatin on F-Droid.</string> + <string name="app_state">Disroot state</string> </resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3f4cb0d..64c41e4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -44,7 +44,7 @@ <string name="licenseTitle">License</string> <string name="license_button">GNU LGPLv3.0 License</string> - <string translatable="false" name="licenseText">Copyright © 2007 Free Software Foundation, Inc.\n + <string name="licenseText" translatable="false">Copyright © 2007 Free Software Foundation, Inc.\n This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, version 3 of the License only.\n\n This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. </string> @@ -134,5 +134,7 @@ <string name="MailDialog">To continue you need to install K9-Mail first.\nPlease select install to continue with the installatin on F-Droid.</string> <string name="CloudDialog">To continue you need to install the Nextcloud app first.\nPlease select install to continue with the installatin on F-Droid.</string> <string name="ChatDialog">To continue you need to install Conversations first.\nPlease select install to continue with the installatin on F-Droid.</string> + <string name="title_activity_state">StateActivity</string> + <string name="app_state">Disroot state</string> </resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 64e14c0..91fa2b0 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -14,19 +14,23 @@ <style name="Widget.MyApp.ActionBar" parent="Widget.AppCompat.ActionBar"> <item name="theme">@style/ThemeOverlay.MyApp.ActionBar</item> - <item name="popupTheme">@style/ThemeOverlay.AppCompat.Dark</item> <!--change theme for actionbar poupmenu--> + <item name="popupTheme">@style/ThemeOverlay.AppCompat.Dark + </item> <!--change theme for actionbar poupmenu--> </style> <style name="ThemeOverlay.MyApp.ActionBar" parent="ThemeOverlay.AppCompat.Dark.ActionBar"> <item name="android:textColorPrimary">@android:color/white</item> - <item name="android:actionMenuTextColor">@android:color/white</item><!--<item name="android:textSize">18sp</item>--> + <item name="android:actionMenuTextColor">@android:color/white + </item><!--<item name="android:textSize">18sp</item>--> </style> <style name="DisTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> <style name="DisTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> + <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> - <!-- Customize your theme here. --> - <item name="cardViewStyle">@style/CardView</item></style> + <!-- Customize your theme here. --> + <item name="cardViewStyle">@style/CardView</item> + </style> </resources> -- GitLab